content: {-# LANGUAGE ApplicativeDo, ScopedTypeVariables #-}
  
  module Main where
  
  import Universum
  
  import Data.Version (showVersion)
  import Options.Applicative.Simple
    (Parser, help, long, metavar, simpleOptions, strOption, switch, value)
  import Paths_orgstat (version)
  import System.Directory (getHomeDirectory)
  import System.FilePath ((</>))
  
  import OrgStat.CLI (CommonArgs, parseCommonArgs)
  import OrgStat.IO (readConfig)
  import OrgStat.Logging (Severity(..), initLogging, logDebug, logError)
  import OrgStat.Logic (runOrgStat)
  import OrgStat.WorkMonad (WorkConfig(..), runWorkM)
  
  data Args = Args
      { configPath :: !FilePath
        -- ^ Path to configuration file.
      , debug      :: !Bool
        -- ^ Enable debug logging.
      , commonArgs :: CommonArgs
        -- ^ Other arguments.
      } deriving Show
  
  argsParser :: FilePath -> Parser Args
  argsParser homeDir = do
      configPath <-
          strOption
              (long "conf-path" <> metavar "FILEPATH" <> value (homeDir </> ".orgstat.yaml") <>
              help "Path to the configuration file")
      debug <- switch (long "debug" <> help "Enable debug logging")
      commonArgs <- parseCommonArgs
      pure Args {..}
  
  getNodeOptions :: FilePath -> IO Args
  getNodeOptions homeDir = do
      (res, ()) <-
          simpleOptions
              ("orgstat-" <> showVersion version)
              "----- OrgStat ------"
              "Statistic reports visualizer for org-mode"
              (argsParser homeDir)
              empty
      pure res
  
  main :: IO ()
  main = do
      args@Args{..} <- getNodeOptions =<< getHomeDirectory
      let sev = if debug then Debug else Info
      initLogging sev
      config <- readConfig configPath
      runWorkM (WorkConfig config commonArgs) $ do
          logDebug $ "Just started with options: " <> show args
          runOrgStat `catch` topHandler
    where
      topHandler (e :: SomeException) = do
          logError $ "Top level error occured: " <> show e
  