module Conferer.Provider.PropertiesFile where

import           Data.Text (Text)
import           Data.Function ((&))
import           System.Directory (doesFileExist)
import           Data.Maybe (catMaybes)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text

import           Conferer.Types
import           Conferer.Provider.Files
import           Conferer.Provider.Null
import           Conferer.Provider.Simple

-- | 'ProviderCreator' for properties file 'Provider' that read from a
-- config file in @config/{env}.properties@ and parses it as a properties
-- file with @some.key=a value@ lines
mkPropertiesFileProvider :: ProviderCreator
mkPropertiesFileProvider = \config -> do
  filePath <- getFilePathFromEnv config "properties"
  fileExists <- doesFileExist filePath
  if fileExists
    then do
      fileContent <- Text.readFile filePath
      mkPropertiesFileProvider' fileContent config
    else do
      mkNullProvider config


-- | 'ProviderCreator' for properties file 'Provider' that only parses a
-- given 'Text' as a properties file
mkPropertiesFileProvider' :: Text -> ProviderCreator
mkPropertiesFileProvider' fileContent =
  \config -> do
    let keyValues =
          fileContent
          & Text.lines
          & fmap lineToKeyValue
          & catMaybes
    mkMapProvider keyValues config


-- | Transform a line into a key/value pair (or not)
lineToKeyValue :: Text -> Maybe (Key, Text)
lineToKeyValue line =
  Text.breakOn "=" line
  & (\(rawKey, rawValue) ->
      case Text.stripPrefix "=" rawValue of
        Just value ->
          Just (Path $ Text.splitOn "." rawKey, value)
        Nothing ->
          Nothing
    )