{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}

module Templates where

import           Data.Monoid ((<>))
import qualified Data.Text as T
import           Lens.Family

import Types

cabalHeader :: ProjectDetails -> T.Text
cabalHeader pr = T.unlines
  [ "name: " <> pr^.projectName
  , "version: 0.1.0.0"
  , case pr^.projectSynopsis of
      Just s -> "synopsis: " <> s
      Nothing -> "-- synopsis:"
  , case pr^.projectDescription of
      Just s -> "description: " <> s
      Nothing -> "-- description:"
  , case pr^.projectLicense of
      Nothing -> "license: BSD3"
      Just l  -> "license: " <> l
  , "author: " <> pr^.projectAuthor <> " <" <> pr^.projectEmail <> ">"
  , "maintainer: " <> pr^.projectAuthor <> " <" <> pr^.projectEmail <> ">"
  , "copyright: @" <> pr^.projectYear <> " " <> pr^.projectAuthor
  , case pr^.projectCategory of
      Just c  -> "category: " <> c
      Nothing -> "-- category:"
  , "build-type: Simple"
  , "cabal-version: >=1.14"
  ]

cabalLibrary :: LibraryDetails -> T.Text
cabalLibrary lib = T.unlines $
  [ "library"
  , "  hs-source-dirs: src"
  , "  ghc-options: -Wall"
  , "  build-depends: base >=4.7 && <5"
  , "  default-language: Haskell2010"
  , "  default-extensions: ScopedTypeVariables"
  ] <> mods
  where
    mods = case lib^.libMods of
             []     -> []
             (x:xs) ->
               ("  exposed-modules: " <> x) :
               ["                 , " <> m | m <- xs ]

cabalExecutable :: ExecutableDetails -> T.Text
cabalExecutable exe = T.unlines $
  [ "executable " <> exe^.execName
  , "  hs-source-dirs: " <> exe^.execDir
  , "  main-is: Main.hs"
  , "  default-language: Haskell2010"
  , "  default-extensions: ScopedTypeVariables"
  , "  ghc-options: -Wall"
  ] <> deps
  where
    baseDep = "  build-depends: base >=4.7 && <5"
    deps =
      baseDep : [ "               , " <> m
                | m <- exe^.execDeps
                ]

defaultBin :: T.Text
defaultBin = T.unlines $
  [ "module Main where"
  , ""
  , "main :: IO ()"
  , "main = return ()"
  ]

defaultLib :: T.Text -> T.Text
defaultLib mod = T.unlines $
  [ "module " <> mod
  , "("
  , ") where"
  ]

defaultTest :: T.Text -> T.Text
defaultTest mod = T.unlines $
  [ "module " <> mod <> "(main) where" ]

defaultGitignore :: T.Text
defaultGitignore = T.unlines
  [ "dist"
  , "dist-*"
  , "*~"
  , "cabal-dev"
  , "*.o"
  , "*.hi"
  , "*.chi"
  , "*.chs.h"
  , "*.dyn_o"
  , "*.dyn_hi"
  , ".hpc"
  , ".hsenv"
  , ".cabal-sandbox/"
  , "cabal.sandbox.config"
  , "*.prof"
  , "*.aux"
  , "*.hp"
  , "*.eventlog"
  , "cabal.project.local"
  , ".ghc.environment.*"
  ]
