{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE NamedFieldPuns #-}

module Bamboo.Controller.Tag where

import Bamboo.Controller.Env
import qualified Bamboo.Model.Tag as Tag
import qualified Bamboo.Type as T
import qualified Bamboo.Type.State as S
import qualified Data.Map as Map

tag :: Controller
tag = do
  init_state
  s <- get
  
  let uid      = s.env.uri
      tag_name = Tag.get_name uid
  
  case Tag.tag_map' (s.tags) .Map.lookup tag_name of
    Nothing -> not_found
    Just post_set -> do
      posts' <-
        post_set
          .to_list
          .rsort
          .mapM (to_us > T.get > io)
          >>= mapM (init_post_meta_data)
        
      (posts, pager) <- posts'.paged
      put s
        { uid
        , pager
        , posts
        , S.resource_title = tag_name.Tag.resource_title_from_name       
        }

tag_feed :: Controller
tag_feed = do
  init_state
  s <- get
  
  let uid      = s.env.uri.split "/" .init .join "/"
      tag_name = Tag.get_name uid

  case Tag.tag_map' (s.tags) .Map.lookup tag_name of
    Nothing -> not_found
    Just post_set -> do
      posts <- 
        post_set
          .to_list
          .rsort
          .take (s.config.number_of_latest_posts)
          .mapM (to_us > T.get >io)
          ^ map (Tag.fill_tag (s.tags))
          
      put s
        { uid
        , posts
        , S.tag_name = tag_name
        }