module Rules.Blog.Utils (
    appendFooter
) where

import           Control.Monad.Except (MonadError (..))
import           Data.Binary          (Binary)
import           Data.Time.Format     (TimeLocale, formatTime)
import           Data.Time.LocalTime  (TimeZone, utcToLocalTime)
import           Data.Typeable        (Typeable)
import           Hakyll

appendFooter :: (Binary a, Typeable a, Semigroup a)
    => String
    -> TimeLocale
    -> TimeZone
    -> Item a
    -> Compiler (Item a)
appendFooter :: forall a.
(Binary a, Typeable a, Semigroup a) =>
String -> TimeLocale -> TimeZone -> Item a -> Compiler (Item a)
appendFooter String
blogName TimeLocale
locale TimeZone
zone Item a
item = do
    Maybe UTCTime
utc <- (UTCTime -> Maybe UTCTime)
-> Compiler UTCTime -> Compiler (Maybe UTCTime)
forall a b. (a -> b) -> Compiler a -> Compiler b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap UTCTime -> Maybe UTCTime
forall a. a -> Maybe a
Just (TimeLocale -> Identifier -> Compiler UTCTime
forall (m :: * -> *).
(MonadMetadata m, MonadFail m) =>
TimeLocale -> Identifier -> m UTCTime
getItemUTC TimeLocale
locale (Item a -> Identifier
forall a. Item a -> Identifier
itemIdentifier Item a
item))
        Compiler (Maybe UTCTime)
-> ([String] -> Compiler (Maybe UTCTime))
-> Compiler (Maybe UTCTime)
forall a. Compiler a -> ([String] -> Compiler a) -> Compiler a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` Compiler (Maybe UTCTime) -> [String] -> Compiler (Maybe UTCTime)
forall a b. a -> b -> a
const (Maybe UTCTime -> Compiler (Maybe UTCTime)
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe UTCTime
forall a. Maybe a
Nothing)
    Maybe String -> Item a -> Compiler (Item a)
forall {b}.
(Binary b, Typeable b, Semigroup b) =>
Maybe String -> Item b -> Compiler (Item b)
appendFooterWith ((UTCTime -> String) -> Maybe UTCTime -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (TimeLocale -> String -> LocalTime -> String
forall t. FormatTime t => TimeLocale -> String -> t -> String
formatTime TimeLocale
locale String
"%Y" (LocalTime -> String)
-> (UTCTime -> LocalTime) -> UTCTime -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeZone -> UTCTime -> LocalTime
utcToLocalTime TimeZone
zone) Maybe UTCTime
utc) Item a
item
    where
        appendFooterWith :: Maybe String -> Item b -> Compiler (Item b)
appendFooterWith Maybe String
y Item b
item' = do
            b
footer <- Identifier -> Compiler b
forall a. (Binary a, Typeable a) => Identifier -> Compiler a
loadBody (Identifier -> Compiler b) -> Identifier -> Compiler b
forall a b. (a -> b) -> a -> b
$ Maybe String -> Identifier -> Identifier
setVersion Maybe String
y (Identifier -> Identifier) -> Identifier -> Identifier
forall a b. (a -> b) -> a -> b
$ String -> Identifier
fromFilePath (String
blogName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"-footer.html")
            (b -> Compiler b) -> Item b -> Compiler (Item b)
forall a b. (a -> Compiler b) -> Item a -> Compiler (Item b)
withItemBody (b -> Compiler b
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> Compiler b) -> (b -> b) -> b -> Compiler b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> b -> b
forall a. Semigroup a => a -> a -> a
<> b
footer)) Item b
item'