module Hascat.App
  ( module Hascat.Config,
    InitHandler,
    RespondHandler,
    DoneHandler,
    Handlers(..),
    SystemHandler(..),
    App(..),
    defaultInit,
    defaultDone,
    defaultHandlers )
where

import Data.Maybe
import Hascat.Config
import Network.HTTP
import Data.ByteString.Lazy
import Hascat.Protocol
import System.Plugins


type InitHandler a    = AppConfig -> IO a
type RespondHandler a = 
  AppConfig -> a -> ServletRequest -> IO (Response ByteString)
type DoneHandler a    = AppConfig -> a -> IO ()

data Handlers a = Handlers {
                  initHandler     :: InitHandler a,
                  respondHandler  :: RespondHandler a,
                  doneHandler     :: DoneHandler a }

data SystemHandler a = SystemHandler (RespondHandler a)

data App = forall a . App {
                  appConfig   :: AppConfig,
                  appModule   :: Module,
                  appHandlers :: Handlers a,
                  appState    :: Maybe a,
                  appPaused   :: Bool }

defaultHandlers = Handlers {
                  initHandler    = defaultInit,
                  respondHandler = undefined,
                  doneHandler    = defaultDone}

defaultInit :: InitHandler ()
defaultInit _ = return ()

defaultDone :: DoneHandler a
defaultDone _ _ = return ()