-- | 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 forall a b. (a -> b) -> a -> b
$ UserI
    { $sel:key:UserI :: Text
key                   = Text
key
    , $sel:secondary:UserI :: Maybe Text
secondary             = forall a. Monoid a => a
mempty
    , $sel:ip:UserI :: Maybe Text
ip                    = forall a. Monoid a => a
mempty
    , $sel:country:UserI :: Maybe Text
country               = forall a. Monoid a => a
mempty
    , $sel:email:UserI :: Maybe Text
email                 = forall a. Monoid a => a
mempty
    , $sel:firstName:UserI :: Maybe Text
firstName             = forall a. Monoid a => a
mempty
    , $sel:lastName:UserI :: Maybe Text
lastName              = forall a. Monoid a => a
mempty
    , $sel:avatar:UserI :: Maybe Text
avatar                = forall a. Monoid a => a
mempty
    , $sel:name:UserI :: Maybe Text
name                  = forall a. Monoid a => a
mempty
    , $sel:anonymous:UserI :: Bool
anonymous             = Bool
False
    , $sel:custom:UserI :: HashMap Text Value
custom                = forall a. Monoid a => a
mempty
    , $sel:privateAttributeNames:UserI :: Set Text
privateAttributeNames = 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: Symbol) s a. HasField' f s a => a -> s -> s
setField @"privateAttributeNames"