module Language.Drasil.Code.Imperative.GOOL.LanguageRenderer.LanguagePolymorphic (
  -- * Common Syntax
  doxConfig, readMe, makefile, noRunIfLib, doxDocConfig,
  docIfEnabled
) where

import Text.PrettyPrint.HughesPJ (Doc)

import Drasil.FileHandling (FileLayout)
import Drasil.GOOL (ProgData)

import Language.Drasil.Choices (Comments, ImplementationType(..), Verbosity)
import Language.Drasil.Code.Imperative.Doxygen.Import (makeDoxConfig)
import Language.Drasil.Code.Imperative.Build.AST (BuildConfig, Runnable,
  DocConfig, doxygenDocConfig)
import Language.Drasil.Code.Imperative.Build.Import (buildMakefile)
import Language.Drasil.SoftwareDossier.FileNames (doxConfigName, makefileName,
  readMeName)
import Language.Drasil.SoftwareDossier.SoftwareDossierSym (
    SoftwareDossierSym(unReprDoc), sdsFromData, SoftwareDossierState)
import Language.Drasil.Code.Imperative.README (ReadMeInfo(..), makeReadMe)

-- | Defines a Doxygen configuration file.
doxConfig :: (SoftwareDossierSym r, Applicative r) => r Doc -> String ->
  SoftwareDossierState -> Verbosity -> r FileLayout
doxConfig :: forall (r :: * -> *).
(SoftwareDossierSym r, Applicative r) =>
r Doc
-> String -> SoftwareDossierState -> Verbosity -> r FileLayout
doxConfig r Doc
opt String
pName SoftwareDossierState
s Verbosity
v = String -> Doc -> r FileLayout
forall (r :: * -> *).
Applicative r =>
String -> Doc -> r FileLayout
sdsFromData String
doxConfigName (String -> SoftwareDossierState -> Doc -> Verbosity -> Doc
makeDoxConfig String
pName SoftwareDossierState
s
  (r Doc -> Doc
forall (r :: * -> *). SoftwareDossierSym r => r Doc -> Doc
unReprDoc r Doc
opt) Verbosity
v)

-- | Defines a markdown file.
readMe :: (Applicative r) => ReadMeInfo -> r FileLayout
readMe :: forall (r :: * -> *). Applicative r => ReadMeInfo -> r FileLayout
readMe ReadMeInfo
rmi= String -> Doc -> r FileLayout
forall (r :: * -> *).
Applicative r =>
String -> Doc -> r FileLayout
sdsFromData String
readMeName (ReadMeInfo -> Doc
makeReadMe ReadMeInfo
rmi)

-- | Defines a Makefile.
makefile :: (Applicative r) => Maybe BuildConfig -> Maybe Runnable ->
  Maybe DocConfig -> SoftwareDossierState -> ProgData -> r FileLayout
makefile :: forall (r :: * -> *).
Applicative r =>
Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> SoftwareDossierState
-> ProgData
-> r FileLayout
makefile Maybe BuildConfig
bc Maybe Runnable
r Maybe DocConfig
d SoftwareDossierState
s ProgData
p = String -> Doc -> r FileLayout
forall (r :: * -> *).
Applicative r =>
String -> Doc -> r FileLayout
sdsFromData String
makefileName (Maybe DocConfig
-> Maybe BuildConfig
-> Maybe Runnable
-> SoftwareDossierState
-> ProgData
-> Doc
buildMakefile Maybe DocConfig
d Maybe BuildConfig
bc Maybe Runnable
r SoftwareDossierState
s ProgData
p)

-- | Changes a 'Runnable' to 'Nothing' if the user chose 'Library' for the 'ImplementationType'.
noRunIfLib :: ImplementationType -> Maybe Runnable -> Maybe Runnable
noRunIfLib :: ImplementationType -> Maybe Runnable -> Maybe Runnable
noRunIfLib ImplementationType
Library Maybe Runnable
_ = Maybe Runnable
forall a. Maybe a
Nothing
noRunIfLib ImplementationType
Program Maybe Runnable
r = Maybe Runnable
r

-- | A DocConfig for Doxygen documentation.
doxDocConfig :: DocConfig
doxDocConfig :: DocConfig
doxDocConfig = String -> DocConfig
doxygenDocConfig String
doxConfigName

-- | Returns Nothing if no comments are enabled.
docIfEnabled :: [Comments] -> DocConfig -> Maybe DocConfig
docIfEnabled :: [Comments] -> DocConfig -> Maybe DocConfig
docIfEnabled [] DocConfig
_ = Maybe DocConfig
forall a. Maybe a
Nothing
docIfEnabled [Comments]
_ DocConfig
d = DocConfig -> Maybe DocConfig
forall a. a -> Maybe a
Just DocConfig
d