module Ivory.Artifact.Template
  ( artifactCabalFileTemplate
  , artifactCabalFileTemplate'
  ) where

import Ivory.Artifact
import Text.StringTemplate
import System.FilePath

artifactCabalFileTemplate :: IO FilePath -> FilePath -> [(String, String)]
                          -> Artifact
artifactCabalFileTemplate datadir templatepath attrs =
  artifactCabalFileTemplate' datadir templatepath outputpath attrs
  where
  templatename = takeFileName templatepath
  outputpath = case splitExtension templatename of
    (a, ext) | ext == ".template" -> a
    _ -> templatename

artifactCabalFileTemplate' :: IO FilePath -> FilePath -> FilePath -> [(String, String)]
                          -> Artifact
artifactCabalFileTemplate' datadir templatepath outputpath attrs =
  artifactTransformErrString applyconf af
  where
  af = artifactFile outputpath (fmap (\f -> f </> templatepath) datadir)
  templatename = takeFileName templatepath

  applyconf s =
    let t  = newSTMP s :: StringTemplate String
        t' = setManyAttrib attrs t
    in case checkTemplate t' of
      (Just e, _, _) -> Left (parseErr e)
      (_, Just e, _) -> Left (missingAttrErr e)
      (_, _, Just e) -> Left (missingTemplate e)
      (_, _, _) -> Right (toString t')
  prefix = "Error in " ++ templatename ++ ": "
  parseErr e = prefix ++ "Failed to parse: \n" ++ e
  missingAttrErr es =  prefix ++ "The following attributes are missing:\n"
                    ++ unlines es
  missingTemplate es =  prefix ++ "Failed to lookup invoked templates: \n"
                     ++ unlines es