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

import Language.Drasil (Expr)

import Database.Drasil (ChunkDB)

import GOOL.Drasil (ProgData, GOOLState)

import Language.Drasil.Choices (Comments, ImplementationType(..), Verbosity)
import Language.Drasil.Code.DataDesc (DataDesc)
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 (makeBuild)
import Language.Drasil.Code.Imperative.WriteInput (makeInputFile)
import Language.Drasil.Code.Imperative.WriteReadMe (makeReadMe)
import Language.Drasil.Code.Imperative.GOOL.LanguageRenderer (doxConfigName, 
  makefileName, sampleInputName, readMeName)

import Language.Drasil.Code.Imperative.GOOL.ClassInterface ( ReadMeInfo(..),
  AuxiliarySym(Auxiliary, AuxHelper, auxHelperDoc, auxFromData))

-- | Defines a Doxygen configuration file.
doxConfig :: (AuxiliarySym r) => r (AuxHelper r) -> String -> 
  GOOLState -> Verbosity -> r (Auxiliary r)
doxConfig :: r (AuxHelper r)
-> String -> GOOLState -> Verbosity -> r (Auxiliary r)
doxConfig opt :: r (AuxHelper r)
opt pName :: String
pName s :: GOOLState
s v :: Verbosity
v = String -> Doc -> r (Auxiliary r)
forall (r :: * -> *).
AuxiliarySym r =>
String -> Doc -> r (Auxiliary r)
auxFromData String
doxConfigName (String -> GOOLState -> Doc -> Verbosity -> Doc
makeDoxConfig String
pName GOOLState
s 
  (r (AuxHelper r) -> Doc
forall (r :: * -> *). AuxiliarySym r => r (AuxHelper r) -> Doc
auxHelperDoc r (AuxHelper r)
opt) Verbosity
v)

-- | Defines a markdown file.
readMe :: (AuxiliarySym r) => ReadMeInfo -> r (Auxiliary r)
readMe :: ReadMeInfo -> r (Auxiliary r)
readMe rmi :: ReadMeInfo
rmi= String -> Doc -> r (Auxiliary r)
forall (r :: * -> *).
AuxiliarySym r =>
String -> Doc -> r (Auxiliary r)
auxFromData String
readMeName (ReadMeInfo -> Doc
makeReadMe ReadMeInfo
rmi)

-- | Defines a sample input file.
sampleInput :: (AuxiliarySym r) => ChunkDB -> DataDesc -> [Expr] -> 
  r (Auxiliary r)
sampleInput :: ChunkDB -> DataDesc -> [Expr] -> r (Auxiliary r)
sampleInput db :: ChunkDB
db d :: DataDesc
d sd :: [Expr]
sd = String -> Doc -> r (Auxiliary r)
forall (r :: * -> *).
AuxiliarySym r =>
String -> Doc -> r (Auxiliary r)
auxFromData String
sampleInputName (ChunkDB -> DataDesc -> [Expr] -> Doc
makeInputFile ChunkDB
db DataDesc
d [Expr]
sd)

-- | Defines a Makefile.
makefile :: (AuxiliarySym r) => Maybe BuildConfig -> Maybe Runnable -> 
  Maybe DocConfig -> GOOLState -> ProgData -> r (Auxiliary r)
makefile :: Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> GOOLState
-> ProgData
-> r (Auxiliary r)
makefile bc :: Maybe BuildConfig
bc r :: Maybe Runnable
r dc :: Maybe DocConfig
dc s :: GOOLState
s p :: ProgData
p = String -> Doc -> r (Auxiliary r)
forall (r :: * -> *).
AuxiliarySym r =>
String -> Doc -> r (Auxiliary r)
auxFromData String
makefileName (Maybe DocConfig
-> Maybe BuildConfig
-> Maybe Runnable
-> GOOLState
-> ProgData
-> Doc
makeBuild Maybe DocConfig
dc Maybe BuildConfig
bc Maybe Runnable
r GOOLState
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 Library _ = Maybe Runnable
forall a. Maybe a
Nothing
noRunIfLib Program r :: 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 [] _ = Maybe DocConfig
forall a. Maybe a
Nothing
docIfEnabled _ d :: DocConfig
d = DocConfig -> Maybe DocConfig
forall a. a -> Maybe a
Just DocConfig
d