{-# LANGUAGE OverloadedStrings #-}
module Web.Heroku.Persist.Postgresql
    ( postgresConf
    , fromDatabaseUrl
    ) where

import Control.Applicative ((<$>))
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Text.Encoding (encodeUtf8)
import Data.Monoid ((<>))
import Database.Persist.Postgresql (PostgresConf(..))
import Web.Heroku (dbConnParams)
import Web.Heroku.Postgres (dbConnParams, parseDatabaseUrl)

import qualified Data.Text as T

-- | Build a @'PostgresConf'@ by parsing @ENV[DATABASE_URL]@
postgresConf :: Int -> IO PostgresConf
postgresConf size = do
    connStr <- formatParams <$> dbConnParams

    return PostgresConf
        { pgConnStr = connStr
        , pgPoolSize = size
        }

-- | Build a @'PostgresConf'@ by parsing a database URL String
fromDatabaseUrl :: Int -> String -> PostgresConf
fromDatabaseUrl size url = PostgresConf
    { pgConnStr = formatParams $ parseDatabaseUrl url
    , pgPoolSize = size
    }

formatParams :: [(Text, Text)] -> ByteString
formatParams = encodeUtf8 . T.unwords . map toKeyValue

toKeyValue :: (Text, Text) -> Text
toKeyValue (k, v) = k <> "=" <> v