content: -- Changes to this template should be reflected in the 'Creating Your Project 
  -- in Drasil' tutorial found on the wiki:
  -- https://github.com/JacquesCarette/Drasil/wiki/Creating-Your-Project-in-Drasil
  -- This comment can be removed after copying this template to build your own example.
  
  module Drasil.Template.Body where
  
  import Drasil.System (SystemKind(Specification), mkSystem)
  import Drasil.Metadata
  import Language.Drasil
  import Drasil.SRSDocument
  import Drasil.Generator (cdb)
  import Theory.Drasil (DataDefinition, GenDefn, InstanceModel, TheoryModel)
  import qualified Language.Drasil.Sentence.Combinators as S
  
  import qualified Drasil.DocLang.SRS as SRS
  import Data.Drasil.Citations
  import Drasil.DocumentLanguage.TraceabilityGraph
  import Drasil.DocLang (tunitNone)
  
  srs :: Document
  srs = mkDoc mkSRS (S.forGen titleize phrase) si
  
  fullSI :: System
  fullSI = fillcdbSRS mkSRS si
  
  printSetting :: PrintingInformation
  printSetting = piSys fullSI Equational defaultConfiguration
  
  mkSRS :: SRSDecl
  mkSRS = [TableOfContents,
    RefSec $      --This creates the Reference section of the SRS
    RefProg intro      -- This add the introduction blob to the reference section  
      [ tunitNone []      -- Adds table of unit section with a table frame
      , tsymb [] -- Adds table of symbol section with a table frame
      --introductory blob (TSPurpose), TypogConvention, bolds vector parameters (Vector Bold), orders the symbol, and adds units to symbols 
      ],
    IntroSec $
    IntroProg EmptyS (phrase progName)
      [ IPurpose $ purpDoc progName Verbose,
        IScope EmptyS,
        IChar [] [] [],
        IOrgSec inModel (SRS.inModel [] []) EmptyS
      ],
    GSDSec $
      GSDProg
        [ SysCntxt [],
          UsrChars [],
          SystCons [] []
          ],
    SSDSec $
      SSDProg
        [ SSDProblem $ PDProg EmptyS []                --  This adds a is used to define the problem your system will solve
        [ TermsAndDefs Nothing ([] :: [ConceptChunk])   -- This is used to define the terms to be defined in terminology sub section
        , PhySysDesc progName [] figTemp [] -- This defines the Physicalsystem sub-section, define the parts
                                                            -- of the system using physSysParts, figMotion is a function in figures for the image
        , Goals []
        ] -- This adds a goals section and goals input is defined for the preample of the goal.
        , SSDSolChSpec $ SCSProg
          [ Assumptions
          , TMs [] []
          , GDs [] [] HideDerivation
          , DDs [] [] HideDerivation
          , IMs [] [] HideDerivation
          , Constraints EmptyS ([] :: [UncertQ])
          , CorrSolnPpties ([] :: [UncertQ]) []
  
          ]
        ],
    ReqrmntSec $ ReqsProg
      [
         FReqsSub EmptyS []
       , NonFReqsSub
      ],
    LCsSec,
    UCsSec,
    TraceabilitySec $ TraceabilityProg $ traceMatStandard si,
    AuxConstntSec $
       AuxConsProg progName [],
    Bibliography]
  
  si :: System
  si = mkSystem
    progName Specification [authorName]
    [] [] [] []
    ([] :: [DefinedQuantityDict])
    ([] :: [TheoryModel]) ([] :: [GenDefn]) ([] :: [DataDefinition]) ([] :: [InstanceModel])
    []
    ([] :: [DefinedQuantityDict]) ([] :: [DefinedQuantityDict]) ([] :: [ConstrConcept]) ([] :: [ConstQDef])
    symbMap
  
  ideaDicts :: [IdeaDict]
  ideaDicts =
    -- CIs
    [nw progName]
  
  conceptChunks :: [ConceptChunk]
  conceptChunks = [] :: [ConceptChunk]
  
  symbMap :: ChunkDB
  symbMap = cdb ([] :: [DefinedQuantityDict]) ideaDicts conceptChunks
    ([] :: [UnitDefn]) ([] :: [DataDefinition]) ([] :: [InstanceModel])
    ([] :: [GenDefn]) ([] :: [TheoryModel]) ([] :: [ConceptInstance])
    ([] :: [LabelledContent]) ([] :: [Reference]) citations
  
  citations :: BibRef
  citations = [parnasClements1986, koothoor2013, smithEtAl2007, smithLai2005,
               smithKoothoor2016]
  
  inConstraints :: [UncertQ]
  inConstraints = []
  
  outConstraints :: [UncertQ]
  outConstraints = []
  
  figTemp :: LabelledContent
  figTemp = llcc (makeFigRef "dblpend") $ figWithWidth EmptyS
    (resourcePath ++ "dblpend.png") 60
  
  
  -- MOVE TO CONCEPTS
  progName :: CI
  progName = commonIdeaWithDict "progName" (pn "ProgName") "ProgName" []
  
  -- MOVE TO DATA.PEOPLE
  authorName :: Person
  authorName = person "Author" "Name"
  