{-# LANGUAGE NamedFieldPuns #-}
module Hi
  (
    run
  ) where

import           Hi.Context          (context)
import           Hi.FilePath         (rewritePath)
import           Hi.Template         (readTemplates)
import           Hi.Types

import           Control.Applicative
import           Data.List           (isSuffixOf)
import qualified Data.Text           as T
import qualified Data.Text.Lazy      as LT
import           Data.Text.Template  (substitute)
import           System.Directory    (createDirectoryIfMissing)
import           System.FilePath     (dropFileName)

writeFiles :: Files -> IO ()
writeFiles = mapM_ (uncurry write)
  where
    write :: FilePath -> String -> IO ()
    write path content = do
      createDirectoryIfMissing True $ dropFileName path
      writeFile path content

process :: InitFlags -> Files -> Files
process initFlags files = map go $ filter isTemplate files
  where
    isTemplate (path,_) = ".template" `isSuffixOf` path
    go (path, content)  = (rewritePath initFlags path, substitute' content)
    substitute' t       = LT.unpack $ substitute (T.pack t) (context initFlags)

showFileList :: Files -> IO Files
showFileList files = do
    mapM_ (showFile . fst) files
    return files
  where
    showFile :: FilePath -> IO ()
    showFile path = putStrLn $ "    " ++ green "create" ++ "  " ++ path

green :: String -> String
green x = "\x1b[32m" ++ x ++ "\x1b[0m"

run :: InitFlags -> IO ()
run initFlags@(InitFlags {repository}) = do
    putStrLn $ "Creating new project from repository: " ++ repository
    writeFiles =<< showFileList =<< process initFlags <$> readTemplates repository