module Development.Shake.MinifyCSS ( -- * Rules
                                     minifyCSSRules
                                   , minifyCSSRulesWith
                                   -- * Actions
                                   , minifyCSSAction
                                   , minifyCSSActionWith
                                   ) where

import qualified Data.Text.IO      as TIO
import           Development.Shake
import           Hasmin
import           System.Directory  (createDirectoryIfMissing)
import           System.FilePath   (takeDirectory)

minifyCSSRules :: FilePath -- ^ Source file
               -> FilePath -- ^ Destination/target
               -> Rules ()
minifyCSSRules =
    minifyCSSRulesWith defaultConfig

minifyCSSRulesWith :: Config
                   -> FilePath -- ^ Source file
                   -> FilePath -- ^ Destination/target
                   -> Rules ()
minifyCSSRulesWith cfg src tgt =
    tgt %> \out ->
        minifyCSSActionWith cfg src out

minifyCSSAction :: FilePath -- ^ Source file
                -> FilePath -- ^ Destination/target
                -> Action ()
minifyCSSAction =
    minifyCSSActionWith defaultConfig

minifyCSSActionWith :: Config
                    -> FilePath -- ^ Source file
                    -> FilePath -- ^ Destination/target
                    -> Action ()
minifyCSSActionWith cfg src tgt = do
    need [src]
    let tgtDir = takeDirectory tgt
    traced ("Create directory (" ++ tgtDir ++ ")") $
        createDirectoryIfMissing True tgtDir
    traced ("Minify CSS (" ++ tgt ++ ")") $ do
        contents <- TIO.readFile src
        case minifyCSSWith cfg contents of
            Right x -> TIO.writeFile tgt x
            Left y  -> error y