{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html

module Stratosphere.Resources.CognitoUserPool where

import Stratosphere.ResourceImports
import Stratosphere.ResourceProperties.CognitoUserPoolAdminCreateUserConfig
import Stratosphere.ResourceProperties.CognitoUserPoolDeviceConfiguration
import Stratosphere.ResourceProperties.CognitoUserPoolEmailConfiguration
import Stratosphere.ResourceProperties.CognitoUserPoolLambdaConfig
import Stratosphere.ResourceProperties.CognitoUserPoolPolicies
import Stratosphere.ResourceProperties.CognitoUserPoolSchemaAttribute
import Stratosphere.ResourceProperties.CognitoUserPoolSmsConfiguration

-- | Full data type definition for CognitoUserPool. See 'cognitoUserPool' for
-- a more convenient constructor.
data CognitoUserPool =
  CognitoUserPool
  { _cognitoUserPoolAdminCreateUserConfig :: Maybe CognitoUserPoolAdminCreateUserConfig
  , _cognitoUserPoolAliasAttributes :: Maybe (ValList Text)
  , _cognitoUserPoolAutoVerifiedAttributes :: Maybe (ValList Text)
  , _cognitoUserPoolDeviceConfiguration :: Maybe CognitoUserPoolDeviceConfiguration
  , _cognitoUserPoolEmailConfiguration :: Maybe CognitoUserPoolEmailConfiguration
  , _cognitoUserPoolEmailVerificationMessage :: Maybe (Val Text)
  , _cognitoUserPoolEmailVerificationSubject :: Maybe (Val Text)
  , _cognitoUserPoolLambdaConfig :: Maybe CognitoUserPoolLambdaConfig
  , _cognitoUserPoolMfaConfiguration :: Maybe (Val Text)
  , _cognitoUserPoolPolicies :: Maybe CognitoUserPoolPolicies
  , _cognitoUserPoolSchema :: Maybe [CognitoUserPoolSchemaAttribute]
  , _cognitoUserPoolSmsAuthenticationMessage :: Maybe (Val Text)
  , _cognitoUserPoolSmsConfiguration :: Maybe CognitoUserPoolSmsConfiguration
  , _cognitoUserPoolSmsVerificationMessage :: Maybe (Val Text)
  , _cognitoUserPoolUserPoolName :: Maybe (Val Text)
  , _cognitoUserPoolUserPoolTags :: Maybe Object
  , _cognitoUserPoolUsernameAttributes :: Maybe (ValList Text)
  } deriving (Show, Eq)

instance ToJSON CognitoUserPool where
  toJSON CognitoUserPool{..} =
    object $
    catMaybes
    [ fmap (("AdminCreateUserConfig",) . toJSON) _cognitoUserPoolAdminCreateUserConfig
    , fmap (("AliasAttributes",) . toJSON) _cognitoUserPoolAliasAttributes
    , fmap (("AutoVerifiedAttributes",) . toJSON) _cognitoUserPoolAutoVerifiedAttributes
    , fmap (("DeviceConfiguration",) . toJSON) _cognitoUserPoolDeviceConfiguration
    , fmap (("EmailConfiguration",) . toJSON) _cognitoUserPoolEmailConfiguration
    , fmap (("EmailVerificationMessage",) . toJSON) _cognitoUserPoolEmailVerificationMessage
    , fmap (("EmailVerificationSubject",) . toJSON) _cognitoUserPoolEmailVerificationSubject
    , fmap (("LambdaConfig",) . toJSON) _cognitoUserPoolLambdaConfig
    , fmap (("MfaConfiguration",) . toJSON) _cognitoUserPoolMfaConfiguration
    , fmap (("Policies",) . toJSON) _cognitoUserPoolPolicies
    , fmap (("Schema",) . toJSON) _cognitoUserPoolSchema
    , fmap (("SmsAuthenticationMessage",) . toJSON) _cognitoUserPoolSmsAuthenticationMessage
    , fmap (("SmsConfiguration",) . toJSON) _cognitoUserPoolSmsConfiguration
    , fmap (("SmsVerificationMessage",) . toJSON) _cognitoUserPoolSmsVerificationMessage
    , fmap (("UserPoolName",) . toJSON) _cognitoUserPoolUserPoolName
    , fmap (("UserPoolTags",) . toJSON) _cognitoUserPoolUserPoolTags
    , fmap (("UsernameAttributes",) . toJSON) _cognitoUserPoolUsernameAttributes
    ]

instance FromJSON CognitoUserPool where
  parseJSON (Object obj) =
    CognitoUserPool <$>
      (obj .:? "AdminCreateUserConfig") <*>
      (obj .:? "AliasAttributes") <*>
      (obj .:? "AutoVerifiedAttributes") <*>
      (obj .:? "DeviceConfiguration") <*>
      (obj .:? "EmailConfiguration") <*>
      (obj .:? "EmailVerificationMessage") <*>
      (obj .:? "EmailVerificationSubject") <*>
      (obj .:? "LambdaConfig") <*>
      (obj .:? "MfaConfiguration") <*>
      (obj .:? "Policies") <*>
      (obj .:? "Schema") <*>
      (obj .:? "SmsAuthenticationMessage") <*>
      (obj .:? "SmsConfiguration") <*>
      (obj .:? "SmsVerificationMessage") <*>
      (obj .:? "UserPoolName") <*>
      (obj .:? "UserPoolTags") <*>
      (obj .:? "UsernameAttributes")
  parseJSON _ = mempty

-- | Constructor for 'CognitoUserPool' containing required fields as
-- arguments.
cognitoUserPool
  :: CognitoUserPool
cognitoUserPool  =
  CognitoUserPool
  { _cognitoUserPoolAdminCreateUserConfig = Nothing
  , _cognitoUserPoolAliasAttributes = Nothing
  , _cognitoUserPoolAutoVerifiedAttributes = Nothing
  , _cognitoUserPoolDeviceConfiguration = Nothing
  , _cognitoUserPoolEmailConfiguration = Nothing
  , _cognitoUserPoolEmailVerificationMessage = Nothing
  , _cognitoUserPoolEmailVerificationSubject = Nothing
  , _cognitoUserPoolLambdaConfig = Nothing
  , _cognitoUserPoolMfaConfiguration = Nothing
  , _cognitoUserPoolPolicies = Nothing
  , _cognitoUserPoolSchema = Nothing
  , _cognitoUserPoolSmsAuthenticationMessage = Nothing
  , _cognitoUserPoolSmsConfiguration = Nothing
  , _cognitoUserPoolSmsVerificationMessage = Nothing
  , _cognitoUserPoolUserPoolName = Nothing
  , _cognitoUserPoolUserPoolTags = Nothing
  , _cognitoUserPoolUsernameAttributes = Nothing
  }

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-admincreateuserconfig
cupAdminCreateUserConfig :: Lens' CognitoUserPool (Maybe CognitoUserPoolAdminCreateUserConfig)
cupAdminCreateUserConfig = lens _cognitoUserPoolAdminCreateUserConfig (\s a -> s { _cognitoUserPoolAdminCreateUserConfig = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-aliasattributes
cupAliasAttributes :: Lens' CognitoUserPool (Maybe (ValList Text))
cupAliasAttributes = lens _cognitoUserPoolAliasAttributes (\s a -> s { _cognitoUserPoolAliasAttributes = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-autoverifiedattributes
cupAutoVerifiedAttributes :: Lens' CognitoUserPool (Maybe (ValList Text))
cupAutoVerifiedAttributes = lens _cognitoUserPoolAutoVerifiedAttributes (\s a -> s { _cognitoUserPoolAutoVerifiedAttributes = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-deviceconfiguration
cupDeviceConfiguration :: Lens' CognitoUserPool (Maybe CognitoUserPoolDeviceConfiguration)
cupDeviceConfiguration = lens _cognitoUserPoolDeviceConfiguration (\s a -> s { _cognitoUserPoolDeviceConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailconfiguration
cupEmailConfiguration :: Lens' CognitoUserPool (Maybe CognitoUserPoolEmailConfiguration)
cupEmailConfiguration = lens _cognitoUserPoolEmailConfiguration (\s a -> s { _cognitoUserPoolEmailConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailverificationmessage
cupEmailVerificationMessage :: Lens' CognitoUserPool (Maybe (Val Text))
cupEmailVerificationMessage = lens _cognitoUserPoolEmailVerificationMessage (\s a -> s { _cognitoUserPoolEmailVerificationMessage = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailverificationsubject
cupEmailVerificationSubject :: Lens' CognitoUserPool (Maybe (Val Text))
cupEmailVerificationSubject = lens _cognitoUserPoolEmailVerificationSubject (\s a -> s { _cognitoUserPoolEmailVerificationSubject = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-lambdaconfig
cupLambdaConfig :: Lens' CognitoUserPool (Maybe CognitoUserPoolLambdaConfig)
cupLambdaConfig = lens _cognitoUserPoolLambdaConfig (\s a -> s { _cognitoUserPoolLambdaConfig = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-mfaconfiguration
cupMfaConfiguration :: Lens' CognitoUserPool (Maybe (Val Text))
cupMfaConfiguration = lens _cognitoUserPoolMfaConfiguration (\s a -> s { _cognitoUserPoolMfaConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-policies
cupPolicies :: Lens' CognitoUserPool (Maybe CognitoUserPoolPolicies)
cupPolicies = lens _cognitoUserPoolPolicies (\s a -> s { _cognitoUserPoolPolicies = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-schema
cupSchema :: Lens' CognitoUserPool (Maybe [CognitoUserPoolSchemaAttribute])
cupSchema = lens _cognitoUserPoolSchema (\s a -> s { _cognitoUserPoolSchema = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsauthenticationmessage
cupSmsAuthenticationMessage :: Lens' CognitoUserPool (Maybe (Val Text))
cupSmsAuthenticationMessage = lens _cognitoUserPoolSmsAuthenticationMessage (\s a -> s { _cognitoUserPoolSmsAuthenticationMessage = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsconfiguration
cupSmsConfiguration :: Lens' CognitoUserPool (Maybe CognitoUserPoolSmsConfiguration)
cupSmsConfiguration = lens _cognitoUserPoolSmsConfiguration (\s a -> s { _cognitoUserPoolSmsConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsverificationmessage
cupSmsVerificationMessage :: Lens' CognitoUserPool (Maybe (Val Text))
cupSmsVerificationMessage = lens _cognitoUserPoolSmsVerificationMessage (\s a -> s { _cognitoUserPoolSmsVerificationMessage = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpoolname
cupUserPoolName :: Lens' CognitoUserPool (Maybe (Val Text))
cupUserPoolName = lens _cognitoUserPoolUserPoolName (\s a -> s { _cognitoUserPoolUserPoolName = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpooltags
cupUserPoolTags :: Lens' CognitoUserPool (Maybe Object)
cupUserPoolTags = lens _cognitoUserPoolUserPoolTags (\s a -> s { _cognitoUserPoolUserPoolTags = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-usernameattributes
cupUsernameAttributes :: Lens' CognitoUserPool (Maybe (ValList Text))
cupUsernameAttributes = lens _cognitoUserPoolUsernameAttributes (\s a -> s { _cognitoUserPoolUsernameAttributes = a })