{-# LANGUAGE MultiWayIf #-}
-- CHANGE WITH CAUTION: This is a generated code file generated by https://github.com/Haskell-OpenAPI-Code-Generator/Haskell-OpenAPI-Client-Code-Generator.
{-# LANGUAGE OverloadedStrings #-}

-- | Contains the types generated from the schema MandatePaymentMethodDetails
module StripeAPI.Types.MandatePaymentMethodDetails where

import qualified Control.Monad.Fail
import qualified Data.Aeson
import qualified Data.Aeson as Data.Aeson.Encoding.Internal
import qualified Data.Aeson as Data.Aeson.Types
import qualified Data.Aeson as Data.Aeson.Types.FromJSON
import qualified Data.Aeson as Data.Aeson.Types.Internal
import qualified Data.Aeson as Data.Aeson.Types.ToJSON
import qualified Data.ByteString.Char8
import qualified Data.ByteString.Char8 as Data.ByteString.Internal
import qualified Data.Functor
import qualified Data.Scientific
import qualified Data.Text
import qualified Data.Text.Internal
import qualified Data.Time.Calendar as Data.Time.Calendar.Days
import qualified Data.Time.LocalTime as Data.Time.LocalTime.Internal.ZonedTime
import qualified GHC.Base
import qualified GHC.Classes
import qualified GHC.Int
import qualified GHC.Show
import qualified GHC.Types
import qualified StripeAPI.Common
import StripeAPI.TypeAlias
import {-# SOURCE #-} StripeAPI.Types.MandateAcssDebit
import {-# SOURCE #-} StripeAPI.Types.MandateAuBecsDebit
import {-# SOURCE #-} StripeAPI.Types.MandateBacsDebit
import {-# SOURCE #-} StripeAPI.Types.MandateSepaDebit
import qualified Prelude as GHC.Integer.Type
import qualified Prelude as GHC.Maybe

-- | Defines the object schema located at @components.schemas.mandate_payment_method_details@ in the specification.
data MandatePaymentMethodDetails = MandatePaymentMethodDetails
  { -- | acss_debit:
    MandatePaymentMethodDetails -> Maybe MandateAcssDebit
mandatePaymentMethodDetailsAcssDebit :: (GHC.Maybe.Maybe MandateAcssDebit),
    -- | au_becs_debit:
    MandatePaymentMethodDetails -> Maybe MandateAuBecsDebit
mandatePaymentMethodDetailsAuBecsDebit :: (GHC.Maybe.Maybe MandateAuBecsDebit),
    -- | bacs_debit:
    MandatePaymentMethodDetails -> Maybe MandateBacsDebit
mandatePaymentMethodDetailsBacsDebit :: (GHC.Maybe.Maybe MandateBacsDebit),
    -- | card:
    MandatePaymentMethodDetails
-> Maybe CardMandatePaymentMethodDetails
mandatePaymentMethodDetailsCard :: (GHC.Maybe.Maybe CardMandatePaymentMethodDetails),
    -- | sepa_debit:
    MandatePaymentMethodDetails -> Maybe MandateSepaDebit
mandatePaymentMethodDetailsSepaDebit :: (GHC.Maybe.Maybe MandateSepaDebit),
    -- | type: The type of the payment method associated with this mandate. An additional hash is included on \`payment_method_details\` with a name matching this value. It contains mandate information specific to the payment method.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    MandatePaymentMethodDetails -> Text
mandatePaymentMethodDetailsType :: Data.Text.Internal.Text
  }
  deriving
    ( Int -> MandatePaymentMethodDetails -> ShowS
[MandatePaymentMethodDetails] -> ShowS
MandatePaymentMethodDetails -> String
(Int -> MandatePaymentMethodDetails -> ShowS)
-> (MandatePaymentMethodDetails -> String)
-> ([MandatePaymentMethodDetails] -> ShowS)
-> Show MandatePaymentMethodDetails
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MandatePaymentMethodDetails] -> ShowS
$cshowList :: [MandatePaymentMethodDetails] -> ShowS
show :: MandatePaymentMethodDetails -> String
$cshow :: MandatePaymentMethodDetails -> String
showsPrec :: Int -> MandatePaymentMethodDetails -> ShowS
$cshowsPrec :: Int -> MandatePaymentMethodDetails -> ShowS
GHC.Show.Show,
      MandatePaymentMethodDetails -> MandatePaymentMethodDetails -> Bool
(MandatePaymentMethodDetails
 -> MandatePaymentMethodDetails -> Bool)
-> (MandatePaymentMethodDetails
    -> MandatePaymentMethodDetails -> Bool)
-> Eq MandatePaymentMethodDetails
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MandatePaymentMethodDetails -> MandatePaymentMethodDetails -> Bool
$c/= :: MandatePaymentMethodDetails -> MandatePaymentMethodDetails -> Bool
== :: MandatePaymentMethodDetails -> MandatePaymentMethodDetails -> Bool
$c== :: MandatePaymentMethodDetails -> MandatePaymentMethodDetails -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON MandatePaymentMethodDetails where
  toJSON :: MandatePaymentMethodDetails -> Value
toJSON MandatePaymentMethodDetails
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"acss_debit" Text -> Maybe MandateAcssDebit -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateAcssDebit
mandatePaymentMethodDetailsAcssDebit MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"au_becs_debit" Text -> Maybe MandateAuBecsDebit -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateAuBecsDebit
mandatePaymentMethodDetailsAuBecsDebit MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"bacs_debit" Text -> Maybe MandateBacsDebit -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateBacsDebit
mandatePaymentMethodDetailsBacsDebit MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"card" Text -> Maybe CardMandatePaymentMethodDetails -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails
-> Maybe CardMandatePaymentMethodDetails
mandatePaymentMethodDetailsCard MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"sepa_debit" Text -> Maybe MandateSepaDebit -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateSepaDebit
mandatePaymentMethodDetailsSepaDebit MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"type" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Text
mandatePaymentMethodDetailsType MandatePaymentMethodDetails
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: MandatePaymentMethodDetails -> Encoding
toEncoding MandatePaymentMethodDetails
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"acss_debit" Text -> Maybe MandateAcssDebit -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateAcssDebit
mandatePaymentMethodDetailsAcssDebit MandatePaymentMethodDetails
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"au_becs_debit" Text -> Maybe MandateAuBecsDebit -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateAuBecsDebit
mandatePaymentMethodDetailsAuBecsDebit MandatePaymentMethodDetails
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"bacs_debit" Text -> Maybe MandateBacsDebit -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateBacsDebit
mandatePaymentMethodDetailsBacsDebit MandatePaymentMethodDetails
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"card" Text -> Maybe CardMandatePaymentMethodDetails -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails
-> Maybe CardMandatePaymentMethodDetails
mandatePaymentMethodDetailsCard MandatePaymentMethodDetails
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"sepa_debit" Text -> Maybe MandateSepaDebit -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Maybe MandateSepaDebit
mandatePaymentMethodDetailsSepaDebit MandatePaymentMethodDetails
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> (Text
"type" Text -> Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= MandatePaymentMethodDetails -> Text
mandatePaymentMethodDetailsType MandatePaymentMethodDetails
obj))))))

instance Data.Aeson.Types.FromJSON.FromJSON MandatePaymentMethodDetails where
  parseJSON :: Value -> Parser MandatePaymentMethodDetails
parseJSON = String
-> (CardMandatePaymentMethodDetails
    -> Parser MandatePaymentMethodDetails)
-> Value
-> Parser MandatePaymentMethodDetails
forall a.
String
-> (CardMandatePaymentMethodDetails -> Parser a)
-> Value
-> Parser a
Data.Aeson.Types.FromJSON.withObject String
"MandatePaymentMethodDetails" (\CardMandatePaymentMethodDetails
obj -> ((((((Maybe MandateAcssDebit
 -> Maybe MandateAuBecsDebit
 -> Maybe MandateBacsDebit
 -> Maybe CardMandatePaymentMethodDetails
 -> Maybe MandateSepaDebit
 -> Text
 -> MandatePaymentMethodDetails)
-> Parser
     (Maybe MandateAcssDebit
      -> Maybe MandateAuBecsDebit
      -> Maybe MandateBacsDebit
      -> Maybe CardMandatePaymentMethodDetails
      -> Maybe MandateSepaDebit
      -> Text
      -> MandatePaymentMethodDetails)
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Maybe MandateAcssDebit
-> Maybe MandateAuBecsDebit
-> Maybe MandateBacsDebit
-> Maybe CardMandatePaymentMethodDetails
-> Maybe MandateSepaDebit
-> Text
-> MandatePaymentMethodDetails
MandatePaymentMethodDetails Parser
  (Maybe MandateAcssDebit
   -> Maybe MandateAuBecsDebit
   -> Maybe MandateBacsDebit
   -> Maybe CardMandatePaymentMethodDetails
   -> Maybe MandateSepaDebit
   -> Text
   -> MandatePaymentMethodDetails)
-> Parser (Maybe MandateAcssDebit)
-> Parser
     (Maybe MandateAuBecsDebit
      -> Maybe MandateBacsDebit
      -> Maybe CardMandatePaymentMethodDetails
      -> Maybe MandateSepaDebit
      -> Text
      -> MandatePaymentMethodDetails)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails
-> Text -> Parser (Maybe MandateAcssDebit)
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"acss_debit")) Parser
  (Maybe MandateAuBecsDebit
   -> Maybe MandateBacsDebit
   -> Maybe CardMandatePaymentMethodDetails
   -> Maybe MandateSepaDebit
   -> Text
   -> MandatePaymentMethodDetails)
-> Parser (Maybe MandateAuBecsDebit)
-> Parser
     (Maybe MandateBacsDebit
      -> Maybe CardMandatePaymentMethodDetails
      -> Maybe MandateSepaDebit
      -> Text
      -> MandatePaymentMethodDetails)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails
-> Text -> Parser (Maybe MandateAuBecsDebit)
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"au_becs_debit")) Parser
  (Maybe MandateBacsDebit
   -> Maybe CardMandatePaymentMethodDetails
   -> Maybe MandateSepaDebit
   -> Text
   -> MandatePaymentMethodDetails)
-> Parser (Maybe MandateBacsDebit)
-> Parser
     (Maybe CardMandatePaymentMethodDetails
      -> Maybe MandateSepaDebit -> Text -> MandatePaymentMethodDetails)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails
-> Text -> Parser (Maybe MandateBacsDebit)
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"bacs_debit")) Parser
  (Maybe CardMandatePaymentMethodDetails
   -> Maybe MandateSepaDebit -> Text -> MandatePaymentMethodDetails)
-> Parser (Maybe CardMandatePaymentMethodDetails)
-> Parser
     (Maybe MandateSepaDebit -> Text -> MandatePaymentMethodDetails)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails
-> Text -> Parser (Maybe CardMandatePaymentMethodDetails)
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"card")) Parser
  (Maybe MandateSepaDebit -> Text -> MandatePaymentMethodDetails)
-> Parser (Maybe MandateSepaDebit)
-> Parser (Text -> MandatePaymentMethodDetails)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails
-> Text -> Parser (Maybe MandateSepaDebit)
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"sepa_debit")) Parser (Text -> MandatePaymentMethodDetails)
-> Parser Text -> Parser MandatePaymentMethodDetails
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (CardMandatePaymentMethodDetails
obj CardMandatePaymentMethodDetails -> Text -> Parser Text
forall a.
FromJSON a =>
CardMandatePaymentMethodDetails -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"type"))

-- | Create a new 'MandatePaymentMethodDetails' with all required fields.
mkMandatePaymentMethodDetails ::
  -- | 'mandatePaymentMethodDetailsType'
  Data.Text.Internal.Text ->
  MandatePaymentMethodDetails
mkMandatePaymentMethodDetails :: Text -> MandatePaymentMethodDetails
mkMandatePaymentMethodDetails Text
mandatePaymentMethodDetailsType =
  MandatePaymentMethodDetails :: Maybe MandateAcssDebit
-> Maybe MandateAuBecsDebit
-> Maybe MandateBacsDebit
-> Maybe CardMandatePaymentMethodDetails
-> Maybe MandateSepaDebit
-> Text
-> MandatePaymentMethodDetails
MandatePaymentMethodDetails
    { mandatePaymentMethodDetailsAcssDebit :: Maybe MandateAcssDebit
mandatePaymentMethodDetailsAcssDebit = Maybe MandateAcssDebit
forall a. Maybe a
GHC.Maybe.Nothing,
      mandatePaymentMethodDetailsAuBecsDebit :: Maybe MandateAuBecsDebit
mandatePaymentMethodDetailsAuBecsDebit = Maybe MandateAuBecsDebit
forall a. Maybe a
GHC.Maybe.Nothing,
      mandatePaymentMethodDetailsBacsDebit :: Maybe MandateBacsDebit
mandatePaymentMethodDetailsBacsDebit = Maybe MandateBacsDebit
forall a. Maybe a
GHC.Maybe.Nothing,
      mandatePaymentMethodDetailsCard :: Maybe CardMandatePaymentMethodDetails
mandatePaymentMethodDetailsCard = Maybe CardMandatePaymentMethodDetails
forall a. Maybe a
GHC.Maybe.Nothing,
      mandatePaymentMethodDetailsSepaDebit :: Maybe MandateSepaDebit
mandatePaymentMethodDetailsSepaDebit = Maybe MandateSepaDebit
forall a. Maybe a
GHC.Maybe.Nothing,
      mandatePaymentMethodDetailsType :: Text
mandatePaymentMethodDetailsType = Text
mandatePaymentMethodDetailsType
    }