{-# 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 TransferSchedule
module StripeAPI.Types.TransferSchedule 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 qualified Prelude as GHC.Integer.Type
import qualified Prelude as GHC.Maybe

-- | Defines the object schema located at @components.schemas.transfer_schedule@ in the specification.
data TransferSchedule = TransferSchedule
  { -- | delay_days: The number of days charges for the account will be held before being paid out.
    TransferSchedule -> Int
transferScheduleDelayDays :: GHC.Types.Int,
    -- | interval: How frequently funds will be paid out. One of \`manual\` (payouts only created via API call), \`daily\`, \`weekly\`, or \`monthly\`.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    TransferSchedule -> Text
transferScheduleInterval :: Data.Text.Internal.Text,
    -- | monthly_anchor: The day of the month funds will be paid out. Only shown if \`interval\` is monthly. Payouts scheduled between the 29th and 31st of the month are sent on the last day of shorter months.
    TransferSchedule -> Maybe Int
transferScheduleMonthlyAnchor :: (GHC.Maybe.Maybe GHC.Types.Int),
    -- | weekly_anchor: The day of the week funds will be paid out, of the style \'monday\', \'tuesday\', etc. Only shown if \`interval\` is weekly.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    TransferSchedule -> Maybe Text
transferScheduleWeeklyAnchor :: (GHC.Maybe.Maybe Data.Text.Internal.Text)
  }
  deriving
    ( Int -> TransferSchedule -> ShowS
[TransferSchedule] -> ShowS
TransferSchedule -> String
(Int -> TransferSchedule -> ShowS)
-> (TransferSchedule -> String)
-> ([TransferSchedule] -> ShowS)
-> Show TransferSchedule
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferSchedule] -> ShowS
$cshowList :: [TransferSchedule] -> ShowS
show :: TransferSchedule -> String
$cshow :: TransferSchedule -> String
showsPrec :: Int -> TransferSchedule -> ShowS
$cshowsPrec :: Int -> TransferSchedule -> ShowS
GHC.Show.Show,
      TransferSchedule -> TransferSchedule -> Bool
(TransferSchedule -> TransferSchedule -> Bool)
-> (TransferSchedule -> TransferSchedule -> Bool)
-> Eq TransferSchedule
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransferSchedule -> TransferSchedule -> Bool
$c/= :: TransferSchedule -> TransferSchedule -> Bool
== :: TransferSchedule -> TransferSchedule -> Bool
$c== :: TransferSchedule -> TransferSchedule -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON TransferSchedule where
  toJSON :: TransferSchedule -> Value
toJSON TransferSchedule
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"delay_days" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Int
transferScheduleDelayDays TransferSchedule
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"interval" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Text
transferScheduleInterval TransferSchedule
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"monthly_anchor" Text -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Maybe Int
transferScheduleMonthlyAnchor TransferSchedule
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"weekly_anchor" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Maybe Text
transferScheduleWeeklyAnchor TransferSchedule
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: TransferSchedule -> Encoding
toEncoding TransferSchedule
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"delay_days" Text -> Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Int
transferScheduleDelayDays TransferSchedule
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"interval" Text -> Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Text
transferScheduleInterval TransferSchedule
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"monthly_anchor" Text -> Maybe Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Maybe Int
transferScheduleMonthlyAnchor TransferSchedule
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> (Text
"weekly_anchor" Text -> Maybe Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= TransferSchedule -> Maybe Text
transferScheduleWeeklyAnchor TransferSchedule
obj))))

instance Data.Aeson.Types.FromJSON.FromJSON TransferSchedule where
  parseJSON :: Value -> Parser TransferSchedule
parseJSON = String
-> (Object -> Parser TransferSchedule)
-> Value
-> Parser TransferSchedule
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.Aeson.Types.FromJSON.withObject String
"TransferSchedule" (\Object
obj -> ((((Int -> Text -> Maybe Int -> Maybe Text -> TransferSchedule)
-> Parser
     (Int -> Text -> Maybe Int -> Maybe Text -> TransferSchedule)
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Int -> Text -> Maybe Int -> Maybe Text -> TransferSchedule
TransferSchedule Parser (Int -> Text -> Maybe Int -> Maybe Text -> TransferSchedule)
-> Parser Int
-> Parser (Text -> Maybe Int -> Maybe Text -> TransferSchedule)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"delay_days")) Parser (Text -> Maybe Int -> Maybe Text -> TransferSchedule)
-> Parser Text
-> Parser (Maybe Int -> Maybe Text -> TransferSchedule)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"interval")) Parser (Maybe Int -> Maybe Text -> TransferSchedule)
-> Parser (Maybe Int) -> Parser (Maybe Text -> TransferSchedule)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"monthly_anchor")) Parser (Maybe Text -> TransferSchedule)
-> Parser (Maybe Text) -> Parser TransferSchedule
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"weekly_anchor"))

-- | Create a new 'TransferSchedule' with all required fields.
mkTransferSchedule ::
  -- | 'transferScheduleDelayDays'
  GHC.Types.Int ->
  -- | 'transferScheduleInterval'
  Data.Text.Internal.Text ->
  TransferSchedule
mkTransferSchedule :: Int -> Text -> TransferSchedule
mkTransferSchedule Int
transferScheduleDelayDays Text
transferScheduleInterval =
  TransferSchedule :: Int -> Text -> Maybe Int -> Maybe Text -> TransferSchedule
TransferSchedule
    { transferScheduleDelayDays :: Int
transferScheduleDelayDays = Int
transferScheduleDelayDays,
      transferScheduleInterval :: Text
transferScheduleInterval = Text
transferScheduleInterval,
      transferScheduleMonthlyAnchor :: Maybe Int
transferScheduleMonthlyAnchor = Maybe Int
forall a. Maybe a
GHC.Maybe.Nothing,
      transferScheduleWeeklyAnchor :: Maybe Text
transferScheduleWeeklyAnchor = Maybe Text
forall a. Maybe a
GHC.Maybe.Nothing
    }