module Mensam.Server.Server.Route.Static where

import Mensam.API.Route.Static
import Mensam.Server.Application.Configured.Class
import Mensam.Server.Configuration
import Mensam.Server.Server.Err404
import Mensam.Server.Server.FileServer

import Control.Monad.IO.Unlift
import Control.Monad.Logger.CallStack
import Network.Wai.Trans
import Servant
import Servant.RawM.Server qualified as RawM
import WaiAppStatic.Types

handler ::
  (MonadConfigured m, MonadLogger m, MonadUnliftIO m) =>
  ServerT API m
handler :: forall (m :: * -> *).
(MonadConfigured m, MonadLogger m, MonadUnliftIO m) =>
ServerT API m
handler = do
  FilePath
directory <- Configuration -> FilePath
configDirectoryStatic (Configuration -> FilePath) -> m Configuration -> m FilePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Configuration
forall (m :: * -> *). MonadConfigured m => m Configuration
configuration
  Application
fallbackApplication <- ApplicationT m -> m Application
forall (m :: * -> *).
MonadUnliftIO m =>
ApplicationT m -> m Application
runApplicationT ApplicationT m
forall (m :: * -> *).
(MonadConfigured m, MonadLogger m) =>
ApplicationT m
application404
  Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Serve static file download."
  StaticSettings
settings <- FilePath -> m StaticSettings
forall (m :: * -> *).
(MonadLogger m, MonadUnliftIO m) =>
FilePath -> m StaticSettings
fileServerSettings FilePath
directory
  StaticSettings -> ServerT (RawM' Any) m
forall (m :: * -> *) serverType.
Applicative m =>
StaticSettings -> ServerT (RawM' serverType) m
RawM.serveDirectoryWith StaticSettings
settings {ss404Handler = Just fallbackApplication}