{-# LANGUAGE OverloadedStrings #-}
module Clckwrks.Redirect.Route where

import Clckwrks                     (Role(..), requiresRole_)
import Clckwrks.Monad               ( ClckState(plugins), query
                                    , update, setUnique, themeTemplate, nestURL
                                    )
--import Clckwrks.Page.Types          (Page(..), PageId(..), toSlug)
--import Clckwrks.Page.Acid           (GetPageTitle(..), IsPublishedPage(..), PageById(..))
-- import Clckwrks.Page.Admin.EditFeedConfig (editFeedConfig)
--- import Clckwrks.Page.Admin.EditPage (editPage)
--import Clckwrks.Page.Admin.NewPage  (newPage)
--import Clckwrks.Page.Admin.Pages    (pages)
--import Clckwrks.Page.Admin.PreviewPage (previewPage)
--import Clckwrks.Page.Atom           (handleAtomFeed)
import Clckwrks.Redirect.Monad          (RedirectConfig(redirectClckURL), RedirectM, clckT2RedirectT)
--import Clckwrks.Page.Types          (PageKind(PlainPage, Post))
-- import Clckwrks.Page.BlogPage       (blog)
import Clckwrks.Redirect.URL            (RedirectURL(..), RedirectAdminURL(..))
import Control.Applicative          ((<$>))
import Control.Monad.Reader         (ask)
import Control.Monad.State          (get)
import Data.Text                    (Text)
import qualified Data.Set           as Set
import Happstack.Server             ( Response, Happstack, escape, notFound, toResponse
                                    , ok, internalServerError
                                    )
import HSP.XMLGenerator             (unXMLGenT)
import Web.Routes.Happstack         (seeOtherURL)
import Web.Plugins.Core             (getTheme)
{-
checkAuth :: RedirectURL
          -> RedirectM RedirectURL
checkAuth url =
    do showFn <- pageClckURL <$> ask
       let requiresRole = requiresRole_ showFn
       case url of
         
         ViewPage{}     -> return url
         ViewPageSlug{} -> return url
         Blog{}         -> return url
         AtomFeed{}     -> return url
         PageAdmin {}   -> requiresRole (Set.singleton Administrator) url

-- | routes for 'AdminURL'
routePageAdmin :: PageAdminURL -> PageM Response
routePageAdmin url =
    case url of
      (EditPage pid)    -> editPage (PageAdmin url) pid
      NewPage           -> newPage PlainPage
      NewPost           -> newPage Post
      (PreviewPage pid) -> previewPage pid -- FIXME
      EditFeedConfig    -> editFeedConfig (PageAdmin url)
      Pages             -> pages
-}
routeRedirect :: RedirectURL
          -> RedirectM Response
routeRedirect url' = ok $ toResponse ("foo" :: String)
{-
    do url <- checkAuth url'
       setUnique 0
       case url of
         (ViewPage pid) ->
           do r <- query (GetPageTitle pid)
              case r of
                Nothing ->
                    notFound $ toResponse ("Invalid PageId " ++ show (unPageId pid))
                (Just (title, slug)) ->
                    seeOtherURL (ViewPageSlug pid (toSlug title slug))

         (ViewPageSlug pid _slug) ->
           do published <- query (IsPublishedPage pid)
              if published
                 then do cs <- get
                         (Just page) <- query (PageById pid)
                         let ttl = pageTitle page
                         bdy <- markupToContent (pageSrc page)
                         clckT2PageT $ themeTemplate (plugins cs) (pageThemeStyleId page) ttl () bdy
                 else do notFound $ toResponse ("Invalid PageId " ++ show (unPageId pid))

         (Blog) -> blog

         AtomFeed ->
             do handleAtomFeed

         (PageAdmin adminURL) -> routePageAdmin adminURL
-}