module Space.ModifiedTime
    ( Modified(..)
    , EpochTime
    , getMTime
    , formattedMTime
    , modifiedSince
    ) where

import Data.ByteString (ByteString)
import System.Posix.Types (EpochTime)
import System.Posix.Files.ByteString
import Network.HTTP.Types
import Network.HTTP.Date
import Network.Wai (Request, requestHeaders)

data Modified = NotModified | Modified

getMTime :: ByteString -> IO EpochTime
getMTime = fmap modificationTime . getFileStatus

formattedMTime :: EpochTime -> ByteString
formattedMTime = formatHTTPDate . epochTimeToHTTPDate

modifiedSince :: Request -> EpochTime -> Modified
modifiedSince req mtime = case since of
    Nothing -> Modified
    Just rawReqTime -> case parseHTTPDate rawReqTime of
        Nothing -> Modified
        Just reqTime -> if reqTime < epochTimeToHTTPDate mtime
            then Modified
            else NotModified
  where
    since = lookup hIfModifiedSince (requestHeaders req)