{-# LANGUAGE OverloadedStrings #-} module View.Plain.Ad ( renderConsoleAds , renderAds ) where import Data.List (intersperse) import Data.Maybe (fromMaybe, catMaybes) import Data.Map (Map) import qualified Data.Map as M import Data.Text (Text) import qualified Data.Text as T import Model.Ad (Ad) import qualified Model.Ad as Ad import Model.Resume (Resume) import qualified Model.Resume as Resume import Model.Detail (Detail) import qualified Model.Detail as Detail import Model.URL import Model.Config renderConsoleAds :: Config -> Text -> [Ad] -> Text renderConsoleAds config time ads = let (title, message) = renderAds config ads titleWithTime = T.concat [ "\n[" , time , "] " , title ] line = T.map (\_ -> '-') titleWithTime in T.intercalate "\n" [ titleWithTime , line , "" , message ] renderAds :: Config -> [Ad] -> (Text, Text) renderAds config ads = let titleMessage = renderTitle $ length ads adsMessage = T.intercalate "\n\n" . map (renderAd config) $ ads in (titleMessage, adsMessage) renderTitle :: Int -> Text renderTitle count = T.concat [ T.pack . show $ count , agreement " nouvelle" , agreement " annonce" ] where agreement word = T.concat [ word , if count > 1 then "s" else "" ] renderAd :: Config -> Ad -> Text renderAd config ad = T.concat [ renderResume (Ad.resume ad) , "\n" , renderDetail config (Ad.detail ad) ] renderResume :: Resume -> Text renderResume resume = let formatPrice price = T.concat [" - ", price] price = fromMaybe "" . fmap formatPrice . Resume.price $ resume titleLine = T.concat [Resume.name resume, price] in T.intercalate "\n" [titleLine, Resume.url resume] renderDetail :: Config -> Detail -> Text renderDetail config detail = T.concat [ renderProperties (properties config) (Detail.properties detail) , fromMaybe "−" (Detail.description detail) , renderURLs "\n\nImages:" (Detail.images detail) ] renderProperties :: [Text] -> Map Text Text -> Text renderProperties [] properties = "" renderProperties keys properties = T.concat [ "\n" , T.concat (catMaybes $ map (renderProperty properties) keys) , "\n" ] renderProperty :: Map Text Text -> Text -> Maybe Text renderProperty properties key = fmap (\value -> T.concat [key, ": ", value, "\n"]) (M.lookup key properties) renderURLs :: Text -> [URL] -> Text renderURLs title [] = "" renderURLs title urls = T.intercalate "\n" (title:urls)