module LaunchDarkly.Server.Config.Internal
    ( Config(..)
    , mapConfig
    , ConfigI(..)
    , shouldSendEvents
    ) where

import Control.Monad.Logger               (LoggingT)
import Data.Generics.Product              (getField)
import Data.Text                          (Text)
import Data.Set                           (Set)
import GHC.Natural                        (Natural)
import GHC.Generics                       (Generic)

import LaunchDarkly.Server.Store          (StoreInterface)

mapConfig :: (ConfigI -> ConfigI) -> Config -> Config
mapConfig f (Config c) = Config $ f c

shouldSendEvents :: ConfigI -> Bool
shouldSendEvents config = (not $ getField @"offline" config) && (getField @"sendEvents" config)

-- | Config allows advanced configuration of the LaunchDarkly client.
newtype Config = Config ConfigI

data ConfigI = ConfigI
    { key                   :: !Text
    , baseURI               :: !Text
    , streamURI             :: !Text
    , eventsURI             :: !Text
    , storeBackend          :: !(Maybe StoreInterface)
    , storeTTLSeconds       :: !Natural
    , streaming             :: !Bool
    , allAttributesPrivate  :: !Bool
    , privateAttributeNames :: !(Set Text)
    , flushIntervalSeconds  :: !Natural
    , pollIntervalSeconds   :: !Natural
    , userKeyLRUCapacity    :: !Natural
    , inlineUsersInEvents   :: !Bool
    , eventsCapacity        :: !Natural
    , logger                :: !(LoggingT IO () -> IO ())
    , sendEvents            :: !Bool
    , offline               :: !Bool
    , requestTimeoutSeconds :: !Natural
    , useLdd                :: !Bool
    } deriving (Generic)