{-# LANGUAGE FlexibleContexts #-}
module Imm.Maildir where

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

--import Control.Monad.IO.Class
import Control.Monad.Error

import Data.Functor
import qualified Data.Text.Lazy.IO as T
import Data.Time.Clock.POSIX

import Network.BSD

import System.Directory
import System.FilePath
import System.Random
-- }}}

init :: (MonadIO m, MonadError ImmError m) => PortableFilePath -> m ()
init directory = do
    dir <- io $ resolve directory
    try $ createDirectoryIfMissing True dir
    try $ createDirectoryIfMissing True (dir </> "cur")
    try $ createDirectoryIfMissing True (dir </> "new")
    try $ createDirectoryIfMissing True (dir </> "tmp")
    logVerbose $ "Maildir correctly created at: " ++ dir


add :: (MonadIO m, MonadError ImmError m) => PortableFilePath -> Mail -> m ()
add directory mail = do
    dir      <- resolve directory
    fileName <- io getUniqueName
    try $ T.writeFile (dir </> "new" </> fileName) (toText mail)


getUniqueName :: MonadIO m => m String 
getUniqueName = io $ do
    time     <- show <$> getPOSIXTime
    hostname <- getHostName
    rand     <- show <$> (getStdRandom $ randomR (1,100000) :: IO Int)
    
    return . concat $ [time, ".", rand, ".", hostname]