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

import Control.Applicative         ((<$>))
import Clckwrks.Monad              (ClckT, plugins)
import Clckwrks.Authenticate.URL   (AuthURL(..))
import Clckwrks.Authenticate.Page.Login (loginPage)
import Clckwrks.Authenticate.Page.ChangePassword (changePasswordPanel)
import Clckwrks.Authenticate.Page.ResetPassword  (resetPasswordPage)
import Clckwrks.Authenticate.Page.OpenIdRealm    (openIdRealmPanel)
import Clckwrks.URL                (ClckURL)
import Control.Monad.State         (get)
import Control.Monad.Trans         (lift)
import Happstack.Authenticate.Core (AuthenticateURL)
import Happstack.Server            (Response, ServerPartT)
import Web.Routes                  (RouteT, askRouteFn, runRouteT)
import Web.Plugins.Core            (getPluginRouteFn, pluginName)

-- | routeAuth
routeAuth :: (AuthenticateURL -> RouteT AuthenticateURL (ServerPartT IO) Response)
          -> AuthURL
          -> ClckT ClckURL (ServerPartT IO) Response
routeAuth routeAuthenticate u =
  case u of
    (Auth authenticateURL) ->
      do p <- plugins <$> get
         ~(Just authShowFn) <- getPluginRouteFn p "authenticate"
         lift $ runRouteT routeAuthenticate (authShowFn . Auth) authenticateURL
    Login          -> loginPage
    ResetPassword  -> resetPasswordPage
    ChangePassword -> changePasswordPanel
    OpenIdRealm    -> openIdRealmPanel