{-# LANGUAGE OverloadedStrings #-}

module Hscaffold.Interpreter.Hsfiles where

import           Control.Monad.Writer
import           Data.Text                    (Text)
import qualified Data.Text                    as Text
import qualified Data.Text.IO                 as Text

import           Hscaffold.Interpreter.Common
import           Hscaffold.Types

-- | Run the scaffolding writer and return an @.hsfiles@ 'Text' to use with
-- @stack-templates@
toHsfiles :: Writer ScaffoldActionV a -> Text
toHsfiles w = let (_, ws) = runWriter w
              in
                  Text.stripEnd $
                      Text.unlines $
                          concatMap (actionToHsfile ".") ws

-- | Convert a single scaffolding action to hsfiles
--
-- Ignores everything but the 'file' directives
actionToHsfile :: FilePath -> ScaffoldActionType e -> [Text]
actionToHsfile root a = case a of
    (File fp txt) -> [ "{-# START_FILE " <> Text.pack (mkActionPath root fp) <>
                         " #-}"
                     ] <>
        Text.lines txt
    (Directory fp nested) ->
        concatMap (actionToHsfile (mkActionPath root fp)) nested
    _ -> []

-- | Shortcut for
--
-- @
-- writeToHsfiles = do h <- toHsfiles w; liftIO $ Text.writeFile fp h
-- @
writeToHsfiles :: MonadIO m => FilePath -> Writer ScaffoldActionV a -> m ()
writeToHsfiles fp w = do
    let h = toHsfiles w
    liftIO $ Text.writeFile fp h