-- | This module is for configuration of the user object.

module LaunchDarkly.Server.User
    ( User
    , makeUser
    , userSetKey
    , userSetSecondary
    , userSetIP
    , userSetCountry
    , userSetEmail
    , userSetFirstName
    , userSetLastName
    , userSetAvatar
    , userSetName
    , userSetAnonymous
    , userSetCustom
    , userSetPrivateAttributeNames
    ) where

import Data.Aeson                        (Value)
import Data.Generics.Product             (setField)
import Data.HashMap.Strict               (HashMap)
import Data.Set                          (Set)
import Data.Text                         (Text)

import LaunchDarkly.Server.User.Internal (User(..), mapUser, UserI(..))

-- | Creates a new user identified by the given key.
makeUser :: Text -> User
makeUser :: Text -> User
makeUser Text
key = UserI -> User
User (UserI -> User) -> UserI -> User
forall a b. (a -> b) -> a -> b
$ UserI :: Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Bool
-> HashMap Text Value
-> Set Text
-> UserI
UserI
    { $sel:key:UserI :: Text
key                   = Text
key
    , $sel:secondary:UserI :: Maybe Text
secondary             = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:ip:UserI :: Maybe Text
ip                    = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:country:UserI :: Maybe Text
country               = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:email:UserI :: Maybe Text
email                 = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:firstName:UserI :: Maybe Text
firstName             = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:lastName:UserI :: Maybe Text
lastName              = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:avatar:UserI :: Maybe Text
avatar                = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:name:UserI :: Maybe Text
name                  = Maybe Text
forall a. Monoid a => a
mempty
    , $sel:anonymous:UserI :: Bool
anonymous             = Bool
False
    , $sel:custom:UserI :: HashMap Text Value
custom                = HashMap Text Value
forall a. Monoid a => a
mempty
    , $sel:privateAttributeNames:UserI :: Set Text
privateAttributeNames = Set Text
forall a. Monoid a => a
mempty
    }

-- | Set the primary key for a user.
userSetKey :: Text -> User -> User
userSetKey :: Text -> User -> User
userSetKey = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Text -> UserI -> UserI) -> Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "key" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"key"

-- | Set the secondary key for a user.
userSetSecondary :: Maybe Text -> User -> User
userSetSecondary :: Maybe Text -> User -> User
userSetSecondary = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "secondary" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"secondary"

-- | Set the IP for a user.
userSetIP :: Maybe Text -> User -> User
userSetIP :: Maybe Text -> User -> User
userSetIP = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "ip" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"ip"

-- | Set the country for a user.
userSetCountry :: Maybe Text -> User -> User
userSetCountry :: Maybe Text -> User -> User
userSetCountry = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "country" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"country"

-- | Set the email for a user.
userSetEmail :: Maybe Text -> User -> User
userSetEmail :: Maybe Text -> User -> User
userSetEmail = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "email" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"email"

-- | Set the first name for a user.
userSetFirstName :: Maybe Text -> User -> User
userSetFirstName :: Maybe Text -> User -> User
userSetFirstName = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "firstName" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"firstName"

-- | Set the last name for a user.
userSetLastName :: Maybe Text -> User -> User
userSetLastName :: Maybe Text -> User -> User
userSetLastName = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "lastName" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"lastName"

-- | Set the avatar for a user.
userSetAvatar :: Maybe Text -> User -> User
userSetAvatar :: Maybe Text -> User -> User
userSetAvatar = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "avatar" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"avatar"

-- | Set the name for a user.
userSetName :: Maybe Text -> User -> User
userSetName :: Maybe Text -> User -> User
userSetName = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Maybe Text -> UserI -> UserI) -> Maybe Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "name" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"name"

-- | Set if the user is anonymous or not.
userSetAnonymous :: Bool -> User -> User
userSetAnonymous :: Bool -> User -> User
userSetAnonymous = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Bool -> UserI -> UserI) -> Bool -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "anonymous" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"anonymous"

-- | Set custom fields for a user.
userSetCustom :: HashMap Text Value -> User -> User
userSetCustom :: HashMap Text Value -> User -> User
userSetCustom = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (HashMap Text Value -> UserI -> UserI)
-> HashMap Text Value
-> User
-> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "custom" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"custom"

-- | This contains list of attributes to keep private, whether they appear at
-- the top-level or Custom The attribute "key" is always sent regardless of
-- whether it is in this list, and "custom" cannot be used to eliminate all
-- custom attributes
userSetPrivateAttributeNames :: Set Text -> User -> User
userSetPrivateAttributeNames :: Set Text -> User -> User
userSetPrivateAttributeNames = (UserI -> UserI) -> User -> User
mapUser ((UserI -> UserI) -> User -> User)
-> (Set Text -> UserI -> UserI) -> Set Text -> User -> User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. HasField' "privateAttributeNames" s a => a -> s -> s
forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"privateAttributeNames"