-- Copyright: 2009 Dino Morelli
-- License: BSD3 (see LICENSE)
-- Author: Dino Morelli <dino@ui3.info>

import Control.Monad.Error
import Control.Monad.Reader
import Data.Map hiding ( map )
import Data.Maybe ( isJust )
import Prelude hiding ( lookup )
import System.Environment ( getArgs )
import System.Exit ( ExitCode (..), exitWith )

import Erbu.Common ( Env (..), runErbu, turnOffBuffering
   , exitFailWithMsg, reportFailureLog )
import Erbu.Encfs ( mount, umount )
import Erbu.ErbuOpts ( Options (..), parseOpts )
import Erbu.Log ( LogEvent (..), logMsg )
import Erbu.Rsync ( backup )


main :: IO ()
main = do
   -- No buffering, it messes with the order of output
   turnOffBuffering


   -- Command-line processing
   -- optResult is an (Either String (ConfMap, Options))
   optResult <- runErrorT $ do
      (options, config) <- (liftIO getArgs) >>= parseOpts

      when (optNoAction options)
         $ liftIO $ logMsg STATUS "** No action mode **"

      return (config, options)


   -- Assess result of cli parse, exit if necessary with messages
   (config, options) <- either exitFailWithMsg return optResult


   -- Perform the backup operations
   backupResult <- runErbu (Env options config) $ do
      let doingEnc = isJust $ lookup "encfs.passphrase" config

      when doingEnc mount
      backup
      when doingEnc umount

      return ExitSuccess


   -- Assess the result
   exitWith =<< either reportFailureLog return backupResult

