-----------------------------------------------------------------------------
-- |
-- Module      :  Static.Resources.Generation
-- Copyright   :  (c) Scrive 2012
-- License     :  BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer  :  mariusz@scrive.com
-- Stability   :  development
-- Portability :  portable
--
-- Module for generaing joined js and css files from spec
--


module Static.Resources.Generation (
                                   generateResources
                                   ) where

import Static.Resources.Types
import Data.Hash.MD5
import Data.Time
import Control.Monad
import Data.Functor

generateAgregatedResourceTypeContent :: ResourceType -> ResourceSet -> IO String
generateAgregatedResourceTypeContent rt rs = do
    let files = map path $ filterByType (== rt) rs
    s <- forM files $ \p -> readFile p
    return $ (concat s)

generateAgregatedCSSFile :: ResourceSet -> IO FilePath
generateAgregatedCSSFile rs = do
    t <- show <$> getCurrentTime
    c <- generateAgregatedResourceTypeContent CSS rs
    let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".css"
    writeFile fn c
    return fn 

generateAgregatedJSFile :: ResourceSet -> IO FilePath
generateAgregatedJSFile rs = do
    t <- show <$> getCurrentTime
    c <- generateAgregatedResourceTypeContent JS rs
    let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".js"
    writeFile fn c
    return fn

generateResources ::  ImportType -> ResourceSpec -> IO ResourceSetsForImport
generateResources it spec = ResourceSetsForImport <$> forM (sets spec) (generateResourcesForSet it)


-- | Change 'ResourceSet' to 'ResourceSetForImport'. Will generate files if needed.
generateResourcesForSet ::  ImportType -> ResourceSet -> IO ResourceSetForImport
generateResourcesForSet Development rs =
    return $ ResourceSetForImport {
         set = rs
       , cssFiles = path <$> filterByType (== CSS) rs
       , jsFiles  = path <$> filterByType (\t -> t == JS || t == JSX) rs
     }
generateResourcesForSet Production rs = do
    cssF <- generateAgregatedCSSFile rs
    jsF <- generateAgregatedJSFile rs
    return $ ResourceSetForImport {
         set = rs
       , cssFiles = [cssF]
       , jsFiles  = jsF : (path <$> filterByType (== JSX) rs)
     }