{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}

module Config
  ( getConfig
  , Config(..)
  ) where

import Data.ConfigFile
import Data.Text (Text)
import qualified Data.Text as T

import Control.Monad.Trans.Error (runErrorT)
import Control.Monad.IO.Class (liftIO)
import Control.Monad (join)
import Control.Arrow (left)
import Control.Applicative (liftA3)

data Config = Config
  { hostname :: Text
  , port :: Int
  , signInExpirationMn :: Int
  } deriving (Read, Eq, Show)

getConfig :: FilePath -> IO (Either Text Config)
getConfig filePath =
  left (T.pack . show) <$> (runErrorT $ do
    cp <- join $ liftIO $ readfile emptyCP filePath
    liftA3
      Config
      (T.pack <$> get cp "DEFAULT" "hostname")
      (get cp "DEFAULT" "port")
      (get cp "DEFAULT" "sign-in-expiration-mn")
  )