module EnvStatus.Config where

import System.Posix.Files (fileExist)
import System.Posix.User (getRealUserID, getUserEntryForID, UserEntry(..))

import Data.ConfigFile (ConfigParser, readstring, emptyCP, get, set, merge, to_string)

readConfig :: String -> IO ConfigParser
readConfig configString =
  case parsed of
    Right configParser -> return configParser
    Left cperror -> do
      print cperror
      return emptyCP
    where
      parsed = readstring emptyCP configString

getConfigValue :: ConfigParser -> String -> Maybe String
getConfigValue cp key =
  case value of
      Right v -> Just v
      Left _error -> Nothing
      where value = get cp "DEFAULT" key

defaultConfig :: ConfigParser
defaultConfig =
  case defaultC of
      Right config -> config
      Left _error -> emptyCP
      where
        -- TODO: gbataille - change the default to something reasonable
        defaultC = do
          cp <- set emptyCP "DEFAULT" "output_template" "\nenvstatus: {{foo}}"
          set cp "DEFAULT" "foo" "date +%Y-%m-%d"

getAppConfig :: IO ConfigParser
getAppConfig = do
  userEntry <- getRealUserID >>= getUserEntryForID
  let configFilePath = homeDirectory userEntry ++ "/.envstatusrc"
  configFilePresent <- fileExist configFilePath
  if configFilePresent
    then do
      configText <- readFile configFilePath
      cp <- readConfig configText
      return $ merge defaultConfig cp
    else return defaultConfig

-- | For debug purpose
showConfig :: ConfigParser -> String
showConfig = to_string