{-# LANGUAGE ScopedTypeVariables #-}

-- | Main logic combining all components

module OrgStat.Logic
       ( runOrgStat
       ) where

import           Universum

import           Control.Lens      (views)
import qualified Data.Text         as T
import           Data.Time         (defaultTimeLocale, formatTime, getZonedTime)
import           System.Directory  (createDirectoryIfMissing)
import           System.FilePath   ((</>))
import           System.Wlog       (logDebug, logInfo)
import           Turtle            (shell)

import           OrgStat.CLI       (CommonArgs (..))
import           OrgStat.Config    (ConfOutput (..), ConfOutputType (..),
                                    OrgStatConfig (..))
import           OrgStat.Helpers   (resolveOutput, resolveReport)
import           OrgStat.Outputs   (genBlockOutput, genSummaryOutput, processTimeline,
                                    tpColorSalt, writeReport)
import           OrgStat.WorkMonad (WorkM, wcCommonArgs, wcConfig)

-- | Main application logic.
runOrgStat :: WorkM ()
runOrgStat = do
    conf@OrgStatConfig{..} <- view wcConfig
    logDebug $ "Config: \n" <> show conf

    curTime <- liftIO getZonedTime

    let createDir = do
            let reportDir = confOutputDir </>
                            formatTime defaultTimeLocale "%F-%H-%M-%S" curTime
            liftIO $ createDirectoryIfMissing True reportDir
            pure reportDir
    reportDir <- maybe createDir pure =<< views wcCommonArgs outputDir
    logInfo $ "This report set will be put into: " <> fromString reportDir

    outputsToProcess <-
        maybe (pure confOutputs) (fmap one . resolveOutput) =<<
        views wcCommonArgs selectOutput
    forM_ outputsToProcess $ \ConfOutput{..} -> do
        logInfo $ "Processing output " <> coName
        let prePath = reportDir </> T.unpack coName
        case coType of
            TimelineOutput {..} -> do
                resolved <- resolveReport toReport
                let timelineParamsFinal =
                        (confBaseTimelineParams <> toParams) & tpColorSalt .~ confColorSalt
                let res = processTimeline timelineParamsFinal resolved
                logInfo $ "Generating timeline report " <> coName <> "..."
                writeReport prePath res
            SummaryOutput params -> do
                summary <- genSummaryOutput params
                writeReport prePath summary
            BlockOutput {..} -> do
                resolved <- resolveReport boReport
                let res = genBlockOutput boParams resolved
                writeReport prePath res
    whenM (views wcCommonArgs xdgOpen) $ do
        logInfo "Opening reports using xdg-open..."
        void $ shell ("for i in $(ls "<>T.pack reportDir<>"/*); do xdg-open $i; done") empty
    logInfo "Done"