module Clckwrks.Media.Route where

import Control.Applicative           ((<$>))
import Control.Monad.Reader          (ask)
import Clckwrks                      (Clck, Role(..), requiresRole_)
import Clckwrks.Media.Monad          (MediaM, MediaConfig(..))
import Clckwrks.Media.URL            (MediaURL(..), MediaAdminURL(..))
import Clckwrks.Media.Page.AllMedia  (allMedia)
import Clckwrks.Media.Page.GetMedium (getMedium)
import Clckwrks.Media.Page.Preview   (previewMedium)
import Clckwrks.Media.Page.Upload    (uploadMedium)
import qualified Data.Set            as Set
import Happstack.Server              (Response)
import Magic
-- import Paths_clckwrks_plugin_media (getDataDir)

checkAuth :: MediaURL -> MediaM MediaURL
checkAuth url =
    case url of
      MediaAdmin {} ->
          do showFn <- mediaClckURL <$> ask
             requiresRole_ showFn (Set.singleton Administrator) url
      _ -> return url


routeMedia :: MediaURL -> MediaM Response
routeMedia unsecureURL =
    do url <- checkAuth unsecureURL
       case url of
         (MediaAdmin Upload)   -> uploadMedium url
         (MediaAdmin AllMedia) -> allMedia
         (GetMedium mid)       -> getMedium mid
         (Preview mid)         -> previewMedium mid