{-# LANGUAGE OverloadedStrings #-}

{-|
Description: Digests a subject into a textual representation.

This module defines a digester which justs takes the directory and
transforms it into a text with a minimal format.
-}
module Follow.Digesters.SimpleText
  ( digest
  ) where

import           Data.Maybe   (fromMaybe)
import           Data.Text    (Text)
import qualified Data.Text    as T (concat, intercalate, pack, replicate)
import           Follow.Types (Digester, Directory (..), Entry (..),
                               Subject (..))

-- | The digester strategy to transform a directory into a simple text
-- representation.
digest :: Digester Text
digest directory =
  let header = dSubject directory
      headerTitle = sTitle header
      headerDescription = sDescription header
      headerTags = sTags header
      entries = dEntries directory
   in T.intercalate
        emptyLine
        [ headerTitle
        , headerDescription
        , T.intercalate "," headerTags
        , headerSeparator
        , digestEntries entries
        ]
  where
    headerSeparator :: Text
    headerSeparator = T.replicate 80 "#"

digestEntries :: [Entry] -> Text
digestEntries entries = T.intercalate entrySeparator $ map digestEntry entries
  where
    entrySeparator :: Text
    entrySeparator = T.concat ["\n", T.replicate 80 "-", "\n"]
    digestEntryItem :: Maybe Text -> Text
    digestEntryItem = fromMaybe ""
    digestEntry :: Entry -> Text
    digestEntry entry =
      let entryURI = eURI entry
          entryTitle = eTitle entry
          entryDescription = eDescription entry
          entryAuthor = eAuthor entry
          entryPublishDate = ePublishDate entry
       in T.intercalate
            emptyLine
            (digestEntryItem <$>
             [ entryURI
             , entryTitle
             , T.pack . show <$> entryPublishDate
             , entryDescription
             , entryAuthor
             ])

emptyLine :: Text
emptyLine = "\n\n\n"