{-# LANGUAGE RecordWildCards #-}
module Clckwrks.ProfileData.Route where

import Clckwrks
import Clckwrks.ProfileData.Acid
import Clckwrks.ProfileData.EditProfileData (editProfileDataPage)
import Clckwrks.ProfileData.EditNewProfileData (editNewProfileDataPage)
import Clckwrks.ProfileData.EditProfileDataFor (editProfileDataForPage)
import Clckwrks.ProfileData.URL   (ProfileDataURL(..))
import Clckwrks.ProfileData.Types
import Control.Monad.State (get)
import Data.Set (singleton)
import Data.Text (Text)

routeProfileData :: ProfileDataURL -> Clck ProfileDataURL Response
routeProfileData url =
    case url of
      CreateNewProfileData ->
          do mUserId <- getUserId
             case mUserId of
               Nothing -> internalServerError $ toResponse $ "not logged in."
               (Just userId) ->
                   do (_, new) <- update (NewProfileData (defaultProfileDataFor userId))
                      if new
                         then seeOtherURL EditNewProfileData
                         else do mRedirect <- query GetLoginRedirect
                                 case mRedirect of
                                   (Just url) -> seeOther url (toResponse ())
                                   Nothing    -> do
                                     mRedirectCookie <- getRedirectCookie
                                     case mRedirectCookie of
                                       (Just u) -> seeOther u (toResponse ())
                                       Nothing  -> seeOtherURL EditProfileData
      EditProfileData ->
             do editProfileDataPage url
      EditNewProfileData ->
             do editNewProfileDataPage url
      EditProfileDataFor u ->
             do editProfileDataForPage url u