{-# LANGUAGE OverloadedStrings #-}

module Network.Wai.Application.Classic.Def where

import Control.Applicative
import Control.Exception
import Network.HTTP.Date
import Network.Wai.Application.Classic.Path
import Network.Wai.Application.Classic.Types
import Network.Wai.Logger
import System.Log.FastLogger.Date
import System.Posix

-- |
-- Default value for  'ClassicAppSpec'. 'softwareName' is \"Classic\". 'logger' does not log at all. 'dater' calls 'epochTime' for every request. 'statusFileDir' is \"\/usr\/local\/share\/html\/status\/\".
defaultClassicAppSpec :: ClassicAppSpec
defaultClassicAppSpec = ClassicAppSpec {
    softwareName = "Classic"
  , logger = defaultLogger
  , dater = defaultDater
  , statusFileDir = "/usr/local/share/html/status/"
  }

defaultLogger :: ApacheLogger
defaultLogger _ _ _ = return ()

defaultDater :: IO ZonedDate
defaultDater = formatHTTPDate . epochTimeToHTTPDate <$> epochTime

----------------------------------------------------------------

-- |
-- Default value for 'defaultFileAppSpec'. 'indexFile' is \"index.html\". 'isHTML' matches \"*.html\" and \"*.html\". 'getFileInfo' calls `getFileStatus` for every request.
defaultFileAppSpec :: FileAppSpec
defaultFileAppSpec = FileAppSpec {
    indexFile = "index.html"
  , isHTML = defaultIsHTml
  , getFileInfo = defaultGetFileInfo
  }

defaultIsHTml :: Path -> Bool
defaultIsHTml file = ".html" `isSuffixOf` file || ".htm" `isSuffixOf` file

defaultGetFileInfo :: Path -> IO FileInfo
defaultGetFileInfo path = do
    fs <- getFileStatus sfile
    if not (isDirectory fs) then
        return FileInfo {
            fileInfoName = path
          , fileInfoSize = size fs
          , fileInfoTime = time fs
          , fileInfoDate = formatHTTPDate (time fs)
          }
      else
        throwIO $ userError "does not exist"
  where
    sfile = pathString path
    size = fromIntegral . fileSize
    time = epochTimeToHTTPDate . modificationTime

----------------------------------------------------------------

-- |
-- Default value for 'defaultCgiAppSpec'. 'indexCgi' is \"index.cgi\".
defaultCgiAppSpec :: CgiAppSpec
defaultCgiAppSpec = CgiAppSpec {
    indexCgi = "index.cgi"
  }