module Imm.Feed where

-- {{{ Imports
import Imm.Types
import Imm.Util

import Control.Error
--import Control.Exception

import Data.Time
import Data.Time.Clock.POSIX

import System.Directory
import System.FilePath
import System.IO
import System.Locale
-- }}}


getLastCheck :: Settings -> ImmFeed -> IO UTCTime
getLastCheck settings (uri, _feed) = do
    directory <- resolve $ mStateDirectory settings
    
    result <- runEitherT $ do
        content <- fmapLT OtherError . tryIO $ readFile (directory </> fileName)
        EitherT . return $ parseTime' content

    either 
        (\e -> print e >> return timeZero)
        return
        result
  where
    fileName = show uri >>= escapeFileName
    timeZero = posixSecondsToUTCTime $ 0 
    parseTime' string = note (ParseTimeError string) $ parseTime defaultTimeLocale "%c" string


storeLastCheck :: Settings -> ImmFeed -> UTCTime -> EitherT ImmError IO ()
storeLastCheck settings (uri, _) date = do
    directory <- io . resolve $ mStateDirectory settings
    let fileName = show uri >>= escapeFileName
    
    (file, stream) <- fmapLT OtherError . tryIO $ openTempFile directory fileName
    io $ hPutStrLn stream (formatTime defaultTimeLocale "%c" date)
    io $ hClose stream
    fmapLT OtherError . tryIO $ renameFile file (directory </> fileName)