{-# LANGUAGE FlexibleContexts #-}

module Config
( Config(..)
, IssuePattern
, readConfig
) where

import System.Directory
import System.FilePath
import Data.List.Split
import Data.ConfigFile
import Control.Monad.Except
import Data.ByteString.Char8 (ByteString(..), pack)
import Data.ByteString.Base64 (decodeLenient)


type IssuePattern = String

data Config = Config { getGitRepositories::[FilePath]
                     , getIssuePatterns::[IssuePattern]
                     , getJiraHost::String
                     , getJiraUser::ByteString
                     , getJiraPassword::ByteString
                     } deriving (Show)

readConfig :: IO (Either String Config)
readConfig = do
  homePath <- getHomeDirectory
  errorOrConfig <- runExceptT $ do
    cp       <- join $ liftIO $ readfile emptyCP (homePath </> ".tempo.conf")
    repos    <- get cp "git" "repos"
    projects <- get cp "jira" "projects"
    jiraHost <- get cp "jira" "host"
    jiraUser <- get cp "jira" "user"
    jiraPass <- get cp "jira" "pass"
    return $ Config (splitOn "," repos)
                    (map projectToPattern (splitOn "," projects))
                    jiraHost
                    (pack jiraUser)
                    (decodeLenient . pack $ jiraPass)
  return $ case errorOrConfig of
    (Left err) -> Left $ show err
    (Right cfg) -> Right cfg

projectToPattern :: String -> IssuePattern
projectToPattern projectCode = projectCode ++ "\\-[0-9]+"