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 Network.HTTP.Client                (Manager)

import LaunchDarkly.Server.Store               (StoreInterface)
import LaunchDarkly.Server.DataSource.Internal (DataSourceFactory)

mapConfig :: (ConfigI -> ConfigI) -> Config -> Config
mapConfig :: (ConfigI -> ConfigI) -> Config -> Config
mapConfig ConfigI -> ConfigI
f (Config ConfigI
c) = ConfigI -> Config
Config forall a b. (a -> b) -> a -> b
$ ConfigI -> ConfigI
f ConfigI
c

shouldSendEvents :: ConfigI -> Bool
shouldSendEvents :: ConfigI -> Bool
shouldSendEvents ConfigI
config = (Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (f :: Symbol) a s. HasField' f s a => s -> a
getField @"offline" ConfigI
config) Bool -> Bool -> Bool
&& (forall (f :: Symbol) a s. HasField' f s a => s -> a
getField @"sendEvents" ConfigI
config)

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

data ConfigI = ConfigI
    { ConfigI -> Text
key                   :: !Text
    , ConfigI -> Text
baseURI               :: !Text
    , ConfigI -> Text
streamURI             :: !Text
    , ConfigI -> Text
eventsURI             :: !Text
    , ConfigI -> Maybe StoreInterface
storeBackend          :: !(Maybe StoreInterface)
    , ConfigI -> Natural
storeTTLSeconds       :: !Natural
    , ConfigI -> Bool
streaming             :: !Bool
    , ConfigI -> Bool
allAttributesPrivate  :: !Bool
    , ConfigI -> Set Text
privateAttributeNames :: !(Set Text)
    , ConfigI -> Natural
flushIntervalSeconds  :: !Natural
    , ConfigI -> Natural
pollIntervalSeconds   :: !Natural
    , ConfigI -> Natural
userKeyLRUCapacity    :: !Natural
    , ConfigI -> Bool
inlineUsersInEvents   :: !Bool
    , ConfigI -> Natural
eventsCapacity        :: !Natural
    , ConfigI -> LoggingT IO () -> IO ()
logger                :: !(LoggingT IO () -> IO ())
    , ConfigI -> Bool
sendEvents            :: !Bool
    , ConfigI -> Bool
offline               :: !Bool
    , ConfigI -> Natural
requestTimeoutSeconds :: !Natural
    , ConfigI -> Bool
useLdd                :: !Bool
    , ConfigI -> Maybe DataSourceFactory
dataSourceFactory     :: !(Maybe DataSourceFactory)
    , ConfigI -> Maybe Manager
manager               :: !(Maybe Manager)
    } deriving (forall x. Rep ConfigI x -> ConfigI
forall x. ConfigI -> Rep ConfigI x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ConfigI x -> ConfigI
$cfrom :: forall x. ConfigI -> Rep ConfigI x
Generic)