packages feed

gogol-android-publisher-1.0.0: gen/Gogol/AndroidPublisher/Internal/Product.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- |
-- Module      : Gogol.AndroidPublisher.Internal.Product
-- Copyright   : (c) 2015-2025 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+gogol@gmail.com>
--               Toni Cebrián <toni@tonicebrian.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Gogol.AndroidPublisher.Internal.Product
  ( -- * Abi
    Abi (..),
    newAbi,

    -- * AbiTargeting
    AbiTargeting (..),
    newAbiTargeting,

    -- * AcquisitionTargetingRule
    AcquisitionTargetingRule (..),
    newAcquisitionTargetingRule,

    -- * ActivateBasePlanRequest
    ActivateBasePlanRequest (..),
    newActivateBasePlanRequest,

    -- * ActivateSubscriptionOfferRequest
    ActivateSubscriptionOfferRequest (..),
    newActivateSubscriptionOfferRequest,

    -- * AddTargetingRequest
    AddTargetingRequest (..),
    newAddTargetingRequest,

    -- * AddTargetingResponse
    AddTargetingResponse (..),
    newAddTargetingResponse,

    -- * AllUsers
    AllUsers (..),
    newAllUsers,

    -- * AndroidSdks
    AndroidSdks (..),
    newAndroidSdks,

    -- * Apk
    Apk (..),
    newApk,

    -- * ApkBinary
    ApkBinary (..),
    newApkBinary,

    -- * ApkDescription
    ApkDescription (..),
    newApkDescription,

    -- * ApkSet
    ApkSet (..),
    newApkSet,

    -- * ApkTargeting
    ApkTargeting (..),
    newApkTargeting,

    -- * ApksAddExternallyHostedRequest
    ApksAddExternallyHostedRequest (..),
    newApksAddExternallyHostedRequest,

    -- * ApksAddExternallyHostedResponse
    ApksAddExternallyHostedResponse (..),
    newApksAddExternallyHostedResponse,

    -- * ApksListResponse
    ApksListResponse (..),
    newApksListResponse,

    -- * AppDetails
    AppDetails (..),
    newAppDetails,

    -- * AppEdit
    AppEdit (..),
    newAppEdit,

    -- * AppRecoveryAction
    AppRecoveryAction (..),
    newAppRecoveryAction,

    -- * AppVersionList
    AppVersionList (..),
    newAppVersionList,

    -- * AppVersionRange
    AppVersionRange (..),
    newAppVersionRange,

    -- * ArchiveSubscriptionRequest
    ArchiveSubscriptionRequest (..),
    newArchiveSubscriptionRequest,

    -- * AssetModuleMetadata
    AssetModuleMetadata (..),
    newAssetModuleMetadata,

    -- * AssetSliceSet
    AssetSliceSet (..),
    newAssetSliceSet,

    -- * AutoRenewingBasePlanType
    AutoRenewingBasePlanType (..),
    newAutoRenewingBasePlanType,

    -- * AutoRenewingPlan
    AutoRenewingPlan (..),
    newAutoRenewingPlan,

    -- * BasePlan
    BasePlan (..),
    newBasePlan,

    -- * BatchGetSubscriptionOffersRequest
    BatchGetSubscriptionOffersRequest (..),
    newBatchGetSubscriptionOffersRequest,

    -- * BatchGetSubscriptionOffersResponse
    BatchGetSubscriptionOffersResponse (..),
    newBatchGetSubscriptionOffersResponse,

    -- * BatchGetSubscriptionsResponse
    BatchGetSubscriptionsResponse (..),
    newBatchGetSubscriptionsResponse,

    -- * BatchMigrateBasePlanPricesRequest
    BatchMigrateBasePlanPricesRequest (..),
    newBatchMigrateBasePlanPricesRequest,

    -- * BatchMigrateBasePlanPricesResponse
    BatchMigrateBasePlanPricesResponse (..),
    newBatchMigrateBasePlanPricesResponse,

    -- * BatchUpdateBasePlanStatesRequest
    BatchUpdateBasePlanStatesRequest (..),
    newBatchUpdateBasePlanStatesRequest,

    -- * BatchUpdateBasePlanStatesResponse
    BatchUpdateBasePlanStatesResponse (..),
    newBatchUpdateBasePlanStatesResponse,

    -- * BatchUpdateSubscriptionOfferStatesRequest
    BatchUpdateSubscriptionOfferStatesRequest (..),
    newBatchUpdateSubscriptionOfferStatesRequest,

    -- * BatchUpdateSubscriptionOfferStatesResponse
    BatchUpdateSubscriptionOfferStatesResponse (..),
    newBatchUpdateSubscriptionOfferStatesResponse,

    -- * BatchUpdateSubscriptionOffersRequest
    BatchUpdateSubscriptionOffersRequest (..),
    newBatchUpdateSubscriptionOffersRequest,

    -- * BatchUpdateSubscriptionOffersResponse
    BatchUpdateSubscriptionOffersResponse (..),
    newBatchUpdateSubscriptionOffersResponse,

    -- * BatchUpdateSubscriptionsRequest
    BatchUpdateSubscriptionsRequest (..),
    newBatchUpdateSubscriptionsRequest,

    -- * BatchUpdateSubscriptionsResponse
    BatchUpdateSubscriptionsResponse (..),
    newBatchUpdateSubscriptionsResponse,

    -- * Bundle
    Bundle (..),
    newBundle,

    -- * BundlesListResponse
    BundlesListResponse (..),
    newBundlesListResponse,

    -- * CancelAppRecoveryRequest
    CancelAppRecoveryRequest (..),
    newCancelAppRecoveryRequest,

    -- * CancelAppRecoveryResponse
    CancelAppRecoveryResponse (..),
    newCancelAppRecoveryResponse,

    -- * CancelSurveyResult
    CancelSurveyResult (..),
    newCancelSurveyResult,

    -- * CanceledStateContext
    CanceledStateContext (..),
    newCanceledStateContext,

    -- * Comment
    Comment (..),
    newComment,

    -- * ConvertRegionPricesRequest
    ConvertRegionPricesRequest (..),
    newConvertRegionPricesRequest,

    -- * ConvertRegionPricesResponse
    ConvertRegionPricesResponse (..),
    newConvertRegionPricesResponse,

    -- * ConvertRegionPricesResponse_ConvertedRegionPrices
    ConvertRegionPricesResponse_ConvertedRegionPrices (..),
    newConvertRegionPricesResponse_ConvertedRegionPrices,

    -- * ConvertedOtherRegionsPrice
    ConvertedOtherRegionsPrice (..),
    newConvertedOtherRegionsPrice,

    -- * ConvertedRegionPrice
    ConvertedRegionPrice (..),
    newConvertedRegionPrice,

    -- * CountryTargeting
    CountryTargeting (..),
    newCountryTargeting,

    -- * CreateDraftAppRecoveryRequest
    CreateDraftAppRecoveryRequest (..),
    newCreateDraftAppRecoveryRequest,

    -- * DeactivateBasePlanRequest
    DeactivateBasePlanRequest (..),
    newDeactivateBasePlanRequest,

    -- * DeactivateSubscriptionOfferRequest
    DeactivateSubscriptionOfferRequest (..),
    newDeactivateSubscriptionOfferRequest,

    -- * DeferredItemReplacement
    DeferredItemReplacement (..),
    newDeferredItemReplacement,

    -- * DeobfuscationFile
    DeobfuscationFile (..),
    newDeobfuscationFile,

    -- * DeobfuscationFilesUploadResponse
    DeobfuscationFilesUploadResponse (..),
    newDeobfuscationFilesUploadResponse,

    -- * DeployAppRecoveryRequest
    DeployAppRecoveryRequest (..),
    newDeployAppRecoveryRequest,

    -- * DeployAppRecoveryResponse
    DeployAppRecoveryResponse (..),
    newDeployAppRecoveryResponse,

    -- * DeveloperComment
    DeveloperComment (..),
    newDeveloperComment,

    -- * DeveloperInitiatedCancellation
    DeveloperInitiatedCancellation (..),
    newDeveloperInitiatedCancellation,

    -- * DeviceFeature
    DeviceFeature (..),
    newDeviceFeature,

    -- * DeviceFeatureTargeting
    DeviceFeatureTargeting (..),
    newDeviceFeatureTargeting,

    -- * DeviceGroup
    DeviceGroup (..),
    newDeviceGroup,

    -- * DeviceId
    DeviceId (..),
    newDeviceId,

    -- * DeviceMetadata
    DeviceMetadata (..),
    newDeviceMetadata,

    -- * DeviceRam
    DeviceRam (..),
    newDeviceRam,

    -- * DeviceSelector
    DeviceSelector (..),
    newDeviceSelector,

    -- * DeviceSpec
    DeviceSpec (..),
    newDeviceSpec,

    -- * DeviceTier
    DeviceTier (..),
    newDeviceTier,

    -- * DeviceTierConfig
    DeviceTierConfig (..),
    newDeviceTierConfig,

    -- * DeviceTierSet
    DeviceTierSet (..),
    newDeviceTierSet,

    -- * ExpansionFile
    ExpansionFile (..),
    newExpansionFile,

    -- * ExpansionFilesUploadResponse
    ExpansionFilesUploadResponse (..),
    newExpansionFilesUploadResponse,

    -- * ExternalAccountIdentifiers
    ExternalAccountIdentifiers (..),
    newExternalAccountIdentifiers,

    -- * ExternalSubscription
    ExternalSubscription (..),
    newExternalSubscription,

    -- * ExternalTransaction
    ExternalTransaction (..),
    newExternalTransaction,

    -- * ExternalTransactionAddress
    ExternalTransactionAddress (..),
    newExternalTransactionAddress,

    -- * ExternalTransactionTestPurchase
    ExternalTransactionTestPurchase (..),
    newExternalTransactionTestPurchase,

    -- * ExternallyHostedApk
    ExternallyHostedApk (..),
    newExternallyHostedApk,

    -- * FullRefund
    FullRefund (..),
    newFullRefund,

    -- * GeneratedApksListResponse
    GeneratedApksListResponse (..),
    newGeneratedApksListResponse,

    -- * GeneratedApksPerSigningKey
    GeneratedApksPerSigningKey (..),
    newGeneratedApksPerSigningKey,

    -- * GeneratedAssetPackSlice
    GeneratedAssetPackSlice (..),
    newGeneratedAssetPackSlice,

    -- * GeneratedRecoveryApk
    GeneratedRecoveryApk (..),
    newGeneratedRecoveryApk,

    -- * GeneratedSplitApk
    GeneratedSplitApk (..),
    newGeneratedSplitApk,

    -- * GeneratedStandaloneApk
    GeneratedStandaloneApk (..),
    newGeneratedStandaloneApk,

    -- * GeneratedUniversalApk
    GeneratedUniversalApk (..),
    newGeneratedUniversalApk,

    -- * GetSubscriptionOfferRequest
    GetSubscriptionOfferRequest (..),
    newGetSubscriptionOfferRequest,

    -- * Grant
    Grant (..),
    newGrant,

    -- * Image
    Image (..),
    newImage,

    -- * ImagesDeleteAllResponse
    ImagesDeleteAllResponse (..),
    newImagesDeleteAllResponse,

    -- * ImagesListResponse
    ImagesListResponse (..),
    newImagesListResponse,

    -- * ImagesUploadResponse
    ImagesUploadResponse (..),
    newImagesUploadResponse,

    -- * InAppProduct
    InAppProduct (..),
    newInAppProduct,

    -- * InAppProduct_Listings
    InAppProduct_Listings (..),
    newInAppProduct_Listings,

    -- * InAppProduct_Prices
    InAppProduct_Prices (..),
    newInAppProduct_Prices,

    -- * InAppProductListing
    InAppProductListing (..),
    newInAppProductListing,

    -- * InappproductsBatchDeleteRequest
    InappproductsBatchDeleteRequest (..),
    newInappproductsBatchDeleteRequest,

    -- * InappproductsBatchGetResponse
    InappproductsBatchGetResponse (..),
    newInappproductsBatchGetResponse,

    -- * InappproductsBatchUpdateRequest
    InappproductsBatchUpdateRequest (..),
    newInappproductsBatchUpdateRequest,

    -- * InappproductsBatchUpdateResponse
    InappproductsBatchUpdateResponse (..),
    newInappproductsBatchUpdateResponse,

    -- * InappproductsDeleteRequest
    InappproductsDeleteRequest (..),
    newInappproductsDeleteRequest,

    -- * InappproductsListResponse
    InappproductsListResponse (..),
    newInappproductsListResponse,

    -- * InappproductsUpdateRequest
    InappproductsUpdateRequest (..),
    newInappproductsUpdateRequest,

    -- * InstallmentPlan
    InstallmentPlan (..),
    newInstallmentPlan,

    -- * InstallmentsBasePlanType
    InstallmentsBasePlanType (..),
    newInstallmentsBasePlanType,

    -- * InternalAppSharingArtifact
    InternalAppSharingArtifact (..),
    newInternalAppSharingArtifact,

    -- * IntroductoryPriceInfo
    IntroductoryPriceInfo (..),
    newIntroductoryPriceInfo,

    -- * LanguageTargeting
    LanguageTargeting (..),
    newLanguageTargeting,

    -- * ListAppRecoveriesResponse
    ListAppRecoveriesResponse (..),
    newListAppRecoveriesResponse,

    -- * ListDeviceTierConfigsResponse
    ListDeviceTierConfigsResponse (..),
    newListDeviceTierConfigsResponse,

    -- * ListSubscriptionOffersResponse
    ListSubscriptionOffersResponse (..),
    newListSubscriptionOffersResponse,

    -- * ListSubscriptionsResponse
    ListSubscriptionsResponse (..),
    newListSubscriptionsResponse,

    -- * ListUsersResponse
    ListUsersResponse (..),
    newListUsersResponse,

    -- * Listing
    Listing (..),
    newListing,

    -- * ListingsListResponse
    ListingsListResponse (..),
    newListingsListResponse,

    -- * LocalizedText
    LocalizedText (..),
    newLocalizedText,

    -- * ManagedProductTaxAndComplianceSettings
    ManagedProductTaxAndComplianceSettings (..),
    newManagedProductTaxAndComplianceSettings,

    -- * ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
    ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode (..),
    newManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode,

    -- * MigrateBasePlanPricesRequest
    MigrateBasePlanPricesRequest (..),
    newMigrateBasePlanPricesRequest,

    -- * MigrateBasePlanPricesResponse
    MigrateBasePlanPricesResponse (..),
    newMigrateBasePlanPricesResponse,

    -- * ModuleMetadata
    ModuleMetadata (..),
    newModuleMetadata,

    -- * ModuleTargeting
    ModuleTargeting (..),
    newModuleTargeting,

    -- * Money
    Money (..),
    newMoney,

    -- * MultiAbi
    MultiAbi (..),
    newMultiAbi,

    -- * MultiAbiTargeting
    MultiAbiTargeting (..),
    newMultiAbiTargeting,

    -- * OfferDetails
    OfferDetails (..),
    newOfferDetails,

    -- * OfferTag
    OfferTag (..),
    newOfferTag,

    -- * OneTimeCode
    OneTimeCode (..),
    newOneTimeCode,

    -- * OneTimeExternalTransaction
    OneTimeExternalTransaction (..),
    newOneTimeExternalTransaction,

    -- * OtherRecurringProduct
    OtherRecurringProduct (..),
    newOtherRecurringProduct,

    -- * OtherRegionsBasePlanConfig
    OtherRegionsBasePlanConfig (..),
    newOtherRegionsBasePlanConfig,

    -- * OtherRegionsSubscriptionOfferConfig
    OtherRegionsSubscriptionOfferConfig (..),
    newOtherRegionsSubscriptionOfferConfig,

    -- * OtherRegionsSubscriptionOfferPhaseConfig
    OtherRegionsSubscriptionOfferPhaseConfig (..),
    newOtherRegionsSubscriptionOfferPhaseConfig,

    -- * OtherRegionsSubscriptionOfferPhaseFreePriceOverride
    OtherRegionsSubscriptionOfferPhaseFreePriceOverride (..),
    newOtherRegionsSubscriptionOfferPhaseFreePriceOverride,

    -- * OtherRegionsSubscriptionOfferPhasePrices
    OtherRegionsSubscriptionOfferPhasePrices (..),
    newOtherRegionsSubscriptionOfferPhasePrices,

    -- * PageInfo
    PageInfo (..),
    newPageInfo,

    -- * PartialRefund
    PartialRefund (..),
    newPartialRefund,

    -- * PausedStateContext
    PausedStateContext (..),
    newPausedStateContext,

    -- * PendingCancellation
    PendingCancellation (..),
    newPendingCancellation,

    -- * PrepaidBasePlanType
    PrepaidBasePlanType (..),
    newPrepaidBasePlanType,

    -- * PrepaidPlan
    PrepaidPlan (..),
    newPrepaidPlan,

    -- * Price
    Price (..),
    newPrice,

    -- * ProductPurchase
    ProductPurchase (..),
    newProductPurchase,

    -- * ProductPurchasesAcknowledgeRequest
    ProductPurchasesAcknowledgeRequest (..),
    newProductPurchasesAcknowledgeRequest,

    -- * RecurringExternalTransaction
    RecurringExternalTransaction (..),
    newRecurringExternalTransaction,

    -- * RefundExternalTransactionRequest
    RefundExternalTransactionRequest (..),
    newRefundExternalTransactionRequest,

    -- * RegionalBasePlanConfig
    RegionalBasePlanConfig (..),
    newRegionalBasePlanConfig,

    -- * RegionalPriceMigrationConfig
    RegionalPriceMigrationConfig (..),
    newRegionalPriceMigrationConfig,

    -- * RegionalSubscriptionOfferConfig
    RegionalSubscriptionOfferConfig (..),
    newRegionalSubscriptionOfferConfig,

    -- * RegionalSubscriptionOfferPhaseConfig
    RegionalSubscriptionOfferPhaseConfig (..),
    newRegionalSubscriptionOfferPhaseConfig,

    -- * RegionalSubscriptionOfferPhaseFreePriceOverride
    RegionalSubscriptionOfferPhaseFreePriceOverride (..),
    newRegionalSubscriptionOfferPhaseFreePriceOverride,

    -- * RegionalTaxRateInfo
    RegionalTaxRateInfo (..),
    newRegionalTaxRateInfo,

    -- * Regions
    Regions (..),
    newRegions,

    -- * RegionsVersion
    RegionsVersion (..),
    newRegionsVersion,

    -- * RemoteInAppUpdate
    RemoteInAppUpdate (..),
    newRemoteInAppUpdate,

    -- * RemoteInAppUpdateData
    RemoteInAppUpdateData (..),
    newRemoteInAppUpdateData,

    -- * RemoteInAppUpdateDataPerBundle
    RemoteInAppUpdateDataPerBundle (..),
    newRemoteInAppUpdateDataPerBundle,

    -- * ReplacementCancellation
    ReplacementCancellation (..),
    newReplacementCancellation,

    -- * RestrictedPaymentCountries
    RestrictedPaymentCountries (..),
    newRestrictedPaymentCountries,

    -- * Review
    Review (..),
    newReview,

    -- * ReviewReplyResult
    ReviewReplyResult (..),
    newReviewReplyResult,

    -- * ReviewsListResponse
    ReviewsListResponse (..),
    newReviewsListResponse,

    -- * ReviewsReplyRequest
    ReviewsReplyRequest (..),
    newReviewsReplyRequest,

    -- * ReviewsReplyResponse
    ReviewsReplyResponse (..),
    newReviewsReplyResponse,

    -- * RevocationContext
    RevocationContext (..),
    newRevocationContext,

    -- * RevocationContextFullRefund
    RevocationContextFullRefund (..),
    newRevocationContextFullRefund,

    -- * RevocationContextProratedRefund
    RevocationContextProratedRefund (..),
    newRevocationContextProratedRefund,

    -- * RevokeSubscriptionPurchaseRequest
    RevokeSubscriptionPurchaseRequest (..),
    newRevokeSubscriptionPurchaseRequest,

    -- * RevokeSubscriptionPurchaseResponse
    RevokeSubscriptionPurchaseResponse (..),
    newRevokeSubscriptionPurchaseResponse,

    -- * SafetyLabelsUpdateRequest
    SafetyLabelsUpdateRequest (..),
    newSafetyLabelsUpdateRequest,

    -- * SafetyLabelsUpdateResponse
    SafetyLabelsUpdateResponse (..),
    newSafetyLabelsUpdateResponse,

    -- * ScreenDensity
    ScreenDensity (..),
    newScreenDensity,

    -- * ScreenDensityTargeting
    ScreenDensityTargeting (..),
    newScreenDensityTargeting,

    -- * SdkVersion
    SdkVersion (..),
    newSdkVersion,

    -- * SdkVersionTargeting
    SdkVersionTargeting (..),
    newSdkVersionTargeting,

    -- * SignupPromotion
    SignupPromotion (..),
    newSignupPromotion,

    -- * SplitApkMetadata
    SplitApkMetadata (..),
    newSplitApkMetadata,

    -- * SplitApkVariant
    SplitApkVariant (..),
    newSplitApkVariant,

    -- * StandaloneApkMetadata
    StandaloneApkMetadata (..),
    newStandaloneApkMetadata,

    -- * SubscribeWithGoogleInfo
    SubscribeWithGoogleInfo (..),
    newSubscribeWithGoogleInfo,

    -- * Subscription
    Subscription (..),
    newSubscription,

    -- * SubscriptionCancelSurveyResult
    SubscriptionCancelSurveyResult (..),
    newSubscriptionCancelSurveyResult,

    -- * SubscriptionDeferralInfo
    SubscriptionDeferralInfo (..),
    newSubscriptionDeferralInfo,

    -- * SubscriptionItemPriceChangeDetails
    SubscriptionItemPriceChangeDetails (..),
    newSubscriptionItemPriceChangeDetails,

    -- * SubscriptionListing
    SubscriptionListing (..),
    newSubscriptionListing,

    -- * SubscriptionOffer
    SubscriptionOffer (..),
    newSubscriptionOffer,

    -- * SubscriptionOfferPhase
    SubscriptionOfferPhase (..),
    newSubscriptionOfferPhase,

    -- * SubscriptionOfferTargeting
    SubscriptionOfferTargeting (..),
    newSubscriptionOfferTargeting,

    -- * SubscriptionPriceChange
    SubscriptionPriceChange (..),
    newSubscriptionPriceChange,

    -- * SubscriptionPurchase
    SubscriptionPurchase (..),
    newSubscriptionPurchase,

    -- * SubscriptionPurchaseLineItem
    SubscriptionPurchaseLineItem (..),
    newSubscriptionPurchaseLineItem,

    -- * SubscriptionPurchaseV2
    SubscriptionPurchaseV2 (..),
    newSubscriptionPurchaseV2,

    -- * SubscriptionPurchasesAcknowledgeRequest
    SubscriptionPurchasesAcknowledgeRequest (..),
    newSubscriptionPurchasesAcknowledgeRequest,

    -- * SubscriptionPurchasesDeferRequest
    SubscriptionPurchasesDeferRequest (..),
    newSubscriptionPurchasesDeferRequest,

    -- * SubscriptionPurchasesDeferResponse
    SubscriptionPurchasesDeferResponse (..),
    newSubscriptionPurchasesDeferResponse,

    -- * SubscriptionTaxAndComplianceSettings
    SubscriptionTaxAndComplianceSettings (..),
    newSubscriptionTaxAndComplianceSettings,

    -- * SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
    SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode (..),
    newSubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode,

    -- * SystemApkOptions
    SystemApkOptions (..),
    newSystemApkOptions,

    -- * SystemApksListResponse
    SystemApksListResponse (..),
    newSystemApksListResponse,

    -- * SystemFeature
    SystemFeature (..),
    newSystemFeature,

    -- * SystemInitiatedCancellation
    SystemInitiatedCancellation (..),
    newSystemInitiatedCancellation,

    -- * SystemOnChip
    SystemOnChip (..),
    newSystemOnChip,

    -- * Targeting
    Targeting (..),
    newTargeting,

    -- * TargetingInfo
    TargetingInfo (..),
    newTargetingInfo,

    -- * TargetingRuleScope
    TargetingRuleScope (..),
    newTargetingRuleScope,

    -- * TargetingRuleScopeAnySubscriptionInApp
    TargetingRuleScopeAnySubscriptionInApp (..),
    newTargetingRuleScopeAnySubscriptionInApp,

    -- * TargetingRuleScopeThisSubscription
    TargetingRuleScopeThisSubscription (..),
    newTargetingRuleScopeThisSubscription,

    -- * TargetingUpdate
    TargetingUpdate (..),
    newTargetingUpdate,

    -- * TestPurchase
    TestPurchase (..),
    newTestPurchase,

    -- * Testers
    Testers (..),
    newTesters,

    -- * TextureCompressionFormat
    TextureCompressionFormat (..),
    newTextureCompressionFormat,

    -- * TextureCompressionFormatTargeting
    TextureCompressionFormatTargeting (..),
    newTextureCompressionFormatTargeting,

    -- * Timestamp
    Timestamp (..),
    newTimestamp,

    -- * TokenPagination
    TokenPagination (..),
    newTokenPagination,

    -- * Track
    Track (..),
    newTrack,

    -- * TrackConfig
    TrackConfig (..),
    newTrackConfig,

    -- * TrackCountryAvailability
    TrackCountryAvailability (..),
    newTrackCountryAvailability,

    -- * TrackRelease
    TrackRelease (..),
    newTrackRelease,

    -- * TrackTargetedCountry
    TrackTargetedCountry (..),
    newTrackTargetedCountry,

    -- * TracksListResponse
    TracksListResponse (..),
    newTracksListResponse,

    -- * UpdateBasePlanStateRequest
    UpdateBasePlanStateRequest (..),
    newUpdateBasePlanStateRequest,

    -- * UpdateSubscriptionOfferRequest
    UpdateSubscriptionOfferRequest (..),
    newUpdateSubscriptionOfferRequest,

    -- * UpdateSubscriptionOfferStateRequest
    UpdateSubscriptionOfferStateRequest (..),
    newUpdateSubscriptionOfferStateRequest,

    -- * UpdateSubscriptionRequest
    UpdateSubscriptionRequest (..),
    newUpdateSubscriptionRequest,

    -- * UpgradeTargetingRule
    UpgradeTargetingRule (..),
    newUpgradeTargetingRule,

    -- * User
    User (..),
    newUser,

    -- * UserComment
    UserComment (..),
    newUserComment,

    -- * UserCountriesTargeting
    UserCountriesTargeting (..),
    newUserCountriesTargeting,

    -- * UserCountrySet
    UserCountrySet (..),
    newUserCountrySet,

    -- * UserInitiatedCancellation
    UserInitiatedCancellation (..),
    newUserInitiatedCancellation,

    -- * UsesPermission
    UsesPermission (..),
    newUsesPermission,

    -- * VanityCode
    VanityCode (..),
    newVanityCode,

    -- * Variant
    Variant (..),
    newVariant,

    -- * VariantTargeting
    VariantTargeting (..),
    newVariantTargeting,

    -- * VoidedPurchase
    VoidedPurchase (..),
    newVoidedPurchase,

    -- * VoidedPurchasesListResponse
    VoidedPurchasesListResponse (..),
    newVoidedPurchasesListResponse,
  )
where

import Gogol.AndroidPublisher.Internal.Sum
import Gogol.Prelude qualified as Core

-- | Represents an Abi.
--
-- /See:/ 'newAbi' smart constructor.
newtype Abi = Abi
  { -- | Alias for an abi.
    alias :: (Core.Maybe Abi_Alias)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Abi' with the minimum fields required to make a request.
newAbi ::
  Abi
newAbi = Abi {alias = Core.Nothing}

instance Core.FromJSON Abi where
  parseJSON =
    Core.withObject "Abi" (\o -> Abi Core.<$> (o Core..:? "alias"))

instance Core.ToJSON Abi where
  toJSON Abi {..} =
    Core.object (Core.catMaybes [("alias" Core..=) Core.<$> alias])

-- | Targeting based on Abi.
--
-- /See:/ 'newAbiTargeting' smart constructor.
data AbiTargeting = AbiTargeting
  { -- | Targeting of other sibling directories that were in the Bundle. For main splits this is targeting of other main splits.
    alternatives :: (Core.Maybe [Abi]),
    -- | Value of an abi.
    value :: (Core.Maybe [Abi])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AbiTargeting' with the minimum fields required to make a request.
newAbiTargeting ::
  AbiTargeting
newAbiTargeting =
  AbiTargeting {alternatives = Core.Nothing, value = Core.Nothing}

instance Core.FromJSON AbiTargeting where
  parseJSON =
    Core.withObject
      "AbiTargeting"
      ( \o ->
          AbiTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON AbiTargeting where
  toJSON AbiTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | Represents a targeting rule of the form: User never had {scope} before.
--
-- /See:/ 'newAcquisitionTargetingRule' smart constructor.
newtype AcquisitionTargetingRule = AcquisitionTargetingRule
  { -- | Required. The scope of subscriptions this rule considers. Only allows \"this subscription\" and \"any subscription in app\".
    scope :: (Core.Maybe TargetingRuleScope)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AcquisitionTargetingRule' with the minimum fields required to make a request.
newAcquisitionTargetingRule ::
  AcquisitionTargetingRule
newAcquisitionTargetingRule =
  AcquisitionTargetingRule {scope = Core.Nothing}

instance Core.FromJSON AcquisitionTargetingRule where
  parseJSON =
    Core.withObject
      "AcquisitionTargetingRule"
      (\o -> AcquisitionTargetingRule Core.<$> (o Core..:? "scope"))

instance Core.ToJSON AcquisitionTargetingRule where
  toJSON AcquisitionTargetingRule {..} =
    Core.object (Core.catMaybes [("scope" Core..=) Core.<$> scope])

-- | Request message for ActivateBasePlan.
--
-- /See:/ 'newActivateBasePlanRequest' smart constructor.
data ActivateBasePlanRequest = ActivateBasePlanRequest
  { -- | Required. The unique base plan ID of the base plan to activate.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe ActivateBasePlanRequest_LatencyTolerance),
    -- | Required. The parent app (package name) of the base plan to activate.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The parent subscription (ID) of the base plan to activate.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ActivateBasePlanRequest' with the minimum fields required to make a request.
newActivateBasePlanRequest ::
  ActivateBasePlanRequest
newActivateBasePlanRequest =
  ActivateBasePlanRequest
    { basePlanId = Core.Nothing,
      latencyTolerance = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing
    }

instance Core.FromJSON ActivateBasePlanRequest where
  parseJSON =
    Core.withObject
      "ActivateBasePlanRequest"
      ( \o ->
          ActivateBasePlanRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
      )

instance Core.ToJSON ActivateBasePlanRequest where
  toJSON ActivateBasePlanRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId
          ]
      )

-- | Request message for ActivateSubscriptionOffer.
--
-- /See:/ 'newActivateSubscriptionOfferRequest' smart constructor.
data ActivateSubscriptionOfferRequest = ActivateSubscriptionOfferRequest
  { -- | Required. The parent base plan (ID) of the offer to activate.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe ActivateSubscriptionOfferRequest_LatencyTolerance),
    -- | Required. The unique offer ID of the offer to activate.
    offerId :: (Core.Maybe Core.Text),
    -- | Required. The parent app (package name) of the offer to activate.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The parent subscription (ID) of the offer to activate.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ActivateSubscriptionOfferRequest' with the minimum fields required to make a request.
newActivateSubscriptionOfferRequest ::
  ActivateSubscriptionOfferRequest
newActivateSubscriptionOfferRequest =
  ActivateSubscriptionOfferRequest
    { basePlanId = Core.Nothing,
      latencyTolerance = Core.Nothing,
      offerId = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing
    }

instance Core.FromJSON ActivateSubscriptionOfferRequest where
  parseJSON =
    Core.withObject
      "ActivateSubscriptionOfferRequest"
      ( \o ->
          ActivateSubscriptionOfferRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "offerId")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
      )

instance Core.ToJSON ActivateSubscriptionOfferRequest where
  toJSON ActivateSubscriptionOfferRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("offerId" Core..=) Core.<$> offerId,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId
          ]
      )

-- | Request message for AddTargeting.
--
-- /See:/ 'newAddTargetingRequest' smart constructor.
newtype AddTargetingRequest = AddTargetingRequest
  { -- | Specifies targeting updates such as regions, android sdk versions etc.
    targetingUpdate :: (Core.Maybe TargetingUpdate)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AddTargetingRequest' with the minimum fields required to make a request.
newAddTargetingRequest ::
  AddTargetingRequest
newAddTargetingRequest =
  AddTargetingRequest {targetingUpdate = Core.Nothing}

instance Core.FromJSON AddTargetingRequest where
  parseJSON =
    Core.withObject
      "AddTargetingRequest"
      ( \o ->
          AddTargetingRequest Core.<$> (o Core..:? "targetingUpdate")
      )

instance Core.ToJSON AddTargetingRequest where
  toJSON AddTargetingRequest {..} =
    Core.object
      ( Core.catMaybes
          [("targetingUpdate" Core..=) Core.<$> targetingUpdate]
      )

-- | Response message for AddTargeting.
--
-- /See:/ 'newAddTargetingResponse' smart constructor.
data AddTargetingResponse = AddTargetingResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AddTargetingResponse' with the minimum fields required to make a request.
newAddTargetingResponse ::
  AddTargetingResponse
newAddTargetingResponse = AddTargetingResponse

instance Core.FromJSON AddTargetingResponse where
  parseJSON =
    Core.withObject
      "AddTargetingResponse"
      (\o -> Core.pure AddTargetingResponse)

instance Core.ToJSON AddTargetingResponse where
  toJSON = Core.const Core.emptyObject

-- | Object representation to describe all set of users.
--
-- /See:/ 'newAllUsers' smart constructor.
newtype AllUsers = AllUsers
  { -- | Required. Set to true if all set of users are needed.
    isAllUsersRequested :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AllUsers' with the minimum fields required to make a request.
newAllUsers ::
  AllUsers
newAllUsers = AllUsers {isAllUsersRequested = Core.Nothing}

instance Core.FromJSON AllUsers where
  parseJSON =
    Core.withObject
      "AllUsers"
      (\o -> AllUsers Core.<$> (o Core..:? "isAllUsersRequested"))

instance Core.ToJSON AllUsers where
  toJSON AllUsers {..} =
    Core.object
      ( Core.catMaybes
          [("isAllUsersRequested" Core..=) Core.<$> isAllUsersRequested]
      )

-- | Android api level targeting data for app recovery action targeting.
--
-- /See:/ 'newAndroidSdks' smart constructor.
newtype AndroidSdks = AndroidSdks
  { -- | Android api levels of devices targeted by recovery action. See https:\/\/developer.android.com\/guide\/topics\/manifest\/uses-sdk-element#ApiLevels for different api levels in android.
    sdkLevels :: (Core.Maybe [Core.Int64])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AndroidSdks' with the minimum fields required to make a request.
newAndroidSdks ::
  AndroidSdks
newAndroidSdks = AndroidSdks {sdkLevels = Core.Nothing}

instance Core.FromJSON AndroidSdks where
  parseJSON =
    Core.withObject
      "AndroidSdks"
      ( \o ->
          AndroidSdks
            Core.<$> ( o
                         Core..:? "sdkLevels"
                         Core.<&> Core.fmap (Core.fmap Core.fromAsText)
                     )
      )

instance Core.ToJSON AndroidSdks where
  toJSON AndroidSdks {..} =
    Core.object
      ( Core.catMaybes
          [ ("sdkLevels" Core..=)
              Core.. Core.fmap Core.AsText
              Core.<$> sdkLevels
          ]
      )

-- | Information about an APK. The resource for ApksService.
--
-- /See:/ 'newApk' smart constructor.
data Apk = Apk
  { -- | Information about the binary payload of this APK.
    binary :: (Core.Maybe ApkBinary),
    -- | The version code of the APK, as specified in the manifest file.
    versionCode :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Apk' with the minimum fields required to make a request.
newApk ::
  Apk
newApk = Apk {binary = Core.Nothing, versionCode = Core.Nothing}

instance Core.FromJSON Apk where
  parseJSON =
    Core.withObject
      "Apk"
      ( \o ->
          Apk
            Core.<$> (o Core..:? "binary")
            Core.<*> (o Core..:? "versionCode")
      )

instance Core.ToJSON Apk where
  toJSON Apk {..} =
    Core.object
      ( Core.catMaybes
          [ ("binary" Core..=) Core.<$> binary,
            ("versionCode" Core..=) Core.<$> versionCode
          ]
      )

-- | Represents the binary payload of an APK.
--
-- /See:/ 'newApkBinary' smart constructor.
data ApkBinary = ApkBinary
  { -- | A sha1 hash of the APK payload, encoded as a hex string and matching the output of the sha1sum command.
    sha1 :: (Core.Maybe Core.Text),
    -- | A sha256 hash of the APK payload, encoded as a hex string and matching the output of the sha256sum command.
    sha256 :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApkBinary' with the minimum fields required to make a request.
newApkBinary ::
  ApkBinary
newApkBinary =
  ApkBinary {sha1 = Core.Nothing, sha256 = Core.Nothing}

instance Core.FromJSON ApkBinary where
  parseJSON =
    Core.withObject
      "ApkBinary"
      ( \o ->
          ApkBinary
            Core.<$> (o Core..:? "sha1")
            Core.<*> (o Core..:? "sha256")
      )

instance Core.ToJSON ApkBinary where
  toJSON ApkBinary {..} =
    Core.object
      ( Core.catMaybes
          [ ("sha1" Core..=) Core.<$> sha1,
            ("sha256" Core..=) Core.<$> sha256
          ]
      )

-- | Description of the created apks.
--
-- /See:/ 'newApkDescription' smart constructor.
data ApkDescription = ApkDescription
  { -- | Set only for asset slices.
    assetSliceMetadata :: (Core.Maybe SplitApkMetadata),
    -- | Set only for Instant split APKs.
    instantApkMetadata :: (Core.Maybe SplitApkMetadata),
    -- | Path of the Apk, will be in the following format: .apk where DownloadId is the ID used to download the apk using GeneratedApks.Download API.
    path :: (Core.Maybe Core.Text),
    -- | Set only for Split APKs.
    splitApkMetadata :: (Core.Maybe SplitApkMetadata),
    -- | Set only for standalone APKs.
    standaloneApkMetadata :: (Core.Maybe StandaloneApkMetadata),
    -- | Apk-level targeting.
    targeting :: (Core.Maybe ApkTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApkDescription' with the minimum fields required to make a request.
newApkDescription ::
  ApkDescription
newApkDescription =
  ApkDescription
    { assetSliceMetadata = Core.Nothing,
      instantApkMetadata = Core.Nothing,
      path = Core.Nothing,
      splitApkMetadata = Core.Nothing,
      standaloneApkMetadata = Core.Nothing,
      targeting = Core.Nothing
    }

instance Core.FromJSON ApkDescription where
  parseJSON =
    Core.withObject
      "ApkDescription"
      ( \o ->
          ApkDescription
            Core.<$> (o Core..:? "assetSliceMetadata")
            Core.<*> (o Core..:? "instantApkMetadata")
            Core.<*> (o Core..:? "path")
            Core.<*> (o Core..:? "splitApkMetadata")
            Core.<*> (o Core..:? "standaloneApkMetadata")
            Core.<*> (o Core..:? "targeting")
      )

instance Core.ToJSON ApkDescription where
  toJSON ApkDescription {..} =
    Core.object
      ( Core.catMaybes
          [ ("assetSliceMetadata" Core..=) Core.<$> assetSliceMetadata,
            ("instantApkMetadata" Core..=) Core.<$> instantApkMetadata,
            ("path" Core..=) Core.<$> path,
            ("splitApkMetadata" Core..=) Core.<$> splitApkMetadata,
            ("standaloneApkMetadata" Core..=) Core.<$> standaloneApkMetadata,
            ("targeting" Core..=) Core.<$> targeting
          ]
      )

-- | A set of apks representing a module.
--
-- /See:/ 'newApkSet' smart constructor.
data ApkSet = ApkSet
  { -- | Description of the generated apks.
    apkDescription :: (Core.Maybe [ApkDescription]),
    -- | Metadata about the module represented by this ApkSet
    moduleMetadata :: (Core.Maybe ModuleMetadata)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApkSet' with the minimum fields required to make a request.
newApkSet ::
  ApkSet
newApkSet =
  ApkSet
    { apkDescription = Core.Nothing,
      moduleMetadata = Core.Nothing
    }

instance Core.FromJSON ApkSet where
  parseJSON =
    Core.withObject
      "ApkSet"
      ( \o ->
          ApkSet
            Core.<$> (o Core..:? "apkDescription")
            Core.<*> (o Core..:? "moduleMetadata")
      )

instance Core.ToJSON ApkSet where
  toJSON ApkSet {..} =
    Core.object
      ( Core.catMaybes
          [ ("apkDescription" Core..=) Core.<$> apkDescription,
            ("moduleMetadata" Core..=) Core.<$> moduleMetadata
          ]
      )

-- | Represents a set of apk-level targetings.
--
-- /See:/ 'newApkTargeting' smart constructor.
data ApkTargeting = ApkTargeting
  { -- | The abi that the apk targets
    abiTargeting :: (Core.Maybe AbiTargeting),
    -- | The language that the apk targets
    languageTargeting :: (Core.Maybe LanguageTargeting),
    -- | Multi-api-level targeting.
    multiAbiTargeting :: (Core.Maybe MultiAbiTargeting),
    -- | The screen density that this apk supports.
    screenDensityTargeting :: (Core.Maybe ScreenDensityTargeting),
    -- | The sdk version that the apk targets
    sdkVersionTargeting :: (Core.Maybe SdkVersionTargeting),
    -- | Texture-compression-format-level targeting
    textureCompressionFormatTargeting :: (Core.Maybe TextureCompressionFormatTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApkTargeting' with the minimum fields required to make a request.
newApkTargeting ::
  ApkTargeting
newApkTargeting =
  ApkTargeting
    { abiTargeting = Core.Nothing,
      languageTargeting = Core.Nothing,
      multiAbiTargeting = Core.Nothing,
      screenDensityTargeting = Core.Nothing,
      sdkVersionTargeting = Core.Nothing,
      textureCompressionFormatTargeting = Core.Nothing
    }

instance Core.FromJSON ApkTargeting where
  parseJSON =
    Core.withObject
      "ApkTargeting"
      ( \o ->
          ApkTargeting
            Core.<$> (o Core..:? "abiTargeting")
            Core.<*> (o Core..:? "languageTargeting")
            Core.<*> (o Core..:? "multiAbiTargeting")
            Core.<*> (o Core..:? "screenDensityTargeting")
            Core.<*> (o Core..:? "sdkVersionTargeting")
            Core.<*> (o Core..:? "textureCompressionFormatTargeting")
      )

instance Core.ToJSON ApkTargeting where
  toJSON ApkTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("abiTargeting" Core..=) Core.<$> abiTargeting,
            ("languageTargeting" Core..=) Core.<$> languageTargeting,
            ("multiAbiTargeting" Core..=) Core.<$> multiAbiTargeting,
            ("screenDensityTargeting" Core..=) Core.<$> screenDensityTargeting,
            ("sdkVersionTargeting" Core..=) Core.<$> sdkVersionTargeting,
            ("textureCompressionFormatTargeting" Core..=)
              Core.<$> textureCompressionFormatTargeting
          ]
      )

-- | Request to create a new externally hosted APK.
--
-- /See:/ 'newApksAddExternallyHostedRequest' smart constructor.
newtype ApksAddExternallyHostedRequest = ApksAddExternallyHostedRequest
  { -- | The definition of the externally-hosted APK and where it is located.
    externallyHostedApk :: (Core.Maybe ExternallyHostedApk)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApksAddExternallyHostedRequest' with the minimum fields required to make a request.
newApksAddExternallyHostedRequest ::
  ApksAddExternallyHostedRequest
newApksAddExternallyHostedRequest =
  ApksAddExternallyHostedRequest
    { externallyHostedApk =
        Core.Nothing
    }

instance Core.FromJSON ApksAddExternallyHostedRequest where
  parseJSON =
    Core.withObject
      "ApksAddExternallyHostedRequest"
      ( \o ->
          ApksAddExternallyHostedRequest
            Core.<$> (o Core..:? "externallyHostedApk")
      )

instance Core.ToJSON ApksAddExternallyHostedRequest where
  toJSON ApksAddExternallyHostedRequest {..} =
    Core.object
      ( Core.catMaybes
          [("externallyHostedApk" Core..=) Core.<$> externallyHostedApk]
      )

-- | Response for creating a new externally hosted APK.
--
-- /See:/ 'newApksAddExternallyHostedResponse' smart constructor.
newtype ApksAddExternallyHostedResponse = ApksAddExternallyHostedResponse
  { -- | The definition of the externally-hosted APK and where it is located.
    externallyHostedApk :: (Core.Maybe ExternallyHostedApk)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApksAddExternallyHostedResponse' with the minimum fields required to make a request.
newApksAddExternallyHostedResponse ::
  ApksAddExternallyHostedResponse
newApksAddExternallyHostedResponse =
  ApksAddExternallyHostedResponse
    { externallyHostedApk =
        Core.Nothing
    }

instance Core.FromJSON ApksAddExternallyHostedResponse where
  parseJSON =
    Core.withObject
      "ApksAddExternallyHostedResponse"
      ( \o ->
          ApksAddExternallyHostedResponse
            Core.<$> (o Core..:? "externallyHostedApk")
      )

instance Core.ToJSON ApksAddExternallyHostedResponse where
  toJSON ApksAddExternallyHostedResponse {..} =
    Core.object
      ( Core.catMaybes
          [("externallyHostedApk" Core..=) Core.<$> externallyHostedApk]
      )

-- | Response listing all APKs.
--
-- /See:/ 'newApksListResponse' smart constructor.
data ApksListResponse = ApksListResponse
  { -- | All APKs.
    apks :: (Core.Maybe [Apk]),
    -- | The kind of this response (\"androidpublisher#apksListResponse\").
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ApksListResponse' with the minimum fields required to make a request.
newApksListResponse ::
  ApksListResponse
newApksListResponse =
  ApksListResponse {apks = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON ApksListResponse where
  parseJSON =
    Core.withObject
      "ApksListResponse"
      ( \o ->
          ApksListResponse
            Core.<$> (o Core..:? "apks")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON ApksListResponse where
  toJSON ApksListResponse {..} =
    Core.object
      ( Core.catMaybes
          [("apks" Core..=) Core.<$> apks, ("kind" Core..=) Core.<$> kind]
      )

-- | The app details. The resource for DetailsService.
--
-- /See:/ 'newAppDetails' smart constructor.
data AppDetails = AppDetails
  { -- | The user-visible support email for this app.
    contactEmail :: (Core.Maybe Core.Text),
    -- | The user-visible support telephone number for this app.
    contactPhone :: (Core.Maybe Core.Text),
    -- | The user-visible website for this app.
    contactWebsite :: (Core.Maybe Core.Text),
    -- | Default language code, in BCP 47 format (eg \"en-US\").
    defaultLanguage :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AppDetails' with the minimum fields required to make a request.
newAppDetails ::
  AppDetails
newAppDetails =
  AppDetails
    { contactEmail = Core.Nothing,
      contactPhone = Core.Nothing,
      contactWebsite = Core.Nothing,
      defaultLanguage = Core.Nothing
    }

instance Core.FromJSON AppDetails where
  parseJSON =
    Core.withObject
      "AppDetails"
      ( \o ->
          AppDetails
            Core.<$> (o Core..:? "contactEmail")
            Core.<*> (o Core..:? "contactPhone")
            Core.<*> (o Core..:? "contactWebsite")
            Core.<*> (o Core..:? "defaultLanguage")
      )

instance Core.ToJSON AppDetails where
  toJSON AppDetails {..} =
    Core.object
      ( Core.catMaybes
          [ ("contactEmail" Core..=) Core.<$> contactEmail,
            ("contactPhone" Core..=) Core.<$> contactPhone,
            ("contactWebsite" Core..=) Core.<$> contactWebsite,
            ("defaultLanguage" Core..=) Core.<$> defaultLanguage
          ]
      )

-- | An app edit. The resource for EditsService.
--
-- /See:/ 'newAppEdit' smart constructor.
data AppEdit = AppEdit
  { -- | Output only. The time (as seconds since Epoch) at which the edit will expire and will be no longer valid for use.
    expiryTimeSeconds :: (Core.Maybe Core.Text),
    -- | Output only. Identifier of the edit. Can be used in subsequent API calls.
    id :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AppEdit' with the minimum fields required to make a request.
newAppEdit ::
  AppEdit
newAppEdit =
  AppEdit {expiryTimeSeconds = Core.Nothing, id = Core.Nothing}

instance Core.FromJSON AppEdit where
  parseJSON =
    Core.withObject
      "AppEdit"
      ( \o ->
          AppEdit
            Core.<$> (o Core..:? "expiryTimeSeconds")
            Core.<*> (o Core..:? "id")
      )

instance Core.ToJSON AppEdit where
  toJSON AppEdit {..} =
    Core.object
      ( Core.catMaybes
          [ ("expiryTimeSeconds" Core..=) Core.<$> expiryTimeSeconds,
            ("id" Core..=) Core.<$> id
          ]
      )

-- | Information about an app recovery action.
--
-- /See:/ 'newAppRecoveryAction' smart constructor.
data AppRecoveryAction = AppRecoveryAction
  { -- | ID corresponding to the app recovery action.
    appRecoveryId :: (Core.Maybe Core.Int64),
    -- | Timestamp of when the app recovery action is canceled by the developer. Only set if the recovery action has been canceled.
    cancelTime :: (Core.Maybe Core.DateTime),
    -- | Timestamp of when the app recovery action is created by the developer. It is always set after creation of the recovery action.
    createTime :: (Core.Maybe Core.DateTime),
    -- | Timestamp of when the app recovery action is deployed to the users. Only set if the recovery action has been deployed.
    deployTime :: (Core.Maybe Core.DateTime),
    -- | Timestamp of when the developer last updated recovery action. In case the action is cancelled, it corresponds to cancellation time. It is always set after creation of the recovery action.
    lastUpdateTime :: (Core.Maybe Core.DateTime),
    -- | Data about the remote in-app update action such as such as recovered user base, recoverable user base etc. Set only if the recovery action type is Remote In-App Update.
    remoteInAppUpdateData :: (Core.Maybe RemoteInAppUpdateData),
    -- | The status of the recovery action.
    status :: (Core.Maybe AppRecoveryAction_Status),
    -- | Specifies targeting criteria for the recovery action such as regions, android sdk versions, app versions etc.
    targeting :: (Core.Maybe Targeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AppRecoveryAction' with the minimum fields required to make a request.
newAppRecoveryAction ::
  AppRecoveryAction
newAppRecoveryAction =
  AppRecoveryAction
    { appRecoveryId = Core.Nothing,
      cancelTime = Core.Nothing,
      createTime = Core.Nothing,
      deployTime = Core.Nothing,
      lastUpdateTime = Core.Nothing,
      remoteInAppUpdateData = Core.Nothing,
      status = Core.Nothing,
      targeting = Core.Nothing
    }

instance Core.FromJSON AppRecoveryAction where
  parseJSON =
    Core.withObject
      "AppRecoveryAction"
      ( \o ->
          AppRecoveryAction
            Core.<$> (o Core..:? "appRecoveryId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "cancelTime")
            Core.<*> (o Core..:? "createTime")
            Core.<*> (o Core..:? "deployTime")
            Core.<*> (o Core..:? "lastUpdateTime")
            Core.<*> (o Core..:? "remoteInAppUpdateData")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "targeting")
      )

instance Core.ToJSON AppRecoveryAction where
  toJSON AppRecoveryAction {..} =
    Core.object
      ( Core.catMaybes
          [ ("appRecoveryId" Core..=)
              Core.. Core.AsText
              Core.<$> appRecoveryId,
            ("cancelTime" Core..=) Core.<$> cancelTime,
            ("createTime" Core..=) Core.<$> createTime,
            ("deployTime" Core..=) Core.<$> deployTime,
            ("lastUpdateTime" Core..=) Core.<$> lastUpdateTime,
            ("remoteInAppUpdateData" Core..=) Core.<$> remoteInAppUpdateData,
            ("status" Core..=) Core.<$> status,
            ("targeting" Core..=) Core.<$> targeting
          ]
      )

-- | Data format for a list of app versions.
--
-- /See:/ 'newAppVersionList' smart constructor.
newtype AppVersionList = AppVersionList
  { -- | List of app version codes.
    versionCodes :: (Core.Maybe [Core.Int64])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AppVersionList' with the minimum fields required to make a request.
newAppVersionList ::
  AppVersionList
newAppVersionList = AppVersionList {versionCodes = Core.Nothing}

instance Core.FromJSON AppVersionList where
  parseJSON =
    Core.withObject
      "AppVersionList"
      ( \o ->
          AppVersionList
            Core.<$> ( o
                         Core..:? "versionCodes"
                         Core.<&> Core.fmap (Core.fmap Core.fromAsText)
                     )
      )

instance Core.ToJSON AppVersionList where
  toJSON AppVersionList {..} =
    Core.object
      ( Core.catMaybes
          [ ("versionCodes" Core..=)
              Core.. Core.fmap Core.AsText
              Core.<$> versionCodes
          ]
      )

-- | Data format for a continuous range of app versions.
--
-- /See:/ 'newAppVersionRange' smart constructor.
data AppVersionRange = AppVersionRange
  { -- | Highest app version in the range, inclusive.
    versionCodeEnd :: (Core.Maybe Core.Int64),
    -- | Lowest app version in the range, inclusive.
    versionCodeStart :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AppVersionRange' with the minimum fields required to make a request.
newAppVersionRange ::
  AppVersionRange
newAppVersionRange =
  AppVersionRange
    { versionCodeEnd = Core.Nothing,
      versionCodeStart = Core.Nothing
    }

instance Core.FromJSON AppVersionRange where
  parseJSON =
    Core.withObject
      "AppVersionRange"
      ( \o ->
          AppVersionRange
            Core.<$> (o Core..:? "versionCodeEnd" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "versionCodeStart" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON AppVersionRange where
  toJSON AppVersionRange {..} =
    Core.object
      ( Core.catMaybes
          [ ("versionCodeEnd" Core..=)
              Core.. Core.AsText
              Core.<$> versionCodeEnd,
            ("versionCodeStart" Core..=)
              Core.. Core.AsText
              Core.<$> versionCodeStart
          ]
      )

-- | Deprecated: subscription archiving is not supported.
--
-- /See:/ 'newArchiveSubscriptionRequest' smart constructor.
data ArchiveSubscriptionRequest = ArchiveSubscriptionRequest
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ArchiveSubscriptionRequest' with the minimum fields required to make a request.
newArchiveSubscriptionRequest ::
  ArchiveSubscriptionRequest
newArchiveSubscriptionRequest = ArchiveSubscriptionRequest

instance Core.FromJSON ArchiveSubscriptionRequest where
  parseJSON =
    Core.withObject
      "ArchiveSubscriptionRequest"
      (\o -> Core.pure ArchiveSubscriptionRequest)

instance Core.ToJSON ArchiveSubscriptionRequest where
  toJSON = Core.const Core.emptyObject

-- | Metadata of an asset module.
--
-- /See:/ 'newAssetModuleMetadata' smart constructor.
data AssetModuleMetadata = AssetModuleMetadata
  { -- | Indicates the delivery type for persistent install.
    deliveryType :: (Core.Maybe AssetModuleMetadata_DeliveryType),
    -- | Module name.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AssetModuleMetadata' with the minimum fields required to make a request.
newAssetModuleMetadata ::
  AssetModuleMetadata
newAssetModuleMetadata =
  AssetModuleMetadata
    { deliveryType = Core.Nothing,
      name = Core.Nothing
    }

instance Core.FromJSON AssetModuleMetadata where
  parseJSON =
    Core.withObject
      "AssetModuleMetadata"
      ( \o ->
          AssetModuleMetadata
            Core.<$> (o Core..:? "deliveryType")
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON AssetModuleMetadata where
  toJSON AssetModuleMetadata {..} =
    Core.object
      ( Core.catMaybes
          [ ("deliveryType" Core..=) Core.<$> deliveryType,
            ("name" Core..=) Core.<$> name
          ]
      )

-- | Set of asset slices belonging to a single asset module.
--
-- /See:/ 'newAssetSliceSet' smart constructor.
data AssetSliceSet = AssetSliceSet
  { -- | Asset slices.
    apkDescription :: (Core.Maybe [ApkDescription]),
    -- | Module level metadata.
    assetModuleMetadata :: (Core.Maybe AssetModuleMetadata)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AssetSliceSet' with the minimum fields required to make a request.
newAssetSliceSet ::
  AssetSliceSet
newAssetSliceSet =
  AssetSliceSet
    { apkDescription = Core.Nothing,
      assetModuleMetadata = Core.Nothing
    }

instance Core.FromJSON AssetSliceSet where
  parseJSON =
    Core.withObject
      "AssetSliceSet"
      ( \o ->
          AssetSliceSet
            Core.<$> (o Core..:? "apkDescription")
            Core.<*> (o Core..:? "assetModuleMetadata")
      )

instance Core.ToJSON AssetSliceSet where
  toJSON AssetSliceSet {..} =
    Core.object
      ( Core.catMaybes
          [ ("apkDescription" Core..=) Core.<$> apkDescription,
            ("assetModuleMetadata" Core..=) Core.<$> assetModuleMetadata
          ]
      )

-- | Represents a base plan that automatically renews at the end of its subscription period.
--
-- /See:/ 'newAutoRenewingBasePlanType' smart constructor.
data AutoRenewingBasePlanType = AutoRenewingBasePlanType
  { -- | Optional. Account hold period of the subscription, specified in ISO 8601 format. Acceptable values must be in days and between P0D and P60D. If not specified, the default value is P30D. The sum of gracePeriodDuration and accountHoldDuration must be between P30D and P60D days, inclusive.
    accountHoldDuration :: (Core.Maybe Core.Text),
    -- | Required. Immutable. Subscription period, specified in ISO 8601 format. For a list of acceptable billing periods, refer to the help center. The duration is immutable after the base plan is created.
    billingPeriodDuration :: (Core.Maybe Core.Text),
    -- | Grace period of the subscription, specified in ISO 8601 format. Acceptable values must be in days and between P0D and the lesser of 30D and base plan billing period. If not specified, a default value will be used based on the billing period. The sum of gracePeriodDuration and accountHoldDuration must be between P30D and P60D days, inclusive.
    gracePeriodDuration :: (Core.Maybe Core.Text),
    -- | Whether the renewing base plan is backward compatible. The backward compatible base plan is returned by the Google Play Billing Library deprecated method querySkuDetailsAsync(). Only one renewing base plan can be marked as legacy compatible for a given subscription.
    legacyCompatible :: (Core.Maybe Core.Bool),
    -- | Subscription offer id which is legacy compatible. The backward compatible subscription offer is returned by the Google Play Billing Library deprecated method querySkuDetailsAsync(). Only one subscription offer can be marked as legacy compatible for a given renewing base plan. To have no Subscription offer as legacy compatible set this field as empty string.
    legacyCompatibleSubscriptionOfferId :: (Core.Maybe Core.Text),
    -- | The proration mode for the base plan determines what happens when a user switches to this plan from another base plan. If unspecified, defaults to CHARGE/ON/NEXT/BILLING/DATE.
    prorationMode :: (Core.Maybe AutoRenewingBasePlanType_ProrationMode),
    -- | Whether users should be able to resubscribe to this base plan in Google Play surfaces. Defaults to RESUBSCRIBE/STATE/ACTIVE if not specified.
    resubscribeState :: (Core.Maybe AutoRenewingBasePlanType_ResubscribeState)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AutoRenewingBasePlanType' with the minimum fields required to make a request.
newAutoRenewingBasePlanType ::
  AutoRenewingBasePlanType
newAutoRenewingBasePlanType =
  AutoRenewingBasePlanType
    { accountHoldDuration = Core.Nothing,
      billingPeriodDuration = Core.Nothing,
      gracePeriodDuration = Core.Nothing,
      legacyCompatible = Core.Nothing,
      legacyCompatibleSubscriptionOfferId = Core.Nothing,
      prorationMode = Core.Nothing,
      resubscribeState = Core.Nothing
    }

instance Core.FromJSON AutoRenewingBasePlanType where
  parseJSON =
    Core.withObject
      "AutoRenewingBasePlanType"
      ( \o ->
          AutoRenewingBasePlanType
            Core.<$> (o Core..:? "accountHoldDuration")
            Core.<*> (o Core..:? "billingPeriodDuration")
            Core.<*> (o Core..:? "gracePeriodDuration")
            Core.<*> (o Core..:? "legacyCompatible")
            Core.<*> (o Core..:? "legacyCompatibleSubscriptionOfferId")
            Core.<*> (o Core..:? "prorationMode")
            Core.<*> (o Core..:? "resubscribeState")
      )

instance Core.ToJSON AutoRenewingBasePlanType where
  toJSON AutoRenewingBasePlanType {..} =
    Core.object
      ( Core.catMaybes
          [ ("accountHoldDuration" Core..=) Core.<$> accountHoldDuration,
            ("billingPeriodDuration" Core..=) Core.<$> billingPeriodDuration,
            ("gracePeriodDuration" Core..=) Core.<$> gracePeriodDuration,
            ("legacyCompatible" Core..=) Core.<$> legacyCompatible,
            ("legacyCompatibleSubscriptionOfferId" Core..=)
              Core.<$> legacyCompatibleSubscriptionOfferId,
            ("prorationMode" Core..=) Core.<$> prorationMode,
            ("resubscribeState" Core..=) Core.<$> resubscribeState
          ]
      )

-- | Information related to an auto renewing plan.
--
-- /See:/ 'newAutoRenewingPlan' smart constructor.
data AutoRenewingPlan = AutoRenewingPlan
  { -- | If the subscription is currently set to auto-renew, e.g. the user has not canceled the subscription
    autoRenewEnabled :: (Core.Maybe Core.Bool),
    -- | The installment plan commitment and state related info for the auto renewing plan.
    installmentDetails :: (Core.Maybe InstallmentPlan),
    -- | The information of the last price change for the item since subscription signup.
    priceChangeDetails :: (Core.Maybe SubscriptionItemPriceChangeDetails),
    -- | The current recurring price of the auto renewing plan.
    recurringPrice :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AutoRenewingPlan' with the minimum fields required to make a request.
newAutoRenewingPlan ::
  AutoRenewingPlan
newAutoRenewingPlan =
  AutoRenewingPlan
    { autoRenewEnabled = Core.Nothing,
      installmentDetails = Core.Nothing,
      priceChangeDetails = Core.Nothing,
      recurringPrice = Core.Nothing
    }

instance Core.FromJSON AutoRenewingPlan where
  parseJSON =
    Core.withObject
      "AutoRenewingPlan"
      ( \o ->
          AutoRenewingPlan
            Core.<$> (o Core..:? "autoRenewEnabled")
            Core.<*> (o Core..:? "installmentDetails")
            Core.<*> (o Core..:? "priceChangeDetails")
            Core.<*> (o Core..:? "recurringPrice")
      )

instance Core.ToJSON AutoRenewingPlan where
  toJSON AutoRenewingPlan {..} =
    Core.object
      ( Core.catMaybes
          [ ("autoRenewEnabled" Core..=) Core.<$> autoRenewEnabled,
            ("installmentDetails" Core..=) Core.<$> installmentDetails,
            ("priceChangeDetails" Core..=) Core.<$> priceChangeDetails,
            ("recurringPrice" Core..=) Core.<$> recurringPrice
          ]
      )

-- | A single base plan for a subscription.
--
-- /See:/ 'newBasePlan' smart constructor.
data BasePlan = BasePlan
  { -- | Set when the base plan automatically renews at a regular interval.
    autoRenewingBasePlanType :: (Core.Maybe AutoRenewingBasePlanType),
    -- | Required. Immutable. The unique identifier of this base plan. Must be unique within the subscription, and conform with RFC-1034. That is, this ID can only contain lower-case letters (a-z), numbers (0-9), and hyphens (-), and be at most 63 characters.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Set for installments base plans where a user is committed to a specified number of payments.
    installmentsBasePlanType :: (Core.Maybe InstallmentsBasePlanType),
    -- | List of up to 20 custom tags specified for this base plan, and returned to the app through the billing library. Subscription offers for this base plan will also receive these offer tags in the billing library.
    offerTags :: (Core.Maybe [OfferTag]),
    -- | Pricing information for any new locations Play may launch in the future. If omitted, the BasePlan will not be automatically available any new locations Play may launch in the future.
    otherRegionsConfig :: (Core.Maybe OtherRegionsBasePlanConfig),
    -- | Set when the base plan does not automatically renew at the end of the billing period.
    prepaidBasePlanType :: (Core.Maybe PrepaidBasePlanType),
    -- | Region-specific information for this base plan.
    regionalConfigs :: (Core.Maybe [RegionalBasePlanConfig]),
    -- | Output only. The state of the base plan, i.e. whether it\'s active. Draft and inactive base plans can be activated or deleted. Active base plans can be made inactive. Inactive base plans can be canceled. This field cannot be changed by updating the resource. Use the dedicated endpoints instead.
    state :: (Core.Maybe BasePlan_State)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BasePlan' with the minimum fields required to make a request.
newBasePlan ::
  BasePlan
newBasePlan =
  BasePlan
    { autoRenewingBasePlanType = Core.Nothing,
      basePlanId = Core.Nothing,
      installmentsBasePlanType = Core.Nothing,
      offerTags = Core.Nothing,
      otherRegionsConfig = Core.Nothing,
      prepaidBasePlanType = Core.Nothing,
      regionalConfigs = Core.Nothing,
      state = Core.Nothing
    }

instance Core.FromJSON BasePlan where
  parseJSON =
    Core.withObject
      "BasePlan"
      ( \o ->
          BasePlan
            Core.<$> (o Core..:? "autoRenewingBasePlanType")
            Core.<*> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "installmentsBasePlanType")
            Core.<*> (o Core..:? "offerTags")
            Core.<*> (o Core..:? "otherRegionsConfig")
            Core.<*> (o Core..:? "prepaidBasePlanType")
            Core.<*> (o Core..:? "regionalConfigs")
            Core.<*> (o Core..:? "state")
      )

instance Core.ToJSON BasePlan where
  toJSON BasePlan {..} =
    Core.object
      ( Core.catMaybes
          [ ("autoRenewingBasePlanType" Core..=)
              Core.<$> autoRenewingBasePlanType,
            ("basePlanId" Core..=) Core.<$> basePlanId,
            ("installmentsBasePlanType" Core..=)
              Core.<$> installmentsBasePlanType,
            ("offerTags" Core..=) Core.<$> offerTags,
            ("otherRegionsConfig" Core..=) Core.<$> otherRegionsConfig,
            ("prepaidBasePlanType" Core..=) Core.<$> prepaidBasePlanType,
            ("regionalConfigs" Core..=) Core.<$> regionalConfigs,
            ("state" Core..=) Core.<$> state
          ]
      )

-- | Request message for BatchGetSubscriptionOffers endpoint.
--
-- /See:/ 'newBatchGetSubscriptionOffersRequest' smart constructor.
newtype BatchGetSubscriptionOffersRequest = BatchGetSubscriptionOffersRequest
  { -- | Required. A list of update requests of up to 100 elements. All requests must update different subscriptions.
    requests :: (Core.Maybe [GetSubscriptionOfferRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchGetSubscriptionOffersRequest' with the minimum fields required to make a request.
newBatchGetSubscriptionOffersRequest ::
  BatchGetSubscriptionOffersRequest
newBatchGetSubscriptionOffersRequest =
  BatchGetSubscriptionOffersRequest {requests = Core.Nothing}

instance Core.FromJSON BatchGetSubscriptionOffersRequest where
  parseJSON =
    Core.withObject
      "BatchGetSubscriptionOffersRequest"
      ( \o ->
          BatchGetSubscriptionOffersRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchGetSubscriptionOffersRequest where
  toJSON BatchGetSubscriptionOffersRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchGetSubscriptionOffers endpoint.
--
-- /See:/ 'newBatchGetSubscriptionOffersResponse' smart constructor.
newtype BatchGetSubscriptionOffersResponse = BatchGetSubscriptionOffersResponse
  { subscriptionOffers :: (Core.Maybe [SubscriptionOffer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchGetSubscriptionOffersResponse' with the minimum fields required to make a request.
newBatchGetSubscriptionOffersResponse ::
  BatchGetSubscriptionOffersResponse
newBatchGetSubscriptionOffersResponse =
  BatchGetSubscriptionOffersResponse
    { subscriptionOffers =
        Core.Nothing
    }

instance Core.FromJSON BatchGetSubscriptionOffersResponse where
  parseJSON =
    Core.withObject
      "BatchGetSubscriptionOffersResponse"
      ( \o ->
          BatchGetSubscriptionOffersResponse
            Core.<$> (o Core..:? "subscriptionOffers")
      )

instance Core.ToJSON BatchGetSubscriptionOffersResponse where
  toJSON BatchGetSubscriptionOffersResponse {..} =
    Core.object
      ( Core.catMaybes
          [("subscriptionOffers" Core..=) Core.<$> subscriptionOffers]
      )

-- | Response message for BatchGetSubscriptions endpoint.
--
-- /See:/ 'newBatchGetSubscriptionsResponse' smart constructor.
newtype BatchGetSubscriptionsResponse = BatchGetSubscriptionsResponse
  { -- | The list of requested subscriptions, in the same order as the request.
    subscriptions :: (Core.Maybe [Subscription])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchGetSubscriptionsResponse' with the minimum fields required to make a request.
newBatchGetSubscriptionsResponse ::
  BatchGetSubscriptionsResponse
newBatchGetSubscriptionsResponse =
  BatchGetSubscriptionsResponse {subscriptions = Core.Nothing}

instance Core.FromJSON BatchGetSubscriptionsResponse where
  parseJSON =
    Core.withObject
      "BatchGetSubscriptionsResponse"
      ( \o ->
          BatchGetSubscriptionsResponse
            Core.<$> (o Core..:? "subscriptions")
      )

instance Core.ToJSON BatchGetSubscriptionsResponse where
  toJSON BatchGetSubscriptionsResponse {..} =
    Core.object
      (Core.catMaybes [("subscriptions" Core..=) Core.<$> subscriptions])

-- | Request message for BatchMigrateBasePlanPrices.
--
-- /See:/ 'newBatchMigrateBasePlanPricesRequest' smart constructor.
newtype BatchMigrateBasePlanPricesRequest = BatchMigrateBasePlanPricesRequest
  { -- | Required. Up to 100 price migration requests. All requests must update different base plans.
    requests :: (Core.Maybe [MigrateBasePlanPricesRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchMigrateBasePlanPricesRequest' with the minimum fields required to make a request.
newBatchMigrateBasePlanPricesRequest ::
  BatchMigrateBasePlanPricesRequest
newBatchMigrateBasePlanPricesRequest =
  BatchMigrateBasePlanPricesRequest {requests = Core.Nothing}

instance Core.FromJSON BatchMigrateBasePlanPricesRequest where
  parseJSON =
    Core.withObject
      "BatchMigrateBasePlanPricesRequest"
      ( \o ->
          BatchMigrateBasePlanPricesRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchMigrateBasePlanPricesRequest where
  toJSON BatchMigrateBasePlanPricesRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchMigrateBasePlanPrices.
--
-- /See:/ 'newBatchMigrateBasePlanPricesResponse' smart constructor.
newtype BatchMigrateBasePlanPricesResponse = BatchMigrateBasePlanPricesResponse
  { -- | Contains one response per requested price migration, in the same order as the request.
    responses :: (Core.Maybe [MigrateBasePlanPricesResponse])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchMigrateBasePlanPricesResponse' with the minimum fields required to make a request.
newBatchMigrateBasePlanPricesResponse ::
  BatchMigrateBasePlanPricesResponse
newBatchMigrateBasePlanPricesResponse =
  BatchMigrateBasePlanPricesResponse {responses = Core.Nothing}

instance Core.FromJSON BatchMigrateBasePlanPricesResponse where
  parseJSON =
    Core.withObject
      "BatchMigrateBasePlanPricesResponse"
      ( \o ->
          BatchMigrateBasePlanPricesResponse
            Core.<$> (o Core..:? "responses")
      )

instance Core.ToJSON BatchMigrateBasePlanPricesResponse where
  toJSON BatchMigrateBasePlanPricesResponse {..} =
    Core.object
      (Core.catMaybes [("responses" Core..=) Core.<$> responses])

-- | Request message for BatchUpdateBasePlanStates.
--
-- /See:/ 'newBatchUpdateBasePlanStatesRequest' smart constructor.
newtype BatchUpdateBasePlanStatesRequest = BatchUpdateBasePlanStatesRequest
  { -- | Required. The update request list of up to 100 elements. All requests must update different base plans.
    requests :: (Core.Maybe [UpdateBasePlanStateRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateBasePlanStatesRequest' with the minimum fields required to make a request.
newBatchUpdateBasePlanStatesRequest ::
  BatchUpdateBasePlanStatesRequest
newBatchUpdateBasePlanStatesRequest =
  BatchUpdateBasePlanStatesRequest {requests = Core.Nothing}

instance Core.FromJSON BatchUpdateBasePlanStatesRequest where
  parseJSON =
    Core.withObject
      "BatchUpdateBasePlanStatesRequest"
      ( \o ->
          BatchUpdateBasePlanStatesRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchUpdateBasePlanStatesRequest where
  toJSON BatchUpdateBasePlanStatesRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchUpdateBasePlanStates.
--
-- /See:/ 'newBatchUpdateBasePlanStatesResponse' smart constructor.
newtype BatchUpdateBasePlanStatesResponse = BatchUpdateBasePlanStatesResponse
  { -- | The list of updated subscriptions. This list will match the requests one to one, in the same order.
    subscriptions :: (Core.Maybe [Subscription])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateBasePlanStatesResponse' with the minimum fields required to make a request.
newBatchUpdateBasePlanStatesResponse ::
  BatchUpdateBasePlanStatesResponse
newBatchUpdateBasePlanStatesResponse =
  BatchUpdateBasePlanStatesResponse {subscriptions = Core.Nothing}

instance Core.FromJSON BatchUpdateBasePlanStatesResponse where
  parseJSON =
    Core.withObject
      "BatchUpdateBasePlanStatesResponse"
      ( \o ->
          BatchUpdateBasePlanStatesResponse
            Core.<$> (o Core..:? "subscriptions")
      )

instance Core.ToJSON BatchUpdateBasePlanStatesResponse where
  toJSON BatchUpdateBasePlanStatesResponse {..} =
    Core.object
      (Core.catMaybes [("subscriptions" Core..=) Core.<$> subscriptions])

-- | Request message for BatchUpdateSubscriptionOfferStates.
--
-- /See:/ 'newBatchUpdateSubscriptionOfferStatesRequest' smart constructor.
newtype BatchUpdateSubscriptionOfferStatesRequest = BatchUpdateSubscriptionOfferStatesRequest
  { -- | Required. The update request list of up to 100 elements. All requests must update different offers.
    requests :: (Core.Maybe [UpdateSubscriptionOfferStateRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionOfferStatesRequest' with the minimum fields required to make a request.
newBatchUpdateSubscriptionOfferStatesRequest ::
  BatchUpdateSubscriptionOfferStatesRequest
newBatchUpdateSubscriptionOfferStatesRequest =
  BatchUpdateSubscriptionOfferStatesRequest
    { requests =
        Core.Nothing
    }

instance Core.FromJSON BatchUpdateSubscriptionOfferStatesRequest where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionOfferStatesRequest"
      ( \o ->
          BatchUpdateSubscriptionOfferStatesRequest
            Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchUpdateSubscriptionOfferStatesRequest where
  toJSON BatchUpdateSubscriptionOfferStatesRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchUpdateSubscriptionOfferStates.
--
-- /See:/ 'newBatchUpdateSubscriptionOfferStatesResponse' smart constructor.
newtype BatchUpdateSubscriptionOfferStatesResponse = BatchUpdateSubscriptionOfferStatesResponse
  { -- | The updated subscription offers list.
    subscriptionOffers :: (Core.Maybe [SubscriptionOffer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionOfferStatesResponse' with the minimum fields required to make a request.
newBatchUpdateSubscriptionOfferStatesResponse ::
  BatchUpdateSubscriptionOfferStatesResponse
newBatchUpdateSubscriptionOfferStatesResponse =
  BatchUpdateSubscriptionOfferStatesResponse
    { subscriptionOffers =
        Core.Nothing
    }

instance Core.FromJSON BatchUpdateSubscriptionOfferStatesResponse where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionOfferStatesResponse"
      ( \o ->
          BatchUpdateSubscriptionOfferStatesResponse
            Core.<$> (o Core..:? "subscriptionOffers")
      )

instance Core.ToJSON BatchUpdateSubscriptionOfferStatesResponse where
  toJSON BatchUpdateSubscriptionOfferStatesResponse {..} =
    Core.object
      ( Core.catMaybes
          [("subscriptionOffers" Core..=) Core.<$> subscriptionOffers]
      )

-- | Request message for BatchUpdateSubscriptionOffers.
--
-- /See:/ 'newBatchUpdateSubscriptionOffersRequest' smart constructor.
newtype BatchUpdateSubscriptionOffersRequest = BatchUpdateSubscriptionOffersRequest
  { -- | Required. A list of update requests of up to 100 elements. All requests must update different subscription offers.
    requests :: (Core.Maybe [UpdateSubscriptionOfferRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionOffersRequest' with the minimum fields required to make a request.
newBatchUpdateSubscriptionOffersRequest ::
  BatchUpdateSubscriptionOffersRequest
newBatchUpdateSubscriptionOffersRequest =
  BatchUpdateSubscriptionOffersRequest {requests = Core.Nothing}

instance Core.FromJSON BatchUpdateSubscriptionOffersRequest where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionOffersRequest"
      ( \o ->
          BatchUpdateSubscriptionOffersRequest
            Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchUpdateSubscriptionOffersRequest where
  toJSON BatchUpdateSubscriptionOffersRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchUpdateSubscriptionOffers.
--
-- /See:/ 'newBatchUpdateSubscriptionOffersResponse' smart constructor.
newtype BatchUpdateSubscriptionOffersResponse = BatchUpdateSubscriptionOffersResponse
  { -- | The updated subscription offers list.
    subscriptionOffers :: (Core.Maybe [SubscriptionOffer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionOffersResponse' with the minimum fields required to make a request.
newBatchUpdateSubscriptionOffersResponse ::
  BatchUpdateSubscriptionOffersResponse
newBatchUpdateSubscriptionOffersResponse =
  BatchUpdateSubscriptionOffersResponse
    { subscriptionOffers =
        Core.Nothing
    }

instance Core.FromJSON BatchUpdateSubscriptionOffersResponse where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionOffersResponse"
      ( \o ->
          BatchUpdateSubscriptionOffersResponse
            Core.<$> (o Core..:? "subscriptionOffers")
      )

instance Core.ToJSON BatchUpdateSubscriptionOffersResponse where
  toJSON BatchUpdateSubscriptionOffersResponse {..} =
    Core.object
      ( Core.catMaybes
          [("subscriptionOffers" Core..=) Core.<$> subscriptionOffers]
      )

-- | Request message for BatchUpdateSubscription.
--
-- /See:/ 'newBatchUpdateSubscriptionsRequest' smart constructor.
newtype BatchUpdateSubscriptionsRequest = BatchUpdateSubscriptionsRequest
  { -- | Required. A list of update requests of up to 100 elements. All requests must update different subscriptions.
    requests :: (Core.Maybe [UpdateSubscriptionRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionsRequest' with the minimum fields required to make a request.
newBatchUpdateSubscriptionsRequest ::
  BatchUpdateSubscriptionsRequest
newBatchUpdateSubscriptionsRequest =
  BatchUpdateSubscriptionsRequest {requests = Core.Nothing}

instance Core.FromJSON BatchUpdateSubscriptionsRequest where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionsRequest"
      ( \o ->
          BatchUpdateSubscriptionsRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchUpdateSubscriptionsRequest where
  toJSON BatchUpdateSubscriptionsRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchUpdateSubscription.
--
-- /See:/ 'newBatchUpdateSubscriptionsResponse' smart constructor.
newtype BatchUpdateSubscriptionsResponse = BatchUpdateSubscriptionsResponse
  { -- | The updated subscriptions list.
    subscriptions :: (Core.Maybe [Subscription])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchUpdateSubscriptionsResponse' with the minimum fields required to make a request.
newBatchUpdateSubscriptionsResponse ::
  BatchUpdateSubscriptionsResponse
newBatchUpdateSubscriptionsResponse =
  BatchUpdateSubscriptionsResponse {subscriptions = Core.Nothing}

instance Core.FromJSON BatchUpdateSubscriptionsResponse where
  parseJSON =
    Core.withObject
      "BatchUpdateSubscriptionsResponse"
      ( \o ->
          BatchUpdateSubscriptionsResponse
            Core.<$> (o Core..:? "subscriptions")
      )

instance Core.ToJSON BatchUpdateSubscriptionsResponse where
  toJSON BatchUpdateSubscriptionsResponse {..} =
    Core.object
      (Core.catMaybes [("subscriptions" Core..=) Core.<$> subscriptions])

-- | Information about an app bundle. The resource for BundlesService.
--
-- /See:/ 'newBundle' smart constructor.
data Bundle = Bundle
  { -- | A sha1 hash of the upload payload, encoded as a hex string and matching the output of the sha1sum command.
    sha1 :: (Core.Maybe Core.Text),
    -- | A sha256 hash of the upload payload, encoded as a hex string and matching the output of the sha256sum command.
    sha256 :: (Core.Maybe Core.Text),
    -- | The version code of the Android App Bundle, as specified in the Android App Bundle\'s base module APK manifest file.
    versionCode :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Bundle' with the minimum fields required to make a request.
newBundle ::
  Bundle
newBundle =
  Bundle
    { sha1 = Core.Nothing,
      sha256 = Core.Nothing,
      versionCode = Core.Nothing
    }

instance Core.FromJSON Bundle where
  parseJSON =
    Core.withObject
      "Bundle"
      ( \o ->
          Bundle
            Core.<$> (o Core..:? "sha1")
            Core.<*> (o Core..:? "sha256")
            Core.<*> (o Core..:? "versionCode")
      )

instance Core.ToJSON Bundle where
  toJSON Bundle {..} =
    Core.object
      ( Core.catMaybes
          [ ("sha1" Core..=) Core.<$> sha1,
            ("sha256" Core..=) Core.<$> sha256,
            ("versionCode" Core..=) Core.<$> versionCode
          ]
      )

-- | Response listing all app bundles.
--
-- /See:/ 'newBundlesListResponse' smart constructor.
data BundlesListResponse = BundlesListResponse
  { -- | All app bundles.
    bundles :: (Core.Maybe [Bundle]),
    -- | The kind of this response (\"androidpublisher#bundlesListResponse\").
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BundlesListResponse' with the minimum fields required to make a request.
newBundlesListResponse ::
  BundlesListResponse
newBundlesListResponse =
  BundlesListResponse {bundles = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON BundlesListResponse where
  parseJSON =
    Core.withObject
      "BundlesListResponse"
      ( \o ->
          BundlesListResponse
            Core.<$> (o Core..:? "bundles")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON BundlesListResponse where
  toJSON BundlesListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("bundles" Core..=) Core.<$> bundles,
            ("kind" Core..=) Core.<$> kind
          ]
      )

-- | Request message for CancelAppRecovery.
--
-- /See:/ 'newCancelAppRecoveryRequest' smart constructor.
data CancelAppRecoveryRequest = CancelAppRecoveryRequest
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CancelAppRecoveryRequest' with the minimum fields required to make a request.
newCancelAppRecoveryRequest ::
  CancelAppRecoveryRequest
newCancelAppRecoveryRequest = CancelAppRecoveryRequest

instance Core.FromJSON CancelAppRecoveryRequest where
  parseJSON =
    Core.withObject
      "CancelAppRecoveryRequest"
      (\o -> Core.pure CancelAppRecoveryRequest)

instance Core.ToJSON CancelAppRecoveryRequest where
  toJSON = Core.const Core.emptyObject

-- | Response message for CancelAppRecovery.
--
-- /See:/ 'newCancelAppRecoveryResponse' smart constructor.
data CancelAppRecoveryResponse = CancelAppRecoveryResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CancelAppRecoveryResponse' with the minimum fields required to make a request.
newCancelAppRecoveryResponse ::
  CancelAppRecoveryResponse
newCancelAppRecoveryResponse = CancelAppRecoveryResponse

instance Core.FromJSON CancelAppRecoveryResponse where
  parseJSON =
    Core.withObject
      "CancelAppRecoveryResponse"
      (\o -> Core.pure CancelAppRecoveryResponse)

instance Core.ToJSON CancelAppRecoveryResponse where
  toJSON = Core.const Core.emptyObject

-- | Result of the cancel survey when the subscription was canceled by the user.
--
-- /See:/ 'newCancelSurveyResult' smart constructor.
data CancelSurveyResult = CancelSurveyResult
  { -- | The reason the user selected in the cancel survey.
    reason :: (Core.Maybe CancelSurveyResult_Reason),
    -- | Only set for CANCEL/SURVEY/REASON_OTHERS. This is the user\'s freeform response to the survey.
    reasonUserInput :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CancelSurveyResult' with the minimum fields required to make a request.
newCancelSurveyResult ::
  CancelSurveyResult
newCancelSurveyResult =
  CancelSurveyResult
    { reason = Core.Nothing,
      reasonUserInput = Core.Nothing
    }

instance Core.FromJSON CancelSurveyResult where
  parseJSON =
    Core.withObject
      "CancelSurveyResult"
      ( \o ->
          CancelSurveyResult
            Core.<$> (o Core..:? "reason")
            Core.<*> (o Core..:? "reasonUserInput")
      )

instance Core.ToJSON CancelSurveyResult where
  toJSON CancelSurveyResult {..} =
    Core.object
      ( Core.catMaybes
          [ ("reason" Core..=) Core.<$> reason,
            ("reasonUserInput" Core..=) Core.<$> reasonUserInput
          ]
      )

-- | Information specific to a subscription in the SUBSCRIPTION/STATE/CANCELED or SUBSCRIPTION/STATE/EXPIRED state.
--
-- /See:/ 'newCanceledStateContext' smart constructor.
data CanceledStateContext = CanceledStateContext
  { -- | Subscription was canceled by the developer.
    developerInitiatedCancellation :: (Core.Maybe DeveloperInitiatedCancellation),
    -- | Subscription was replaced by a new subscription.
    replacementCancellation :: (Core.Maybe ReplacementCancellation),
    -- | Subscription was canceled by the system, for example because of a billing problem.
    systemInitiatedCancellation :: (Core.Maybe SystemInitiatedCancellation),
    -- | Subscription was canceled by user.
    userInitiatedCancellation :: (Core.Maybe UserInitiatedCancellation)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CanceledStateContext' with the minimum fields required to make a request.
newCanceledStateContext ::
  CanceledStateContext
newCanceledStateContext =
  CanceledStateContext
    { developerInitiatedCancellation =
        Core.Nothing,
      replacementCancellation = Core.Nothing,
      systemInitiatedCancellation = Core.Nothing,
      userInitiatedCancellation = Core.Nothing
    }

instance Core.FromJSON CanceledStateContext where
  parseJSON =
    Core.withObject
      "CanceledStateContext"
      ( \o ->
          CanceledStateContext
            Core.<$> (o Core..:? "developerInitiatedCancellation")
            Core.<*> (o Core..:? "replacementCancellation")
            Core.<*> (o Core..:? "systemInitiatedCancellation")
            Core.<*> (o Core..:? "userInitiatedCancellation")
      )

instance Core.ToJSON CanceledStateContext where
  toJSON CanceledStateContext {..} =
    Core.object
      ( Core.catMaybes
          [ ("developerInitiatedCancellation" Core..=)
              Core.<$> developerInitiatedCancellation,
            ("replacementCancellation" Core..=)
              Core.<$> replacementCancellation,
            ("systemInitiatedCancellation" Core..=)
              Core.<$> systemInitiatedCancellation,
            ("userInitiatedCancellation" Core..=)
              Core.<$> userInitiatedCancellation
          ]
      )

-- | An entry of conversation between user and developer.
--
-- /See:/ 'newComment' smart constructor.
data Comment = Comment
  { -- | A comment from a developer.
    developerComment :: (Core.Maybe DeveloperComment),
    -- | A comment from a user.
    userComment :: (Core.Maybe UserComment)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Comment' with the minimum fields required to make a request.
newComment ::
  Comment
newComment =
  Comment
    { developerComment = Core.Nothing,
      userComment = Core.Nothing
    }

instance Core.FromJSON Comment where
  parseJSON =
    Core.withObject
      "Comment"
      ( \o ->
          Comment
            Core.<$> (o Core..:? "developerComment")
            Core.<*> (o Core..:? "userComment")
      )

instance Core.ToJSON Comment where
  toJSON Comment {..} =
    Core.object
      ( Core.catMaybes
          [ ("developerComment" Core..=) Core.<$> developerComment,
            ("userComment" Core..=) Core.<$> userComment
          ]
      )

-- | Request message for ConvertRegionPrices.
--
-- /See:/ 'newConvertRegionPricesRequest' smart constructor.
newtype ConvertRegionPricesRequest = ConvertRegionPricesRequest
  { -- | The intital price to convert other regions from. Tax exclusive.
    price :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConvertRegionPricesRequest' with the minimum fields required to make a request.
newConvertRegionPricesRequest ::
  ConvertRegionPricesRequest
newConvertRegionPricesRequest =
  ConvertRegionPricesRequest {price = Core.Nothing}

instance Core.FromJSON ConvertRegionPricesRequest where
  parseJSON =
    Core.withObject
      "ConvertRegionPricesRequest"
      (\o -> ConvertRegionPricesRequest Core.<$> (o Core..:? "price"))

instance Core.ToJSON ConvertRegionPricesRequest where
  toJSON ConvertRegionPricesRequest {..} =
    Core.object (Core.catMaybes [("price" Core..=) Core.<$> price])

-- | Response message for ConvertRegionPrices.
--
-- /See:/ 'newConvertRegionPricesResponse' smart constructor.
data ConvertRegionPricesResponse = ConvertRegionPricesResponse
  { -- | Converted other regions prices in USD and EUR, to use for countries where Play doesn\'t support a country\'s local currency.
    convertedOtherRegionsPrice :: (Core.Maybe ConvertedOtherRegionsPrice),
    -- | Map from region code to converted region price.
    convertedRegionPrices :: (Core.Maybe ConvertRegionPricesResponse_ConvertedRegionPrices),
    -- | The region version at which the prices were generated.
    regionVersion :: (Core.Maybe RegionsVersion)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConvertRegionPricesResponse' with the minimum fields required to make a request.
newConvertRegionPricesResponse ::
  ConvertRegionPricesResponse
newConvertRegionPricesResponse =
  ConvertRegionPricesResponse
    { convertedOtherRegionsPrice =
        Core.Nothing,
      convertedRegionPrices = Core.Nothing,
      regionVersion = Core.Nothing
    }

instance Core.FromJSON ConvertRegionPricesResponse where
  parseJSON =
    Core.withObject
      "ConvertRegionPricesResponse"
      ( \o ->
          ConvertRegionPricesResponse
            Core.<$> (o Core..:? "convertedOtherRegionsPrice")
            Core.<*> (o Core..:? "convertedRegionPrices")
            Core.<*> (o Core..:? "regionVersion")
      )

instance Core.ToJSON ConvertRegionPricesResponse where
  toJSON ConvertRegionPricesResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("convertedOtherRegionsPrice" Core..=)
              Core.<$> convertedOtherRegionsPrice,
            ("convertedRegionPrices" Core..=) Core.<$> convertedRegionPrices,
            ("regionVersion" Core..=) Core.<$> regionVersion
          ]
      )

-- | Map from region code to converted region price.
--
-- /See:/ 'newConvertRegionPricesResponse_ConvertedRegionPrices' smart constructor.
newtype ConvertRegionPricesResponse_ConvertedRegionPrices = ConvertRegionPricesResponse_ConvertedRegionPrices
  { additional :: (Core.HashMap Core.Text ConvertedRegionPrice)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConvertRegionPricesResponse_ConvertedRegionPrices' with the minimum fields required to make a request.
newConvertRegionPricesResponse_ConvertedRegionPrices ::
  -- |  See 'additional'.
  Core.HashMap Core.Text ConvertedRegionPrice ->
  ConvertRegionPricesResponse_ConvertedRegionPrices
newConvertRegionPricesResponse_ConvertedRegionPrices additional =
  ConvertRegionPricesResponse_ConvertedRegionPrices
    { additional =
        additional
    }

instance
  Core.FromJSON
    ConvertRegionPricesResponse_ConvertedRegionPrices
  where
  parseJSON =
    Core.withObject
      "ConvertRegionPricesResponse_ConvertedRegionPrices"
      ( \o ->
          ConvertRegionPricesResponse_ConvertedRegionPrices
            Core.<$> (Core.parseJSONObject o)
      )

instance
  Core.ToJSON
    ConvertRegionPricesResponse_ConvertedRegionPrices
  where
  toJSON ConvertRegionPricesResponse_ConvertedRegionPrices {..} =
    Core.toJSON additional

-- | Converted other regions prices.
--
-- /See:/ 'newConvertedOtherRegionsPrice' smart constructor.
data ConvertedOtherRegionsPrice = ConvertedOtherRegionsPrice
  { -- | Price in EUR to use for the \"Other regions\" location exclusive of taxes.
    eurPrice :: (Core.Maybe Money),
    -- | Price in USD to use for the \"Other regions\" location exclusive of taxes.
    usdPrice :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConvertedOtherRegionsPrice' with the minimum fields required to make a request.
newConvertedOtherRegionsPrice ::
  ConvertedOtherRegionsPrice
newConvertedOtherRegionsPrice =
  ConvertedOtherRegionsPrice
    { eurPrice = Core.Nothing,
      usdPrice = Core.Nothing
    }

instance Core.FromJSON ConvertedOtherRegionsPrice where
  parseJSON =
    Core.withObject
      "ConvertedOtherRegionsPrice"
      ( \o ->
          ConvertedOtherRegionsPrice
            Core.<$> (o Core..:? "eurPrice")
            Core.<*> (o Core..:? "usdPrice")
      )

instance Core.ToJSON ConvertedOtherRegionsPrice where
  toJSON ConvertedOtherRegionsPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("eurPrice" Core..=) Core.<$> eurPrice,
            ("usdPrice" Core..=) Core.<$> usdPrice
          ]
      )

-- | A converted region price.
--
-- /See:/ 'newConvertedRegionPrice' smart constructor.
data ConvertedRegionPrice = ConvertedRegionPrice
  { -- | The converted price tax inclusive.
    price :: (Core.Maybe Money),
    -- | The region code of the region.
    regionCode :: (Core.Maybe Core.Text),
    -- | The tax amount of the converted price.
    taxAmount :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConvertedRegionPrice' with the minimum fields required to make a request.
newConvertedRegionPrice ::
  ConvertedRegionPrice
newConvertedRegionPrice =
  ConvertedRegionPrice
    { price = Core.Nothing,
      regionCode = Core.Nothing,
      taxAmount = Core.Nothing
    }

instance Core.FromJSON ConvertedRegionPrice where
  parseJSON =
    Core.withObject
      "ConvertedRegionPrice"
      ( \o ->
          ConvertedRegionPrice
            Core.<$> (o Core..:? "price")
            Core.<*> (o Core..:? "regionCode")
            Core.<*> (o Core..:? "taxAmount")
      )

instance Core.ToJSON ConvertedRegionPrice where
  toJSON ConvertedRegionPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("price" Core..=) Core.<$> price,
            ("regionCode" Core..=) Core.<$> regionCode,
            ("taxAmount" Core..=) Core.<$> taxAmount
          ]
      )

-- | Country targeting specification.
--
-- /See:/ 'newCountryTargeting' smart constructor.
data CountryTargeting = CountryTargeting
  { -- | Countries to target, specified as two letter <https://unicode.org/cldr/charts/latest/supplemental/territory_containment_un_m_49.html CLDR codes>.
    countries :: (Core.Maybe [Core.Text]),
    -- | Include \"rest of world\" as well as explicitly targeted countries.
    includeRestOfWorld :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CountryTargeting' with the minimum fields required to make a request.
newCountryTargeting ::
  CountryTargeting
newCountryTargeting =
  CountryTargeting
    { countries = Core.Nothing,
      includeRestOfWorld = Core.Nothing
    }

instance Core.FromJSON CountryTargeting where
  parseJSON =
    Core.withObject
      "CountryTargeting"
      ( \o ->
          CountryTargeting
            Core.<$> (o Core..:? "countries")
            Core.<*> (o Core..:? "includeRestOfWorld")
      )

instance Core.ToJSON CountryTargeting where
  toJSON CountryTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("countries" Core..=) Core.<$> countries,
            ("includeRestOfWorld" Core..=) Core.<$> includeRestOfWorld
          ]
      )

-- | Request message for CreateDraftAppRecovery.
--
-- /See:/ 'newCreateDraftAppRecoveryRequest' smart constructor.
data CreateDraftAppRecoveryRequest = CreateDraftAppRecoveryRequest
  { -- | Action type is remote in-app update. As a consequence of this action, a downloadable recovery module is also created for testing purposes.
    remoteInAppUpdate :: (Core.Maybe RemoteInAppUpdate),
    -- | Specifies targeting criteria for the recovery action such as regions, android sdk versions, app versions etc.
    targeting :: (Core.Maybe Targeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CreateDraftAppRecoveryRequest' with the minimum fields required to make a request.
newCreateDraftAppRecoveryRequest ::
  CreateDraftAppRecoveryRequest
newCreateDraftAppRecoveryRequest =
  CreateDraftAppRecoveryRequest
    { remoteInAppUpdate = Core.Nothing,
      targeting = Core.Nothing
    }

instance Core.FromJSON CreateDraftAppRecoveryRequest where
  parseJSON =
    Core.withObject
      "CreateDraftAppRecoveryRequest"
      ( \o ->
          CreateDraftAppRecoveryRequest
            Core.<$> (o Core..:? "remoteInAppUpdate")
            Core.<*> (o Core..:? "targeting")
      )

instance Core.ToJSON CreateDraftAppRecoveryRequest where
  toJSON CreateDraftAppRecoveryRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("remoteInAppUpdate" Core..=) Core.<$> remoteInAppUpdate,
            ("targeting" Core..=) Core.<$> targeting
          ]
      )

-- | Request message for DeactivateBasePlan.
--
-- /See:/ 'newDeactivateBasePlanRequest' smart constructor.
data DeactivateBasePlanRequest = DeactivateBasePlanRequest
  { -- | Required. The unique base plan ID of the base plan to deactivate.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe DeactivateBasePlanRequest_LatencyTolerance),
    -- | Required. The parent app (package name) of the base plan to deactivate.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The parent subscription (ID) of the base plan to deactivate.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeactivateBasePlanRequest' with the minimum fields required to make a request.
newDeactivateBasePlanRequest ::
  DeactivateBasePlanRequest
newDeactivateBasePlanRequest =
  DeactivateBasePlanRequest
    { basePlanId = Core.Nothing,
      latencyTolerance = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing
    }

instance Core.FromJSON DeactivateBasePlanRequest where
  parseJSON =
    Core.withObject
      "DeactivateBasePlanRequest"
      ( \o ->
          DeactivateBasePlanRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
      )

instance Core.ToJSON DeactivateBasePlanRequest where
  toJSON DeactivateBasePlanRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId
          ]
      )

-- | Request message for DeactivateSubscriptionOffer.
--
-- /See:/ 'newDeactivateSubscriptionOfferRequest' smart constructor.
data DeactivateSubscriptionOfferRequest = DeactivateSubscriptionOfferRequest
  { -- | Required. The parent base plan (ID) of the offer to deactivate.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe DeactivateSubscriptionOfferRequest_LatencyTolerance),
    -- | Required. The unique offer ID of the offer to deactivate.
    offerId :: (Core.Maybe Core.Text),
    -- | Required. The parent app (package name) of the offer to deactivate.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The parent subscription (ID) of the offer to deactivate.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeactivateSubscriptionOfferRequest' with the minimum fields required to make a request.
newDeactivateSubscriptionOfferRequest ::
  DeactivateSubscriptionOfferRequest
newDeactivateSubscriptionOfferRequest =
  DeactivateSubscriptionOfferRequest
    { basePlanId = Core.Nothing,
      latencyTolerance = Core.Nothing,
      offerId = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing
    }

instance Core.FromJSON DeactivateSubscriptionOfferRequest where
  parseJSON =
    Core.withObject
      "DeactivateSubscriptionOfferRequest"
      ( \o ->
          DeactivateSubscriptionOfferRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "offerId")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
      )

instance Core.ToJSON DeactivateSubscriptionOfferRequest where
  toJSON DeactivateSubscriptionOfferRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("offerId" Core..=) Core.<$> offerId,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId
          ]
      )

-- | Information related to deferred item replacement.
--
-- /See:/ 'newDeferredItemReplacement' smart constructor.
newtype DeferredItemReplacement = DeferredItemReplacement
  { -- | The product/id going to replace the existing product/id.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeferredItemReplacement' with the minimum fields required to make a request.
newDeferredItemReplacement ::
  DeferredItemReplacement
newDeferredItemReplacement =
  DeferredItemReplacement {productId = Core.Nothing}

instance Core.FromJSON DeferredItemReplacement where
  parseJSON =
    Core.withObject
      "DeferredItemReplacement"
      (\o -> DeferredItemReplacement Core.<$> (o Core..:? "productId"))

instance Core.ToJSON DeferredItemReplacement where
  toJSON DeferredItemReplacement {..} =
    Core.object
      (Core.catMaybes [("productId" Core..=) Core.<$> productId])

-- | Represents a deobfuscation file.
--
-- /See:/ 'newDeobfuscationFile' smart constructor.
newtype DeobfuscationFile = DeobfuscationFile
  { -- | The type of the deobfuscation file.
    symbolType :: (Core.Maybe DeobfuscationFile_SymbolType)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeobfuscationFile' with the minimum fields required to make a request.
newDeobfuscationFile ::
  DeobfuscationFile
newDeobfuscationFile = DeobfuscationFile {symbolType = Core.Nothing}

instance Core.FromJSON DeobfuscationFile where
  parseJSON =
    Core.withObject
      "DeobfuscationFile"
      (\o -> DeobfuscationFile Core.<$> (o Core..:? "symbolType"))

instance Core.ToJSON DeobfuscationFile where
  toJSON DeobfuscationFile {..} =
    Core.object
      (Core.catMaybes [("symbolType" Core..=) Core.<$> symbolType])

-- | Responses for the upload.
--
-- /See:/ 'newDeobfuscationFilesUploadResponse' smart constructor.
newtype DeobfuscationFilesUploadResponse = DeobfuscationFilesUploadResponse
  { -- | The uploaded Deobfuscation File configuration.
    deobfuscationFile :: (Core.Maybe DeobfuscationFile)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeobfuscationFilesUploadResponse' with the minimum fields required to make a request.
newDeobfuscationFilesUploadResponse ::
  DeobfuscationFilesUploadResponse
newDeobfuscationFilesUploadResponse =
  DeobfuscationFilesUploadResponse
    { deobfuscationFile =
        Core.Nothing
    }

instance Core.FromJSON DeobfuscationFilesUploadResponse where
  parseJSON =
    Core.withObject
      "DeobfuscationFilesUploadResponse"
      ( \o ->
          DeobfuscationFilesUploadResponse
            Core.<$> (o Core..:? "deobfuscationFile")
      )

instance Core.ToJSON DeobfuscationFilesUploadResponse where
  toJSON DeobfuscationFilesUploadResponse {..} =
    Core.object
      ( Core.catMaybes
          [("deobfuscationFile" Core..=) Core.<$> deobfuscationFile]
      )

-- | Request message for DeployAppRecovery.
--
-- /See:/ 'newDeployAppRecoveryRequest' smart constructor.
data DeployAppRecoveryRequest = DeployAppRecoveryRequest
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeployAppRecoveryRequest' with the minimum fields required to make a request.
newDeployAppRecoveryRequest ::
  DeployAppRecoveryRequest
newDeployAppRecoveryRequest = DeployAppRecoveryRequest

instance Core.FromJSON DeployAppRecoveryRequest where
  parseJSON =
    Core.withObject
      "DeployAppRecoveryRequest"
      (\o -> Core.pure DeployAppRecoveryRequest)

instance Core.ToJSON DeployAppRecoveryRequest where
  toJSON = Core.const Core.emptyObject

-- | Response message for DeployAppRecovery.
--
-- /See:/ 'newDeployAppRecoveryResponse' smart constructor.
data DeployAppRecoveryResponse = DeployAppRecoveryResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeployAppRecoveryResponse' with the minimum fields required to make a request.
newDeployAppRecoveryResponse ::
  DeployAppRecoveryResponse
newDeployAppRecoveryResponse = DeployAppRecoveryResponse

instance Core.FromJSON DeployAppRecoveryResponse where
  parseJSON =
    Core.withObject
      "DeployAppRecoveryResponse"
      (\o -> Core.pure DeployAppRecoveryResponse)

instance Core.ToJSON DeployAppRecoveryResponse where
  toJSON = Core.const Core.emptyObject

-- | Developer entry from conversation between user and developer.
--
-- /See:/ 'newDeveloperComment' smart constructor.
data DeveloperComment = DeveloperComment
  { -- | The last time at which this comment was updated.
    lastModified :: (Core.Maybe Timestamp),
    -- | The content of the comment, i.e. reply body.
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeveloperComment' with the minimum fields required to make a request.
newDeveloperComment ::
  DeveloperComment
newDeveloperComment =
  DeveloperComment
    { lastModified = Core.Nothing,
      text = Core.Nothing
    }

instance Core.FromJSON DeveloperComment where
  parseJSON =
    Core.withObject
      "DeveloperComment"
      ( \o ->
          DeveloperComment
            Core.<$> (o Core..:? "lastModified")
            Core.<*> (o Core..:? "text")
      )

instance Core.ToJSON DeveloperComment where
  toJSON DeveloperComment {..} =
    Core.object
      ( Core.catMaybes
          [ ("lastModified" Core..=) Core.<$> lastModified,
            ("text" Core..=) Core.<$> text
          ]
      )

-- | Information specific to cancellations initiated by developers.
--
-- /See:/ 'newDeveloperInitiatedCancellation' smart constructor.
data DeveloperInitiatedCancellation = DeveloperInitiatedCancellation
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeveloperInitiatedCancellation' with the minimum fields required to make a request.
newDeveloperInitiatedCancellation ::
  DeveloperInitiatedCancellation
newDeveloperInitiatedCancellation = DeveloperInitiatedCancellation

instance Core.FromJSON DeveloperInitiatedCancellation where
  parseJSON =
    Core.withObject
      "DeveloperInitiatedCancellation"
      (\o -> Core.pure DeveloperInitiatedCancellation)

instance Core.ToJSON DeveloperInitiatedCancellation where
  toJSON = Core.const Core.emptyObject

-- | Represents a device feature.
--
-- /See:/ 'newDeviceFeature' smart constructor.
data DeviceFeature = DeviceFeature
  { -- | Name of the feature.
    featureName :: (Core.Maybe Core.Text),
    -- | The feature version specified by android:glEsVersion or android:version in in the AndroidManifest.
    featureVersion :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceFeature' with the minimum fields required to make a request.
newDeviceFeature ::
  DeviceFeature
newDeviceFeature =
  DeviceFeature
    { featureName = Core.Nothing,
      featureVersion = Core.Nothing
    }

instance Core.FromJSON DeviceFeature where
  parseJSON =
    Core.withObject
      "DeviceFeature"
      ( \o ->
          DeviceFeature
            Core.<$> (o Core..:? "featureName")
            Core.<*> (o Core..:? "featureVersion")
      )

instance Core.ToJSON DeviceFeature where
  toJSON DeviceFeature {..} =
    Core.object
      ( Core.catMaybes
          [ ("featureName" Core..=) Core.<$> featureName,
            ("featureVersion" Core..=) Core.<$> featureVersion
          ]
      )

-- | Targeting for a device feature.
--
-- /See:/ 'newDeviceFeatureTargeting' smart constructor.
newtype DeviceFeatureTargeting = DeviceFeatureTargeting
  { -- | Feature of the device.
    requiredFeature :: (Core.Maybe DeviceFeature)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceFeatureTargeting' with the minimum fields required to make a request.
newDeviceFeatureTargeting ::
  DeviceFeatureTargeting
newDeviceFeatureTargeting =
  DeviceFeatureTargeting {requiredFeature = Core.Nothing}

instance Core.FromJSON DeviceFeatureTargeting where
  parseJSON =
    Core.withObject
      "DeviceFeatureTargeting"
      ( \o ->
          DeviceFeatureTargeting Core.<$> (o Core..:? "requiredFeature")
      )

instance Core.ToJSON DeviceFeatureTargeting where
  toJSON DeviceFeatureTargeting {..} =
    Core.object
      ( Core.catMaybes
          [("requiredFeature" Core..=) Core.<$> requiredFeature]
      )

-- | A group of devices. A group is defined by a set of device selectors. A device belongs to the group if it matches any selector (logical OR).
--
-- /See:/ 'newDeviceGroup' smart constructor.
data DeviceGroup = DeviceGroup
  { -- | Device selectors for this group. A device matching any of the selectors is included in this group.
    deviceSelectors :: (Core.Maybe [DeviceSelector]),
    -- | The name of the group.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceGroup' with the minimum fields required to make a request.
newDeviceGroup ::
  DeviceGroup
newDeviceGroup =
  DeviceGroup {deviceSelectors = Core.Nothing, name = Core.Nothing}

instance Core.FromJSON DeviceGroup where
  parseJSON =
    Core.withObject
      "DeviceGroup"
      ( \o ->
          DeviceGroup
            Core.<$> (o Core..:? "deviceSelectors")
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON DeviceGroup where
  toJSON DeviceGroup {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceSelectors" Core..=) Core.<$> deviceSelectors,
            ("name" Core..=) Core.<$> name
          ]
      )

-- | Identifier of a device.
--
-- /See:/ 'newDeviceId' smart constructor.
data DeviceId = DeviceId
  { -- | Value of Build.BRAND.
    buildBrand :: (Core.Maybe Core.Text),
    -- | Value of Build.DEVICE.
    buildDevice :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceId' with the minimum fields required to make a request.
newDeviceId ::
  DeviceId
newDeviceId =
  DeviceId {buildBrand = Core.Nothing, buildDevice = Core.Nothing}

instance Core.FromJSON DeviceId where
  parseJSON =
    Core.withObject
      "DeviceId"
      ( \o ->
          DeviceId
            Core.<$> (o Core..:? "buildBrand")
            Core.<*> (o Core..:? "buildDevice")
      )

instance Core.ToJSON DeviceId where
  toJSON DeviceId {..} =
    Core.object
      ( Core.catMaybes
          [ ("buildBrand" Core..=) Core.<$> buildBrand,
            ("buildDevice" Core..=) Core.<$> buildDevice
          ]
      )

-- | Characteristics of the user\'s device.
--
-- /See:/ 'newDeviceMetadata' smart constructor.
data DeviceMetadata = DeviceMetadata
  { -- | Device CPU make, e.g. \"Qualcomm\"
    cpuMake :: (Core.Maybe Core.Text),
    -- | Device CPU model, e.g. \"MSM8974\"
    cpuModel :: (Core.Maybe Core.Text),
    -- | Device class (e.g. tablet)
    deviceClass :: (Core.Maybe Core.Text),
    -- | OpenGL version
    glEsVersion :: (Core.Maybe Core.Int32),
    -- | Device manufacturer (e.g. Motorola)
    manufacturer :: (Core.Maybe Core.Text),
    -- | Comma separated list of native platforms (e.g. \"arm\", \"arm7\")
    nativePlatform :: (Core.Maybe Core.Text),
    -- | Device model name (e.g. Droid)
    productName :: (Core.Maybe Core.Text),
    -- | Device RAM in Megabytes, e.g. \"2048\"
    ramMb :: (Core.Maybe Core.Int32),
    -- | Screen density in DPI
    screenDensityDpi :: (Core.Maybe Core.Int32),
    -- | Screen height in pixels
    screenHeightPx :: (Core.Maybe Core.Int32),
    -- | Screen width in pixels
    screenWidthPx :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceMetadata' with the minimum fields required to make a request.
newDeviceMetadata ::
  DeviceMetadata
newDeviceMetadata =
  DeviceMetadata
    { cpuMake = Core.Nothing,
      cpuModel = Core.Nothing,
      deviceClass = Core.Nothing,
      glEsVersion = Core.Nothing,
      manufacturer = Core.Nothing,
      nativePlatform = Core.Nothing,
      productName = Core.Nothing,
      ramMb = Core.Nothing,
      screenDensityDpi = Core.Nothing,
      screenHeightPx = Core.Nothing,
      screenWidthPx = Core.Nothing
    }

instance Core.FromJSON DeviceMetadata where
  parseJSON =
    Core.withObject
      "DeviceMetadata"
      ( \o ->
          DeviceMetadata
            Core.<$> (o Core..:? "cpuMake")
            Core.<*> (o Core..:? "cpuModel")
            Core.<*> (o Core..:? "deviceClass")
            Core.<*> (o Core..:? "glEsVersion")
            Core.<*> (o Core..:? "manufacturer")
            Core.<*> (o Core..:? "nativePlatform")
            Core.<*> (o Core..:? "productName")
            Core.<*> (o Core..:? "ramMb")
            Core.<*> (o Core..:? "screenDensityDpi")
            Core.<*> (o Core..:? "screenHeightPx")
            Core.<*> (o Core..:? "screenWidthPx")
      )

instance Core.ToJSON DeviceMetadata where
  toJSON DeviceMetadata {..} =
    Core.object
      ( Core.catMaybes
          [ ("cpuMake" Core..=) Core.<$> cpuMake,
            ("cpuModel" Core..=) Core.<$> cpuModel,
            ("deviceClass" Core..=) Core.<$> deviceClass,
            ("glEsVersion" Core..=) Core.<$> glEsVersion,
            ("manufacturer" Core..=) Core.<$> manufacturer,
            ("nativePlatform" Core..=) Core.<$> nativePlatform,
            ("productName" Core..=) Core.<$> productName,
            ("ramMb" Core..=) Core.<$> ramMb,
            ("screenDensityDpi" Core..=) Core.<$> screenDensityDpi,
            ("screenHeightPx" Core..=) Core.<$> screenHeightPx,
            ("screenWidthPx" Core..=) Core.<$> screenWidthPx
          ]
      )

-- | Conditions about a device\'s RAM capabilities.
--
-- /See:/ 'newDeviceRam' smart constructor.
data DeviceRam = DeviceRam
  { -- | Maximum RAM in bytes (bound excluded).
    maxBytes :: (Core.Maybe Core.Int64),
    -- | Minimum RAM in bytes (bound included).
    minBytes :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceRam' with the minimum fields required to make a request.
newDeviceRam ::
  DeviceRam
newDeviceRam =
  DeviceRam {maxBytes = Core.Nothing, minBytes = Core.Nothing}

instance Core.FromJSON DeviceRam where
  parseJSON =
    Core.withObject
      "DeviceRam"
      ( \o ->
          DeviceRam
            Core.<$> (o Core..:? "maxBytes" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "minBytes" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON DeviceRam where
  toJSON DeviceRam {..} =
    Core.object
      ( Core.catMaybes
          [ ("maxBytes" Core..=) Core.. Core.AsText Core.<$> maxBytes,
            ("minBytes" Core..=) Core.. Core.AsText Core.<$> minBytes
          ]
      )

-- | Selector for a device group. A selector consists of a set of conditions on the device that should all match (logical AND) to determine a device group eligibility. For instance, if a selector specifies RAM conditions, device model inclusion and device model exclusion, a device is considered to match if: device matches RAM conditions AND device matches one of the included device models AND device doesn\'t match excluded device models
--
-- /See:/ 'newDeviceSelector' smart constructor.
data DeviceSelector = DeviceSelector
  { -- | Conditions on the device\'s RAM.
    deviceRam :: (Core.Maybe DeviceRam),
    -- | Device models excluded by this selector, even if they match all other conditions.
    excludedDeviceIds :: (Core.Maybe [DeviceId]),
    -- | A device that has any of these system features is excluded by this selector, even if it matches all other conditions.
    forbiddenSystemFeatures :: (Core.Maybe [SystemFeature]),
    -- | Device models included by this selector.
    includedDeviceIds :: (Core.Maybe [DeviceId]),
    -- | A device needs to have all these system features to be included by the selector.
    requiredSystemFeatures :: (Core.Maybe [SystemFeature]),
    -- | Optional. The SoCs included by this selector. Only works for Android S+ devices.
    systemOnChips :: (Core.Maybe [SystemOnChip])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceSelector' with the minimum fields required to make a request.
newDeviceSelector ::
  DeviceSelector
newDeviceSelector =
  DeviceSelector
    { deviceRam = Core.Nothing,
      excludedDeviceIds = Core.Nothing,
      forbiddenSystemFeatures = Core.Nothing,
      includedDeviceIds = Core.Nothing,
      requiredSystemFeatures = Core.Nothing,
      systemOnChips = Core.Nothing
    }

instance Core.FromJSON DeviceSelector where
  parseJSON =
    Core.withObject
      "DeviceSelector"
      ( \o ->
          DeviceSelector
            Core.<$> (o Core..:? "deviceRam")
            Core.<*> (o Core..:? "excludedDeviceIds")
            Core.<*> (o Core..:? "forbiddenSystemFeatures")
            Core.<*> (o Core..:? "includedDeviceIds")
            Core.<*> (o Core..:? "requiredSystemFeatures")
            Core.<*> (o Core..:? "systemOnChips")
      )

instance Core.ToJSON DeviceSelector where
  toJSON DeviceSelector {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceRam" Core..=) Core.<$> deviceRam,
            ("excludedDeviceIds" Core..=) Core.<$> excludedDeviceIds,
            ("forbiddenSystemFeatures" Core..=)
              Core.<$> forbiddenSystemFeatures,
            ("includedDeviceIds" Core..=) Core.<$> includedDeviceIds,
            ("requiredSystemFeatures" Core..=) Core.<$> requiredSystemFeatures,
            ("systemOnChips" Core..=) Core.<$> systemOnChips
          ]
      )

-- | The device spec used to generate a system APK.
--
-- /See:/ 'newDeviceSpec' smart constructor.
data DeviceSpec = DeviceSpec
  { -- | Screen dpi.
    screenDensity :: (Core.Maybe Core.Word32),
    -- | Supported ABI architectures in the order of preference. The values should be the string as reported by the platform, e.g. \"armeabi-v7a\", \"x86_64\".
    supportedAbis :: (Core.Maybe [Core.Text]),
    -- | All installed locales represented as BCP-47 strings, e.g. \"en-US\".
    supportedLocales :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceSpec' with the minimum fields required to make a request.
newDeviceSpec ::
  DeviceSpec
newDeviceSpec =
  DeviceSpec
    { screenDensity = Core.Nothing,
      supportedAbis = Core.Nothing,
      supportedLocales = Core.Nothing
    }

instance Core.FromJSON DeviceSpec where
  parseJSON =
    Core.withObject
      "DeviceSpec"
      ( \o ->
          DeviceSpec
            Core.<$> (o Core..:? "screenDensity")
            Core.<*> (o Core..:? "supportedAbis")
            Core.<*> (o Core..:? "supportedLocales")
      )

instance Core.ToJSON DeviceSpec where
  toJSON DeviceSpec {..} =
    Core.object
      ( Core.catMaybes
          [ ("screenDensity" Core..=) Core.<$> screenDensity,
            ("supportedAbis" Core..=) Core.<$> supportedAbis,
            ("supportedLocales" Core..=) Core.<$> supportedLocales
          ]
      )

-- | A single device tier. Devices matching any of the device groups in device/group/names are considered to match the tier.
--
-- /See:/ 'newDeviceTier' smart constructor.
data DeviceTier = DeviceTier
  { -- | Groups of devices included in this tier. These groups must be defined explicitly under device_groups in this configuration.
    deviceGroupNames :: (Core.Maybe [Core.Text]),
    -- | The priority level of the tier. Tiers are evaluated in descending order of level: the highest level tier has the highest priority. The highest tier matching a given device is selected for that device. You should use a contiguous range of levels for your tiers in a tier set; tier levels in a tier set must be unique. For instance, if your tier set has 4 tiers (including the global fallback), you should define tiers 1, 2 and 3 in this configuration. Note: tier 0 is implicitly defined as a global fallback and selected for devices that don\'t match any of the tiers explicitly defined here. You mustn\'t define level 0 explicitly in this configuration.
    level :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceTier' with the minimum fields required to make a request.
newDeviceTier ::
  DeviceTier
newDeviceTier =
  DeviceTier {deviceGroupNames = Core.Nothing, level = Core.Nothing}

instance Core.FromJSON DeviceTier where
  parseJSON =
    Core.withObject
      "DeviceTier"
      ( \o ->
          DeviceTier
            Core.<$> (o Core..:? "deviceGroupNames")
            Core.<*> (o Core..:? "level")
      )

instance Core.ToJSON DeviceTier where
  toJSON DeviceTier {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceGroupNames" Core..=) Core.<$> deviceGroupNames,
            ("level" Core..=) Core.<$> level
          ]
      )

-- | Configuration describing device targeting criteria for the content of an app.
--
-- /See:/ 'newDeviceTierConfig' smart constructor.
data DeviceTierConfig = DeviceTierConfig
  { -- | Definition of device groups for the app.
    deviceGroups :: (Core.Maybe [DeviceGroup]),
    -- | Output only. The device tier config ID.
    deviceTierConfigId :: (Core.Maybe Core.Int64),
    -- | Definition of the set of device tiers for the app.
    deviceTierSet :: (Core.Maybe DeviceTierSet),
    -- | Definition of user country sets for the app.
    userCountrySets :: (Core.Maybe [UserCountrySet])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceTierConfig' with the minimum fields required to make a request.
newDeviceTierConfig ::
  DeviceTierConfig
newDeviceTierConfig =
  DeviceTierConfig
    { deviceGroups = Core.Nothing,
      deviceTierConfigId = Core.Nothing,
      deviceTierSet = Core.Nothing,
      userCountrySets = Core.Nothing
    }

instance Core.FromJSON DeviceTierConfig where
  parseJSON =
    Core.withObject
      "DeviceTierConfig"
      ( \o ->
          DeviceTierConfig
            Core.<$> (o Core..:? "deviceGroups")
            Core.<*> ( o
                         Core..:? "deviceTierConfigId"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "deviceTierSet")
            Core.<*> (o Core..:? "userCountrySets")
      )

instance Core.ToJSON DeviceTierConfig where
  toJSON DeviceTierConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceGroups" Core..=) Core.<$> deviceGroups,
            ("deviceTierConfigId" Core..=)
              Core.. Core.AsText
              Core.<$> deviceTierConfigId,
            ("deviceTierSet" Core..=) Core.<$> deviceTierSet,
            ("userCountrySets" Core..=) Core.<$> userCountrySets
          ]
      )

-- | A set of device tiers. A tier set determines what variation of app content gets served to a specific device, for device-targeted content. You should assign a priority level to each tier, which determines the ordering by which they are evaluated by Play. See the documentation of DeviceTier.level for more details.
--
-- /See:/ 'newDeviceTierSet' smart constructor.
newtype DeviceTierSet = DeviceTierSet
  { -- | Device tiers belonging to the set.
    deviceTiers :: (Core.Maybe [DeviceTier])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DeviceTierSet' with the minimum fields required to make a request.
newDeviceTierSet ::
  DeviceTierSet
newDeviceTierSet = DeviceTierSet {deviceTiers = Core.Nothing}

instance Core.FromJSON DeviceTierSet where
  parseJSON =
    Core.withObject
      "DeviceTierSet"
      (\o -> DeviceTierSet Core.<$> (o Core..:? "deviceTiers"))

instance Core.ToJSON DeviceTierSet where
  toJSON DeviceTierSet {..} =
    Core.object
      (Core.catMaybes [("deviceTiers" Core..=) Core.<$> deviceTiers])

-- | An expansion file. The resource for ExpansionFilesService.
--
-- /See:/ 'newExpansionFile' smart constructor.
data ExpansionFile = ExpansionFile
  { -- | If set, this field indicates that this APK has an expansion file uploaded to it: this APK does not reference another APK\'s expansion file. The field\'s value is the size of the uploaded expansion file in bytes.
    fileSize :: (Core.Maybe Core.Int64),
    -- | If set, this APK\'s expansion file references another APK\'s expansion file. The file_size field will not be set.
    referencesVersion :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExpansionFile' with the minimum fields required to make a request.
newExpansionFile ::
  ExpansionFile
newExpansionFile =
  ExpansionFile
    { fileSize = Core.Nothing,
      referencesVersion = Core.Nothing
    }

instance Core.FromJSON ExpansionFile where
  parseJSON =
    Core.withObject
      "ExpansionFile"
      ( \o ->
          ExpansionFile
            Core.<$> (o Core..:? "fileSize" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "referencesVersion")
      )

instance Core.ToJSON ExpansionFile where
  toJSON ExpansionFile {..} =
    Core.object
      ( Core.catMaybes
          [ ("fileSize" Core..=) Core.. Core.AsText Core.<$> fileSize,
            ("referencesVersion" Core..=) Core.<$> referencesVersion
          ]
      )

-- | Response for uploading an expansion file.
--
-- /See:/ 'newExpansionFilesUploadResponse' smart constructor.
newtype ExpansionFilesUploadResponse = ExpansionFilesUploadResponse
  { -- | The uploaded expansion file configuration.
    expansionFile :: (Core.Maybe ExpansionFile)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExpansionFilesUploadResponse' with the minimum fields required to make a request.
newExpansionFilesUploadResponse ::
  ExpansionFilesUploadResponse
newExpansionFilesUploadResponse =
  ExpansionFilesUploadResponse {expansionFile = Core.Nothing}

instance Core.FromJSON ExpansionFilesUploadResponse where
  parseJSON =
    Core.withObject
      "ExpansionFilesUploadResponse"
      ( \o ->
          ExpansionFilesUploadResponse Core.<$> (o Core..:? "expansionFile")
      )

instance Core.ToJSON ExpansionFilesUploadResponse where
  toJSON ExpansionFilesUploadResponse {..} =
    Core.object
      (Core.catMaybes [("expansionFile" Core..=) Core.<$> expansionFile])

-- | User account identifier in the third-party service.
--
-- /See:/ 'newExternalAccountIdentifiers' smart constructor.
data ExternalAccountIdentifiers = ExternalAccountIdentifiers
  { -- | User account identifier in the third-party service. Only present if account linking happened as part of the subscription purchase flow.
    externalAccountId :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s account in your app. Present for the following purchases: * If account linking happened as part of the subscription purchase flow. * It was specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedaccountid when the purchase was made.
    obfuscatedExternalAccountId :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s profile in your app. Only present if specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedprofileid when the purchase was made.
    obfuscatedExternalProfileId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternalAccountIdentifiers' with the minimum fields required to make a request.
newExternalAccountIdentifiers ::
  ExternalAccountIdentifiers
newExternalAccountIdentifiers =
  ExternalAccountIdentifiers
    { externalAccountId = Core.Nothing,
      obfuscatedExternalAccountId = Core.Nothing,
      obfuscatedExternalProfileId = Core.Nothing
    }

instance Core.FromJSON ExternalAccountIdentifiers where
  parseJSON =
    Core.withObject
      "ExternalAccountIdentifiers"
      ( \o ->
          ExternalAccountIdentifiers
            Core.<$> (o Core..:? "externalAccountId")
            Core.<*> (o Core..:? "obfuscatedExternalAccountId")
            Core.<*> (o Core..:? "obfuscatedExternalProfileId")
      )

instance Core.ToJSON ExternalAccountIdentifiers where
  toJSON ExternalAccountIdentifiers {..} =
    Core.object
      ( Core.catMaybes
          [ ("externalAccountId" Core..=) Core.<$> externalAccountId,
            ("obfuscatedExternalAccountId" Core..=)
              Core.<$> obfuscatedExternalAccountId,
            ("obfuscatedExternalProfileId" Core..=)
              Core.<$> obfuscatedExternalProfileId
          ]
      )

-- | Details of an external subscription.
--
-- /See:/ 'newExternalSubscription' smart constructor.
newtype ExternalSubscription = ExternalSubscription
  { -- | Required. The type of the external subscription.
    subscriptionType :: (Core.Maybe ExternalSubscription_SubscriptionType)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternalSubscription' with the minimum fields required to make a request.
newExternalSubscription ::
  ExternalSubscription
newExternalSubscription =
  ExternalSubscription {subscriptionType = Core.Nothing}

instance Core.FromJSON ExternalSubscription where
  parseJSON =
    Core.withObject
      "ExternalSubscription"
      ( \o ->
          ExternalSubscription Core.<$> (o Core..:? "subscriptionType")
      )

instance Core.ToJSON ExternalSubscription where
  toJSON ExternalSubscription {..} =
    Core.object
      ( Core.catMaybes
          [("subscriptionType" Core..=) Core.<$> subscriptionType]
      )

-- | The details of an external transaction.
--
-- /See:/ 'newExternalTransaction' smart constructor.
data ExternalTransaction = ExternalTransaction
  { -- | Output only. The time when this transaction was created. This is the time when Google was notified of the transaction.
    createTime :: (Core.Maybe Core.DateTime),
    -- | Output only. The current transaction amount before tax. This represents the current pre-tax amount including any refunds that may have been applied to this transaction.
    currentPreTaxAmount :: (Core.Maybe Price),
    -- | Output only. The current tax amount. This represents the current tax amount including any refunds that may have been applied to this transaction.
    currentTaxAmount :: (Core.Maybe Price),
    -- | Output only. The id of this transaction. All transaction ids under the same package name must be unique. Set when creating the external transaction.
    externalTransactionId :: (Core.Maybe Core.Text),
    -- | This is a one-time transaction and not part of a subscription.
    oneTimeTransaction :: (Core.Maybe OneTimeExternalTransaction),
    -- | Required. The original transaction amount before taxes. This represents the pre-tax amount originally notified to Google before any refunds were applied.
    originalPreTaxAmount :: (Core.Maybe Price),
    -- | Required. The original tax amount. This represents the tax amount originally notified to Google before any refunds were applied.
    originalTaxAmount :: (Core.Maybe Price),
    -- | Output only. The resource name of the external transaction. The package name of the application the inapp products were sold (for example, \'com.some.app\').
    packageName :: (Core.Maybe Core.Text),
    -- | This transaction is part of a recurring series of transactions.
    recurringTransaction :: (Core.Maybe RecurringExternalTransaction),
    -- | Output only. If set, this transaction was a test purchase. Google will not charge for a test transaction.
    testPurchase :: (Core.Maybe ExternalTransactionTestPurchase),
    -- | Optional. The transaction program code, used to help determine service fee for eligible apps participating in partner programs. Developers participating in the Play Media Experience Program (https:\/\/play.google.com\/console\/about\/programs\/mediaprogram\/) must provide the program code when reporting alternative billing transactions. If you are an eligible developer, please contact your BDM for more information on how to set this field. Note: this field can not be used for external offers transactions.
    transactionProgramCode :: (Core.Maybe Core.Int32),
    -- | Output only. The current state of the transaction.
    transactionState :: (Core.Maybe ExternalTransaction_TransactionState),
    -- | Required. The time when the transaction was completed.
    transactionTime :: (Core.Maybe Core.DateTime),
    -- | Required. User address for tax computation.
    userTaxAddress :: (Core.Maybe ExternalTransactionAddress)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternalTransaction' with the minimum fields required to make a request.
newExternalTransaction ::
  ExternalTransaction
newExternalTransaction =
  ExternalTransaction
    { createTime = Core.Nothing,
      currentPreTaxAmount = Core.Nothing,
      currentTaxAmount = Core.Nothing,
      externalTransactionId = Core.Nothing,
      oneTimeTransaction = Core.Nothing,
      originalPreTaxAmount = Core.Nothing,
      originalTaxAmount = Core.Nothing,
      packageName = Core.Nothing,
      recurringTransaction = Core.Nothing,
      testPurchase = Core.Nothing,
      transactionProgramCode = Core.Nothing,
      transactionState = Core.Nothing,
      transactionTime = Core.Nothing,
      userTaxAddress = Core.Nothing
    }

instance Core.FromJSON ExternalTransaction where
  parseJSON =
    Core.withObject
      "ExternalTransaction"
      ( \o ->
          ExternalTransaction
            Core.<$> (o Core..:? "createTime")
            Core.<*> (o Core..:? "currentPreTaxAmount")
            Core.<*> (o Core..:? "currentTaxAmount")
            Core.<*> (o Core..:? "externalTransactionId")
            Core.<*> (o Core..:? "oneTimeTransaction")
            Core.<*> (o Core..:? "originalPreTaxAmount")
            Core.<*> (o Core..:? "originalTaxAmount")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "recurringTransaction")
            Core.<*> (o Core..:? "testPurchase")
            Core.<*> (o Core..:? "transactionProgramCode")
            Core.<*> (o Core..:? "transactionState")
            Core.<*> (o Core..:? "transactionTime")
            Core.<*> (o Core..:? "userTaxAddress")
      )

instance Core.ToJSON ExternalTransaction where
  toJSON ExternalTransaction {..} =
    Core.object
      ( Core.catMaybes
          [ ("createTime" Core..=) Core.<$> createTime,
            ("currentPreTaxAmount" Core..=) Core.<$> currentPreTaxAmount,
            ("currentTaxAmount" Core..=) Core.<$> currentTaxAmount,
            ("externalTransactionId" Core..=) Core.<$> externalTransactionId,
            ("oneTimeTransaction" Core..=) Core.<$> oneTimeTransaction,
            ("originalPreTaxAmount" Core..=) Core.<$> originalPreTaxAmount,
            ("originalTaxAmount" Core..=) Core.<$> originalTaxAmount,
            ("packageName" Core..=) Core.<$> packageName,
            ("recurringTransaction" Core..=) Core.<$> recurringTransaction,
            ("testPurchase" Core..=) Core.<$> testPurchase,
            ("transactionProgramCode" Core..=) Core.<$> transactionProgramCode,
            ("transactionState" Core..=) Core.<$> transactionState,
            ("transactionTime" Core..=) Core.<$> transactionTime,
            ("userTaxAddress" Core..=) Core.<$> userTaxAddress
          ]
      )

-- | User\'s address for the external transaction.
--
-- /See:/ 'newExternalTransactionAddress' smart constructor.
data ExternalTransactionAddress = ExternalTransactionAddress
  { -- | Optional. Top-level administrative subdivision of the country\/region. Only required for transactions in India. Valid values are \"ANDAMAN AND NICOBAR ISLANDS\", \"ANDHRA PRADESH\", \"ARUNACHAL PRADESH\", \"ASSAM\", \"BIHAR\", \"CHANDIGARH\", \"CHHATTISGARH\", \"DADRA AND NAGAR HAVELI\", \"DADRA AND NAGAR HAVELI AND DAMAN AND DIU\", \"DAMAN AND DIU\", \"DELHI\", \"GOA\", \"GUJARAT\", \"HARYANA\", \"HIMACHAL PRADESH\", \"JAMMU AND KASHMIR\", \"JHARKHAND\", \"KARNATAKA\", \"KERALA\", \"LADAKH\", \"LAKSHADWEEP\", \"MADHYA PRADESH\", \"MAHARASHTRA\", \"MANIPUR\", \"MEGHALAYA\", \"MIZORAM\", \"NAGALAND\", \"ODISHA\", \"PUDUCHERRY\", \"PUNJAB\", \"RAJASTHAN\", \"SIKKIM\", \"TAMIL NADU\", \"TELANGANA\", \"TRIPURA\", \"UTTAR PRADESH\", \"UTTARAKHAND\", and \"WEST BENGAL\".
    administrativeArea :: (Core.Maybe Core.Text),
    -- | Required. Two letter region code based on ISO-3166-1 Alpha-2 (UN region codes).
    regionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternalTransactionAddress' with the minimum fields required to make a request.
newExternalTransactionAddress ::
  ExternalTransactionAddress
newExternalTransactionAddress =
  ExternalTransactionAddress
    { administrativeArea = Core.Nothing,
      regionCode = Core.Nothing
    }

instance Core.FromJSON ExternalTransactionAddress where
  parseJSON =
    Core.withObject
      "ExternalTransactionAddress"
      ( \o ->
          ExternalTransactionAddress
            Core.<$> (o Core..:? "administrativeArea")
            Core.<*> (o Core..:? "regionCode")
      )

instance Core.ToJSON ExternalTransactionAddress where
  toJSON ExternalTransactionAddress {..} =
    Core.object
      ( Core.catMaybes
          [ ("administrativeArea" Core..=) Core.<$> administrativeArea,
            ("regionCode" Core..=) Core.<$> regionCode
          ]
      )

-- | Represents a transaction performed using a test account. These transactions will not be charged by Google.
--
-- /See:/ 'newExternalTransactionTestPurchase' smart constructor.
data ExternalTransactionTestPurchase = ExternalTransactionTestPurchase
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternalTransactionTestPurchase' with the minimum fields required to make a request.
newExternalTransactionTestPurchase ::
  ExternalTransactionTestPurchase
newExternalTransactionTestPurchase =
  ExternalTransactionTestPurchase

instance Core.FromJSON ExternalTransactionTestPurchase where
  parseJSON =
    Core.withObject
      "ExternalTransactionTestPurchase"
      (\o -> Core.pure ExternalTransactionTestPurchase)

instance Core.ToJSON ExternalTransactionTestPurchase where
  toJSON = Core.const Core.emptyObject

-- | Defines an APK available for this application that is hosted externally and not uploaded to Google Play. This function is only available to organizations using Managed Play whose application is configured to restrict distribution to the organizations.
--
-- /See:/ 'newExternallyHostedApk' smart constructor.
data ExternallyHostedApk = ExternallyHostedApk
  { -- | The application label.
    applicationLabel :: (Core.Maybe Core.Text),
    -- | A certificate (or array of certificates if a certificate-chain is used) used to sign this APK, represented as a base64 encoded byte array.
    certificateBase64s :: (Core.Maybe [Core.Text]),
    -- | The URL at which the APK is hosted. This must be an https URL.
    externallyHostedUrl :: (Core.Maybe Core.Text),
    -- | The sha1 checksum of this APK, represented as a base64 encoded byte array.
    fileSha1Base64 :: (Core.Maybe Core.Text),
    -- | The sha256 checksum of this APK, represented as a base64 encoded byte array.
    fileSha256Base64 :: (Core.Maybe Core.Text),
    -- | The file size in bytes of this APK.
    fileSize :: (Core.Maybe Core.Int64),
    -- | The icon image from the APK, as a base64 encoded byte array.
    iconBase64 :: (Core.Maybe Core.Text),
    -- | The maximum SDK supported by this APK (optional).
    maximumSdk :: (Core.Maybe Core.Int32),
    -- | The minimum SDK targeted by this APK.
    minimumSdk :: (Core.Maybe Core.Int32),
    -- | The native code environments supported by this APK (optional).
    nativeCodes :: (Core.Maybe [Core.Text]),
    -- | The package name.
    packageName :: (Core.Maybe Core.Text),
    -- | The features required by this APK (optional).
    usesFeatures :: (Core.Maybe [Core.Text]),
    -- | The permissions requested by this APK.
    usesPermissions :: (Core.Maybe [UsesPermission]),
    -- | The version code of this APK.
    versionCode :: (Core.Maybe Core.Int32),
    -- | The version name of this APK.
    versionName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ExternallyHostedApk' with the minimum fields required to make a request.
newExternallyHostedApk ::
  ExternallyHostedApk
newExternallyHostedApk =
  ExternallyHostedApk
    { applicationLabel = Core.Nothing,
      certificateBase64s = Core.Nothing,
      externallyHostedUrl = Core.Nothing,
      fileSha1Base64 = Core.Nothing,
      fileSha256Base64 = Core.Nothing,
      fileSize = Core.Nothing,
      iconBase64 = Core.Nothing,
      maximumSdk = Core.Nothing,
      minimumSdk = Core.Nothing,
      nativeCodes = Core.Nothing,
      packageName = Core.Nothing,
      usesFeatures = Core.Nothing,
      usesPermissions = Core.Nothing,
      versionCode = Core.Nothing,
      versionName = Core.Nothing
    }

instance Core.FromJSON ExternallyHostedApk where
  parseJSON =
    Core.withObject
      "ExternallyHostedApk"
      ( \o ->
          ExternallyHostedApk
            Core.<$> (o Core..:? "applicationLabel")
            Core.<*> (o Core..:? "certificateBase64s")
            Core.<*> (o Core..:? "externallyHostedUrl")
            Core.<*> (o Core..:? "fileSha1Base64")
            Core.<*> (o Core..:? "fileSha256Base64")
            Core.<*> (o Core..:? "fileSize" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "iconBase64")
            Core.<*> (o Core..:? "maximumSdk")
            Core.<*> (o Core..:? "minimumSdk")
            Core.<*> (o Core..:? "nativeCodes")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "usesFeatures")
            Core.<*> (o Core..:? "usesPermissions")
            Core.<*> (o Core..:? "versionCode")
            Core.<*> (o Core..:? "versionName")
      )

instance Core.ToJSON ExternallyHostedApk where
  toJSON ExternallyHostedApk {..} =
    Core.object
      ( Core.catMaybes
          [ ("applicationLabel" Core..=) Core.<$> applicationLabel,
            ("certificateBase64s" Core..=) Core.<$> certificateBase64s,
            ("externallyHostedUrl" Core..=) Core.<$> externallyHostedUrl,
            ("fileSha1Base64" Core..=) Core.<$> fileSha1Base64,
            ("fileSha256Base64" Core..=) Core.<$> fileSha256Base64,
            ("fileSize" Core..=) Core.. Core.AsText Core.<$> fileSize,
            ("iconBase64" Core..=) Core.<$> iconBase64,
            ("maximumSdk" Core..=) Core.<$> maximumSdk,
            ("minimumSdk" Core..=) Core.<$> minimumSdk,
            ("nativeCodes" Core..=) Core.<$> nativeCodes,
            ("packageName" Core..=) Core.<$> packageName,
            ("usesFeatures" Core..=) Core.<$> usesFeatures,
            ("usesPermissions" Core..=) Core.<$> usesPermissions,
            ("versionCode" Core..=) Core.<$> versionCode,
            ("versionName" Core..=) Core.<$> versionName
          ]
      )

-- | A full refund of the remaining amount of a transaction.
--
-- /See:/ 'newFullRefund' smart constructor.
data FullRefund = FullRefund
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FullRefund' with the minimum fields required to make a request.
newFullRefund ::
  FullRefund
newFullRefund = FullRefund

instance Core.FromJSON FullRefund where
  parseJSON =
    Core.withObject "FullRefund" (\o -> Core.pure FullRefund)

instance Core.ToJSON FullRefund where
  toJSON = Core.const Core.emptyObject

-- | Response to list generated APKs.
--
-- /See:/ 'newGeneratedApksListResponse' smart constructor.
newtype GeneratedApksListResponse = GeneratedApksListResponse
  { -- | All generated APKs, grouped by the APK signing key.
    generatedApks :: (Core.Maybe [GeneratedApksPerSigningKey])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedApksListResponse' with the minimum fields required to make a request.
newGeneratedApksListResponse ::
  GeneratedApksListResponse
newGeneratedApksListResponse =
  GeneratedApksListResponse {generatedApks = Core.Nothing}

instance Core.FromJSON GeneratedApksListResponse where
  parseJSON =
    Core.withObject
      "GeneratedApksListResponse"
      ( \o ->
          GeneratedApksListResponse Core.<$> (o Core..:? "generatedApks")
      )

instance Core.ToJSON GeneratedApksListResponse where
  toJSON GeneratedApksListResponse {..} =
    Core.object
      (Core.catMaybes [("generatedApks" Core..=) Core.<$> generatedApks])

-- | Download metadata for split, standalone and universal APKs, as well as asset pack slices, signed with a given key.
--
-- /See:/ 'newGeneratedApksPerSigningKey' smart constructor.
data GeneratedApksPerSigningKey = GeneratedApksPerSigningKey
  { -- | SHA256 hash of the APK signing public key certificate.
    certificateSha256Hash :: (Core.Maybe Core.Text),
    -- | List of asset pack slices which will be served for this app bundle, signed with a key corresponding to certificate/sha256/hash.
    generatedAssetPackSlices :: (Core.Maybe [GeneratedAssetPackSlice]),
    -- | Generated recovery apks for recovery actions signed with a key corresponding to certificate/sha256/hash. This includes all generated recovery APKs, also those in draft or cancelled state. This field is not set if no recovery actions were created for this signing key.
    generatedRecoveryModules :: (Core.Maybe [GeneratedRecoveryApk]),
    -- | List of generated split APKs, signed with a key corresponding to certificate/sha256/hash.
    generatedSplitApks :: (Core.Maybe [GeneratedSplitApk]),
    -- | List of generated standalone APKs, signed with a key corresponding to certificate/sha256/hash.
    generatedStandaloneApks :: (Core.Maybe [GeneratedStandaloneApk]),
    -- | Generated universal APK, signed with a key corresponding to certificate/sha256/hash. This field is not set if no universal APK was generated for this signing key.
    generatedUniversalApk :: (Core.Maybe GeneratedUniversalApk),
    -- | Contains targeting information about the generated apks.
    targetingInfo :: (Core.Maybe TargetingInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedApksPerSigningKey' with the minimum fields required to make a request.
newGeneratedApksPerSigningKey ::
  GeneratedApksPerSigningKey
newGeneratedApksPerSigningKey =
  GeneratedApksPerSigningKey
    { certificateSha256Hash = Core.Nothing,
      generatedAssetPackSlices = Core.Nothing,
      generatedRecoveryModules = Core.Nothing,
      generatedSplitApks = Core.Nothing,
      generatedStandaloneApks = Core.Nothing,
      generatedUniversalApk = Core.Nothing,
      targetingInfo = Core.Nothing
    }

instance Core.FromJSON GeneratedApksPerSigningKey where
  parseJSON =
    Core.withObject
      "GeneratedApksPerSigningKey"
      ( \o ->
          GeneratedApksPerSigningKey
            Core.<$> (o Core..:? "certificateSha256Hash")
            Core.<*> (o Core..:? "generatedAssetPackSlices")
            Core.<*> (o Core..:? "generatedRecoveryModules")
            Core.<*> (o Core..:? "generatedSplitApks")
            Core.<*> (o Core..:? "generatedStandaloneApks")
            Core.<*> (o Core..:? "generatedUniversalApk")
            Core.<*> (o Core..:? "targetingInfo")
      )

instance Core.ToJSON GeneratedApksPerSigningKey where
  toJSON GeneratedApksPerSigningKey {..} =
    Core.object
      ( Core.catMaybes
          [ ("certificateSha256Hash" Core..=) Core.<$> certificateSha256Hash,
            ("generatedAssetPackSlices" Core..=)
              Core.<$> generatedAssetPackSlices,
            ("generatedRecoveryModules" Core..=)
              Core.<$> generatedRecoveryModules,
            ("generatedSplitApks" Core..=) Core.<$> generatedSplitApks,
            ("generatedStandaloneApks" Core..=)
              Core.<$> generatedStandaloneApks,
            ("generatedUniversalApk" Core..=) Core.<$> generatedUniversalApk,
            ("targetingInfo" Core..=) Core.<$> targetingInfo
          ]
      )

-- | Download metadata for an asset pack slice.
--
-- /See:/ 'newGeneratedAssetPackSlice' smart constructor.
data GeneratedAssetPackSlice = GeneratedAssetPackSlice
  { -- | Download ID, which uniquely identifies the APK to download. Should be supplied to @generatedapks.download@ method.
    downloadId :: (Core.Maybe Core.Text),
    -- | Name of the module that this asset slice belongs to.
    moduleName :: (Core.Maybe Core.Text),
    -- | Asset slice ID.
    sliceId :: (Core.Maybe Core.Text),
    -- | Asset module version.
    version :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedAssetPackSlice' with the minimum fields required to make a request.
newGeneratedAssetPackSlice ::
  GeneratedAssetPackSlice
newGeneratedAssetPackSlice =
  GeneratedAssetPackSlice
    { downloadId = Core.Nothing,
      moduleName = Core.Nothing,
      sliceId = Core.Nothing,
      version = Core.Nothing
    }

instance Core.FromJSON GeneratedAssetPackSlice where
  parseJSON =
    Core.withObject
      "GeneratedAssetPackSlice"
      ( \o ->
          GeneratedAssetPackSlice
            Core.<$> (o Core..:? "downloadId")
            Core.<*> (o Core..:? "moduleName")
            Core.<*> (o Core..:? "sliceId")
            Core.<*> (o Core..:? "version" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON GeneratedAssetPackSlice where
  toJSON GeneratedAssetPackSlice {..} =
    Core.object
      ( Core.catMaybes
          [ ("downloadId" Core..=) Core.<$> downloadId,
            ("moduleName" Core..=) Core.<$> moduleName,
            ("sliceId" Core..=) Core.<$> sliceId,
            ("version" Core..=) Core.. Core.AsText Core.<$> version
          ]
      )

-- | Download metadata for an app recovery module.
--
-- /See:/ 'newGeneratedRecoveryApk' smart constructor.
data GeneratedRecoveryApk = GeneratedRecoveryApk
  { -- | Download ID, which uniquely identifies the APK to download. Should be supplied to @generatedapks.download@ method.
    downloadId :: (Core.Maybe Core.Text),
    -- | Name of the module which recovery apk belongs to.
    moduleName :: (Core.Maybe Core.Text),
    -- | ID of the recovery action.
    recoveryId :: (Core.Maybe Core.Int64),
    -- | The status of the recovery action corresponding to the recovery apk.
    recoveryStatus :: (Core.Maybe GeneratedRecoveryApk_RecoveryStatus)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedRecoveryApk' with the minimum fields required to make a request.
newGeneratedRecoveryApk ::
  GeneratedRecoveryApk
newGeneratedRecoveryApk =
  GeneratedRecoveryApk
    { downloadId = Core.Nothing,
      moduleName = Core.Nothing,
      recoveryId = Core.Nothing,
      recoveryStatus = Core.Nothing
    }

instance Core.FromJSON GeneratedRecoveryApk where
  parseJSON =
    Core.withObject
      "GeneratedRecoveryApk"
      ( \o ->
          GeneratedRecoveryApk
            Core.<$> (o Core..:? "downloadId")
            Core.<*> (o Core..:? "moduleName")
            Core.<*> (o Core..:? "recoveryId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "recoveryStatus")
      )

instance Core.ToJSON GeneratedRecoveryApk where
  toJSON GeneratedRecoveryApk {..} =
    Core.object
      ( Core.catMaybes
          [ ("downloadId" Core..=) Core.<$> downloadId,
            ("moduleName" Core..=) Core.<$> moduleName,
            ("recoveryId" Core..=) Core.. Core.AsText Core.<$> recoveryId,
            ("recoveryStatus" Core..=) Core.<$> recoveryStatus
          ]
      )

-- | Download metadata for a split APK.
--
-- /See:/ 'newGeneratedSplitApk' smart constructor.
data GeneratedSplitApk = GeneratedSplitApk
  { -- | Download ID, which uniquely identifies the APK to download. Should be supplied to @generatedapks.download@ method.
    downloadId :: (Core.Maybe Core.Text),
    -- | Name of the module that this APK belongs to.
    moduleName :: (Core.Maybe Core.Text),
    -- | Split ID. Empty for the main split of the base module.
    splitId :: (Core.Maybe Core.Text),
    -- | ID of the generated variant.
    variantId :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedSplitApk' with the minimum fields required to make a request.
newGeneratedSplitApk ::
  GeneratedSplitApk
newGeneratedSplitApk =
  GeneratedSplitApk
    { downloadId = Core.Nothing,
      moduleName = Core.Nothing,
      splitId = Core.Nothing,
      variantId = Core.Nothing
    }

instance Core.FromJSON GeneratedSplitApk where
  parseJSON =
    Core.withObject
      "GeneratedSplitApk"
      ( \o ->
          GeneratedSplitApk
            Core.<$> (o Core..:? "downloadId")
            Core.<*> (o Core..:? "moduleName")
            Core.<*> (o Core..:? "splitId")
            Core.<*> (o Core..:? "variantId")
      )

instance Core.ToJSON GeneratedSplitApk where
  toJSON GeneratedSplitApk {..} =
    Core.object
      ( Core.catMaybes
          [ ("downloadId" Core..=) Core.<$> downloadId,
            ("moduleName" Core..=) Core.<$> moduleName,
            ("splitId" Core..=) Core.<$> splitId,
            ("variantId" Core..=) Core.<$> variantId
          ]
      )

-- | Download metadata for a standalone APK.
--
-- /See:/ 'newGeneratedStandaloneApk' smart constructor.
data GeneratedStandaloneApk = GeneratedStandaloneApk
  { -- | Download ID, which uniquely identifies the APK to download. Should be supplied to @generatedapks.download@ method.
    downloadId :: (Core.Maybe Core.Text),
    -- | ID of the generated variant.
    variantId :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedStandaloneApk' with the minimum fields required to make a request.
newGeneratedStandaloneApk ::
  GeneratedStandaloneApk
newGeneratedStandaloneApk =
  GeneratedStandaloneApk
    { downloadId = Core.Nothing,
      variantId = Core.Nothing
    }

instance Core.FromJSON GeneratedStandaloneApk where
  parseJSON =
    Core.withObject
      "GeneratedStandaloneApk"
      ( \o ->
          GeneratedStandaloneApk
            Core.<$> (o Core..:? "downloadId")
            Core.<*> (o Core..:? "variantId")
      )

instance Core.ToJSON GeneratedStandaloneApk where
  toJSON GeneratedStandaloneApk {..} =
    Core.object
      ( Core.catMaybes
          [ ("downloadId" Core..=) Core.<$> downloadId,
            ("variantId" Core..=) Core.<$> variantId
          ]
      )

-- | Download metadata for a universal APK.
--
-- /See:/ 'newGeneratedUniversalApk' smart constructor.
newtype GeneratedUniversalApk = GeneratedUniversalApk
  { -- | Download ID, which uniquely identifies the APK to download. Should be supplied to @generatedapks.download@ method.
    downloadId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeneratedUniversalApk' with the minimum fields required to make a request.
newGeneratedUniversalApk ::
  GeneratedUniversalApk
newGeneratedUniversalApk =
  GeneratedUniversalApk {downloadId = Core.Nothing}

instance Core.FromJSON GeneratedUniversalApk where
  parseJSON =
    Core.withObject
      "GeneratedUniversalApk"
      (\o -> GeneratedUniversalApk Core.<$> (o Core..:? "downloadId"))

instance Core.ToJSON GeneratedUniversalApk where
  toJSON GeneratedUniversalApk {..} =
    Core.object
      (Core.catMaybes [("downloadId" Core..=) Core.<$> downloadId])

-- | Request message for GetSubscriptionOffer.
--
-- /See:/ 'newGetSubscriptionOfferRequest' smart constructor.
data GetSubscriptionOfferRequest = GetSubscriptionOfferRequest
  { -- | Required. The parent base plan (ID) of the offer to get.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Required. The unique offer ID of the offer to get.
    offerId :: (Core.Maybe Core.Text),
    -- | Required. The parent app (package name) of the offer to get.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The parent subscription (ID) of the offer to get.
    productId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GetSubscriptionOfferRequest' with the minimum fields required to make a request.
newGetSubscriptionOfferRequest ::
  GetSubscriptionOfferRequest
newGetSubscriptionOfferRequest =
  GetSubscriptionOfferRequest
    { basePlanId = Core.Nothing,
      offerId = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing
    }

instance Core.FromJSON GetSubscriptionOfferRequest where
  parseJSON =
    Core.withObject
      "GetSubscriptionOfferRequest"
      ( \o ->
          GetSubscriptionOfferRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "offerId")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
      )

instance Core.ToJSON GetSubscriptionOfferRequest where
  toJSON GetSubscriptionOfferRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("offerId" Core..=) Core.<$> offerId,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId
          ]
      )

-- | An access grant resource.
--
-- /See:/ 'newGrant' smart constructor.
data Grant = Grant
  { -- | The permissions granted to the user for this app.
    appLevelPermissions :: (Core.Maybe [Grant_AppLevelPermissionsItem]),
    -- | Required. Resource name for this grant, following the pattern \"developers\/{developer}\/users\/{email}\/grants\/{package_name}\". If this grant is for a draft app, the app ID will be used in this resource name instead of the package name.
    name :: (Core.Maybe Core.Text),
    -- | Immutable. The package name of the app. This will be empty for draft apps.
    packageName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Grant' with the minimum fields required to make a request.
newGrant ::
  Grant
newGrant =
  Grant
    { appLevelPermissions = Core.Nothing,
      name = Core.Nothing,
      packageName = Core.Nothing
    }

instance Core.FromJSON Grant where
  parseJSON =
    Core.withObject
      "Grant"
      ( \o ->
          Grant
            Core.<$> (o Core..:? "appLevelPermissions")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "packageName")
      )

instance Core.ToJSON Grant where
  toJSON Grant {..} =
    Core.object
      ( Core.catMaybes
          [ ("appLevelPermissions" Core..=) Core.<$> appLevelPermissions,
            ("name" Core..=) Core.<$> name,
            ("packageName" Core..=) Core.<$> packageName
          ]
      )

-- | An uploaded image. The resource for ImagesService.
--
-- /See:/ 'newImage' smart constructor.
data Image = Image
  { -- | A unique id representing this image.
    id :: (Core.Maybe Core.Text),
    -- | A sha1 hash of the image.
    sha1 :: (Core.Maybe Core.Text),
    -- | A sha256 hash of the image.
    sha256 :: (Core.Maybe Core.Text),
    -- | A URL that will serve a preview of the image.
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Image' with the minimum fields required to make a request.
newImage ::
  Image
newImage =
  Image
    { id = Core.Nothing,
      sha1 = Core.Nothing,
      sha256 = Core.Nothing,
      url = Core.Nothing
    }

instance Core.FromJSON Image where
  parseJSON =
    Core.withObject
      "Image"
      ( \o ->
          Image
            Core.<$> (o Core..:? "id")
            Core.<*> (o Core..:? "sha1")
            Core.<*> (o Core..:? "sha256")
            Core.<*> (o Core..:? "url")
      )

instance Core.ToJSON Image where
  toJSON Image {..} =
    Core.object
      ( Core.catMaybes
          [ ("id" Core..=) Core.<$> id,
            ("sha1" Core..=) Core.<$> sha1,
            ("sha256" Core..=) Core.<$> sha256,
            ("url" Core..=) Core.<$> url
          ]
      )

-- | Response for deleting all images.
--
-- /See:/ 'newImagesDeleteAllResponse' smart constructor.
newtype ImagesDeleteAllResponse = ImagesDeleteAllResponse
  { -- | The deleted images.
    deleted :: (Core.Maybe [Image])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ImagesDeleteAllResponse' with the minimum fields required to make a request.
newImagesDeleteAllResponse ::
  ImagesDeleteAllResponse
newImagesDeleteAllResponse =
  ImagesDeleteAllResponse {deleted = Core.Nothing}

instance Core.FromJSON ImagesDeleteAllResponse where
  parseJSON =
    Core.withObject
      "ImagesDeleteAllResponse"
      (\o -> ImagesDeleteAllResponse Core.<$> (o Core..:? "deleted"))

instance Core.ToJSON ImagesDeleteAllResponse where
  toJSON ImagesDeleteAllResponse {..} =
    Core.object
      (Core.catMaybes [("deleted" Core..=) Core.<$> deleted])

-- | Response listing all images.
--
-- /See:/ 'newImagesListResponse' smart constructor.
newtype ImagesListResponse = ImagesListResponse
  { -- | All listed Images.
    images :: (Core.Maybe [Image])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ImagesListResponse' with the minimum fields required to make a request.
newImagesListResponse ::
  ImagesListResponse
newImagesListResponse = ImagesListResponse {images = Core.Nothing}

instance Core.FromJSON ImagesListResponse where
  parseJSON =
    Core.withObject
      "ImagesListResponse"
      (\o -> ImagesListResponse Core.<$> (o Core..:? "images"))

instance Core.ToJSON ImagesListResponse where
  toJSON ImagesListResponse {..} =
    Core.object (Core.catMaybes [("images" Core..=) Core.<$> images])

-- | Response for uploading an image.
--
-- /See:/ 'newImagesUploadResponse' smart constructor.
newtype ImagesUploadResponse = ImagesUploadResponse
  { -- | The uploaded image.
    image :: (Core.Maybe Image)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ImagesUploadResponse' with the minimum fields required to make a request.
newImagesUploadResponse ::
  ImagesUploadResponse
newImagesUploadResponse =
  ImagesUploadResponse {image = Core.Nothing}

instance Core.FromJSON ImagesUploadResponse where
  parseJSON =
    Core.withObject
      "ImagesUploadResponse"
      (\o -> ImagesUploadResponse Core.<$> (o Core..:? "image"))

instance Core.ToJSON ImagesUploadResponse where
  toJSON ImagesUploadResponse {..} =
    Core.object (Core.catMaybes [("image" Core..=) Core.<$> image])

-- | An in-app product. The resource for InappproductsService.
--
-- /See:/ 'newInAppProduct' smart constructor.
data InAppProduct = InAppProduct
  { -- | Default language of the localized data, as defined by BCP-47. e.g. \"en-US\".
    defaultLanguage :: (Core.Maybe Core.Text),
    -- | Default price. Cannot be zero, as in-app products are never free. Always in the developer\'s Checkout merchant currency.
    defaultPrice :: (Core.Maybe Price),
    -- | Grace period of the subscription, specified in ISO 8601 format. Allows developers to give their subscribers a grace period when the payment for the new recurrence period is declined. Acceptable values are P0D (zero days), P3D (three days), P7D (seven days), P14D (14 days), and P30D (30 days).
    gracePeriod :: (Core.Maybe Core.Text),
    -- | List of localized title and description data. Map key is the language of the localized data, as defined by BCP-47, e.g. \"en-US\".
    listings :: (Core.Maybe InAppProduct_Listings),
    -- | Details about taxes and legal compliance. Only applicable to managed products.
    managedProductTaxesAndComplianceSettings :: (Core.Maybe ManagedProductTaxAndComplianceSettings),
    -- | Package name of the parent app.
    packageName :: (Core.Maybe Core.Text),
    -- | Prices per buyer region. None of these can be zero, as in-app products are never free. Map key is region code, as defined by ISO 3166-2.
    prices :: (Core.Maybe InAppProduct_Prices),
    -- | The type of the product, e.g. a recurring subscription.
    purchaseType :: (Core.Maybe InAppProduct_PurchaseType),
    -- | Stock-keeping-unit (SKU) of the product, unique within an app.
    sku :: (Core.Maybe Core.Text),
    -- | The status of the product, e.g. whether it\'s active.
    status :: (Core.Maybe InAppProduct_Status),
    -- | Subscription period, specified in ISO 8601 format. Acceptable values are P1W (one week), P1M (one month), P3M (three months), P6M (six months), and P1Y (one year).
    subscriptionPeriod :: (Core.Maybe Core.Text),
    -- | Details about taxes and legal compliance. Only applicable to subscription products.
    subscriptionTaxesAndComplianceSettings :: (Core.Maybe SubscriptionTaxAndComplianceSettings),
    -- | Trial period, specified in ISO 8601 format. Acceptable values are anything between P7D (seven days) and P999D (999 days).
    trialPeriod :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InAppProduct' with the minimum fields required to make a request.
newInAppProduct ::
  InAppProduct
newInAppProduct =
  InAppProduct
    { defaultLanguage = Core.Nothing,
      defaultPrice = Core.Nothing,
      gracePeriod = Core.Nothing,
      listings = Core.Nothing,
      managedProductTaxesAndComplianceSettings = Core.Nothing,
      packageName = Core.Nothing,
      prices = Core.Nothing,
      purchaseType = Core.Nothing,
      sku = Core.Nothing,
      status = Core.Nothing,
      subscriptionPeriod = Core.Nothing,
      subscriptionTaxesAndComplianceSettings = Core.Nothing,
      trialPeriod = Core.Nothing
    }

instance Core.FromJSON InAppProduct where
  parseJSON =
    Core.withObject
      "InAppProduct"
      ( \o ->
          InAppProduct
            Core.<$> (o Core..:? "defaultLanguage")
            Core.<*> (o Core..:? "defaultPrice")
            Core.<*> (o Core..:? "gracePeriod")
            Core.<*> (o Core..:? "listings")
            Core.<*> (o Core..:? "managedProductTaxesAndComplianceSettings")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "prices")
            Core.<*> (o Core..:? "purchaseType")
            Core.<*> (o Core..:? "sku")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "subscriptionPeriod")
            Core.<*> (o Core..:? "subscriptionTaxesAndComplianceSettings")
            Core.<*> (o Core..:? "trialPeriod")
      )

instance Core.ToJSON InAppProduct where
  toJSON InAppProduct {..} =
    Core.object
      ( Core.catMaybes
          [ ("defaultLanguage" Core..=) Core.<$> defaultLanguage,
            ("defaultPrice" Core..=) Core.<$> defaultPrice,
            ("gracePeriod" Core..=) Core.<$> gracePeriod,
            ("listings" Core..=) Core.<$> listings,
            ("managedProductTaxesAndComplianceSettings" Core..=)
              Core.<$> managedProductTaxesAndComplianceSettings,
            ("packageName" Core..=) Core.<$> packageName,
            ("prices" Core..=) Core.<$> prices,
            ("purchaseType" Core..=) Core.<$> purchaseType,
            ("sku" Core..=) Core.<$> sku,
            ("status" Core..=) Core.<$> status,
            ("subscriptionPeriod" Core..=) Core.<$> subscriptionPeriod,
            ("subscriptionTaxesAndComplianceSettings" Core..=)
              Core.<$> subscriptionTaxesAndComplianceSettings,
            ("trialPeriod" Core..=) Core.<$> trialPeriod
          ]
      )

-- | List of localized title and description data. Map key is the language of the localized data, as defined by BCP-47, e.g. \"en-US\".
--
-- /See:/ 'newInAppProduct_Listings' smart constructor.
newtype InAppProduct_Listings = InAppProduct_Listings
  { additional :: (Core.HashMap Core.Text InAppProductListing)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InAppProduct_Listings' with the minimum fields required to make a request.
newInAppProduct_Listings ::
  -- |  See 'additional'.
  Core.HashMap Core.Text InAppProductListing ->
  InAppProduct_Listings
newInAppProduct_Listings additional =
  InAppProduct_Listings {additional = additional}

instance Core.FromJSON InAppProduct_Listings where
  parseJSON =
    Core.withObject
      "InAppProduct_Listings"
      (\o -> InAppProduct_Listings Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON InAppProduct_Listings where
  toJSON InAppProduct_Listings {..} = Core.toJSON additional

-- | Prices per buyer region. None of these can be zero, as in-app products are never free. Map key is region code, as defined by ISO 3166-2.
--
-- /See:/ 'newInAppProduct_Prices' smart constructor.
newtype InAppProduct_Prices = InAppProduct_Prices
  { additional :: (Core.HashMap Core.Text Price)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InAppProduct_Prices' with the minimum fields required to make a request.
newInAppProduct_Prices ::
  -- |  See 'additional'.
  Core.HashMap Core.Text Price ->
  InAppProduct_Prices
newInAppProduct_Prices additional =
  InAppProduct_Prices {additional = additional}

instance Core.FromJSON InAppProduct_Prices where
  parseJSON =
    Core.withObject
      "InAppProduct_Prices"
      (\o -> InAppProduct_Prices Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON InAppProduct_Prices where
  toJSON InAppProduct_Prices {..} = Core.toJSON additional

-- | Store listing of a single in-app product.
--
-- /See:/ 'newInAppProductListing' smart constructor.
data InAppProductListing = InAppProductListing
  { -- | Localized entitlement benefits for a subscription.
    benefits :: (Core.Maybe [Core.Text]),
    -- | Description for the store listing.
    description :: (Core.Maybe Core.Text),
    -- | Title for the store listing.
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InAppProductListing' with the minimum fields required to make a request.
newInAppProductListing ::
  InAppProductListing
newInAppProductListing =
  InAppProductListing
    { benefits = Core.Nothing,
      description = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON InAppProductListing where
  parseJSON =
    Core.withObject
      "InAppProductListing"
      ( \o ->
          InAppProductListing
            Core.<$> (o Core..:? "benefits")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON InAppProductListing where
  toJSON InAppProductListing {..} =
    Core.object
      ( Core.catMaybes
          [ ("benefits" Core..=) Core.<$> benefits,
            ("description" Core..=) Core.<$> description,
            ("title" Core..=) Core.<$> title
          ]
      )

-- | Request to delete multiple in-app products.
--
-- /See:/ 'newInappproductsBatchDeleteRequest' smart constructor.
newtype InappproductsBatchDeleteRequest = InappproductsBatchDeleteRequest
  { -- | Individual delete requests. At least one request is required. Can contain up to 100 requests. All requests must correspond to different in-app products.
    requests :: (Core.Maybe [InappproductsDeleteRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsBatchDeleteRequest' with the minimum fields required to make a request.
newInappproductsBatchDeleteRequest ::
  InappproductsBatchDeleteRequest
newInappproductsBatchDeleteRequest =
  InappproductsBatchDeleteRequest {requests = Core.Nothing}

instance Core.FromJSON InappproductsBatchDeleteRequest where
  parseJSON =
    Core.withObject
      "InappproductsBatchDeleteRequest"
      ( \o ->
          InappproductsBatchDeleteRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON InappproductsBatchDeleteRequest where
  toJSON InappproductsBatchDeleteRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response message for BatchGetSubscriptions endpoint.
--
-- /See:/ 'newInappproductsBatchGetResponse' smart constructor.
newtype InappproductsBatchGetResponse = InappproductsBatchGetResponse
  { -- | The list of requested in-app products, in the same order as the request.
    inappproduct :: (Core.Maybe [InAppProduct])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsBatchGetResponse' with the minimum fields required to make a request.
newInappproductsBatchGetResponse ::
  InappproductsBatchGetResponse
newInappproductsBatchGetResponse =
  InappproductsBatchGetResponse {inappproduct = Core.Nothing}

instance Core.FromJSON InappproductsBatchGetResponse where
  parseJSON =
    Core.withObject
      "InappproductsBatchGetResponse"
      ( \o ->
          InappproductsBatchGetResponse Core.<$> (o Core..:? "inappproduct")
      )

instance Core.ToJSON InappproductsBatchGetResponse where
  toJSON InappproductsBatchGetResponse {..} =
    Core.object
      (Core.catMaybes [("inappproduct" Core..=) Core.<$> inappproduct])

-- | Request to update or insert one or more in-app products.
--
-- /See:/ 'newInappproductsBatchUpdateRequest' smart constructor.
newtype InappproductsBatchUpdateRequest = InappproductsBatchUpdateRequest
  { -- | Required. Individual update requests. At least one request is required. Can contain up to 100 requests. All requests must correspond to different in-app products.
    requests :: (Core.Maybe [InappproductsUpdateRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsBatchUpdateRequest' with the minimum fields required to make a request.
newInappproductsBatchUpdateRequest ::
  InappproductsBatchUpdateRequest
newInappproductsBatchUpdateRequest =
  InappproductsBatchUpdateRequest {requests = Core.Nothing}

instance Core.FromJSON InappproductsBatchUpdateRequest where
  parseJSON =
    Core.withObject
      "InappproductsBatchUpdateRequest"
      ( \o ->
          InappproductsBatchUpdateRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON InappproductsBatchUpdateRequest where
  toJSON InappproductsBatchUpdateRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response for a batch in-app product update.
--
-- /See:/ 'newInappproductsBatchUpdateResponse' smart constructor.
newtype InappproductsBatchUpdateResponse = InappproductsBatchUpdateResponse
  { -- | The updated or inserted in-app products.
    inappproducts :: (Core.Maybe [InAppProduct])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsBatchUpdateResponse' with the minimum fields required to make a request.
newInappproductsBatchUpdateResponse ::
  InappproductsBatchUpdateResponse
newInappproductsBatchUpdateResponse =
  InappproductsBatchUpdateResponse {inappproducts = Core.Nothing}

instance Core.FromJSON InappproductsBatchUpdateResponse where
  parseJSON =
    Core.withObject
      "InappproductsBatchUpdateResponse"
      ( \o ->
          InappproductsBatchUpdateResponse
            Core.<$> (o Core..:? "inappproducts")
      )

instance Core.ToJSON InappproductsBatchUpdateResponse where
  toJSON InappproductsBatchUpdateResponse {..} =
    Core.object
      (Core.catMaybes [("inappproducts" Core..=) Core.<$> inappproducts])

-- | Request to delete an in-app product.
--
-- /See:/ 'newInappproductsDeleteRequest' smart constructor.
data InappproductsDeleteRequest = InappproductsDeleteRequest
  { -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe InappproductsDeleteRequest_LatencyTolerance),
    -- | Package name of the app.
    packageName :: (Core.Maybe Core.Text),
    -- | Unique identifier for the in-app product.
    sku :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsDeleteRequest' with the minimum fields required to make a request.
newInappproductsDeleteRequest ::
  InappproductsDeleteRequest
newInappproductsDeleteRequest =
  InappproductsDeleteRequest
    { latencyTolerance = Core.Nothing,
      packageName = Core.Nothing,
      sku = Core.Nothing
    }

instance Core.FromJSON InappproductsDeleteRequest where
  parseJSON =
    Core.withObject
      "InappproductsDeleteRequest"
      ( \o ->
          InappproductsDeleteRequest
            Core.<$> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "sku")
      )

instance Core.ToJSON InappproductsDeleteRequest where
  toJSON InappproductsDeleteRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("packageName" Core..=) Core.<$> packageName,
            ("sku" Core..=) Core.<$> sku
          ]
      )

-- | Response listing all in-app products.
--
-- /See:/ 'newInappproductsListResponse' smart constructor.
data InappproductsListResponse = InappproductsListResponse
  { -- | All in-app products.
    inappproduct :: (Core.Maybe [InAppProduct]),
    -- | The kind of this response (\"androidpublisher#inappproductsListResponse\").
    kind :: (Core.Maybe Core.Text),
    -- | Deprecated and unset.
    pageInfo :: (Core.Maybe PageInfo),
    -- | Pagination token, to handle a number of products that is over one page.
    tokenPagination :: (Core.Maybe TokenPagination)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsListResponse' with the minimum fields required to make a request.
newInappproductsListResponse ::
  InappproductsListResponse
newInappproductsListResponse =
  InappproductsListResponse
    { inappproduct = Core.Nothing,
      kind = Core.Nothing,
      pageInfo = Core.Nothing,
      tokenPagination = Core.Nothing
    }

instance Core.FromJSON InappproductsListResponse where
  parseJSON =
    Core.withObject
      "InappproductsListResponse"
      ( \o ->
          InappproductsListResponse
            Core.<$> (o Core..:? "inappproduct")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "pageInfo")
            Core.<*> (o Core..:? "tokenPagination")
      )

instance Core.ToJSON InappproductsListResponse where
  toJSON InappproductsListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("inappproduct" Core..=) Core.<$> inappproduct,
            ("kind" Core..=) Core.<$> kind,
            ("pageInfo" Core..=) Core.<$> pageInfo,
            ("tokenPagination" Core..=) Core.<$> tokenPagination
          ]
      )

-- | Request to update an in-app product.
--
-- /See:/ 'newInappproductsUpdateRequest' smart constructor.
data InappproductsUpdateRequest = InappproductsUpdateRequest
  { -- | If set to true, and the in-app product with the given package_name and sku doesn\'t exist, the in-app product will be created.
    allowMissing :: (Core.Maybe Core.Bool),
    -- | If true the prices for all regions targeted by the parent app that don\'t have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.
    autoConvertMissingPrices :: (Core.Maybe Core.Bool),
    -- | The new in-app product.
    inappproduct :: (Core.Maybe InAppProduct),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe InappproductsUpdateRequest_LatencyTolerance),
    -- | Package name of the app.
    packageName :: (Core.Maybe Core.Text),
    -- | Unique identifier for the in-app product.
    sku :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InappproductsUpdateRequest' with the minimum fields required to make a request.
newInappproductsUpdateRequest ::
  InappproductsUpdateRequest
newInappproductsUpdateRequest =
  InappproductsUpdateRequest
    { allowMissing = Core.Nothing,
      autoConvertMissingPrices = Core.Nothing,
      inappproduct = Core.Nothing,
      latencyTolerance = Core.Nothing,
      packageName = Core.Nothing,
      sku = Core.Nothing
    }

instance Core.FromJSON InappproductsUpdateRequest where
  parseJSON =
    Core.withObject
      "InappproductsUpdateRequest"
      ( \o ->
          InappproductsUpdateRequest
            Core.<$> (o Core..:? "allowMissing")
            Core.<*> (o Core..:? "autoConvertMissingPrices")
            Core.<*> (o Core..:? "inappproduct")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "sku")
      )

instance Core.ToJSON InappproductsUpdateRequest where
  toJSON InappproductsUpdateRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowMissing" Core..=) Core.<$> allowMissing,
            ("autoConvertMissingPrices" Core..=)
              Core.<$> autoConvertMissingPrices,
            ("inappproduct" Core..=) Core.<$> inappproduct,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("packageName" Core..=) Core.<$> packageName,
            ("sku" Core..=) Core.<$> sku
          ]
      )

-- | Information to a installment plan.
--
-- /See:/ 'newInstallmentPlan' smart constructor.
data InstallmentPlan = InstallmentPlan
  { -- | Total number of payments the user is initially committed for.
    initialCommittedPaymentsCount :: (Core.Maybe Core.Int32),
    -- | If present, this installment plan is pending to be canceled. The cancellation will happen only after the user finished all committed payments.
    pendingCancellation :: (Core.Maybe PendingCancellation),
    -- | Total number of committed payments remaining to be paid for in this renewal cycle.
    remainingCommittedPaymentsCount :: (Core.Maybe Core.Int32),
    -- | Total number of payments the user will be committed for after each commitment period. Empty means the installment plan will fall back to a normal auto-renew subscription after initial commitment.
    subsequentCommittedPaymentsCount :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InstallmentPlan' with the minimum fields required to make a request.
newInstallmentPlan ::
  InstallmentPlan
newInstallmentPlan =
  InstallmentPlan
    { initialCommittedPaymentsCount = Core.Nothing,
      pendingCancellation = Core.Nothing,
      remainingCommittedPaymentsCount = Core.Nothing,
      subsequentCommittedPaymentsCount = Core.Nothing
    }

instance Core.FromJSON InstallmentPlan where
  parseJSON =
    Core.withObject
      "InstallmentPlan"
      ( \o ->
          InstallmentPlan
            Core.<$> (o Core..:? "initialCommittedPaymentsCount")
            Core.<*> (o Core..:? "pendingCancellation")
            Core.<*> (o Core..:? "remainingCommittedPaymentsCount")
            Core.<*> (o Core..:? "subsequentCommittedPaymentsCount")
      )

instance Core.ToJSON InstallmentPlan where
  toJSON InstallmentPlan {..} =
    Core.object
      ( Core.catMaybes
          [ ("initialCommittedPaymentsCount" Core..=)
              Core.<$> initialCommittedPaymentsCount,
            ("pendingCancellation" Core..=) Core.<$> pendingCancellation,
            ("remainingCommittedPaymentsCount" Core..=)
              Core.<$> remainingCommittedPaymentsCount,
            ("subsequentCommittedPaymentsCount" Core..=)
              Core.<$> subsequentCommittedPaymentsCount
          ]
      )

-- | Represents an installments base plan where a user commits to a specified number of payments.
--
-- /See:/ 'newInstallmentsBasePlanType' smart constructor.
data InstallmentsBasePlanType = InstallmentsBasePlanType
  { -- | Optional. Account hold period of the subscription, specified in ISO 8601 format. Acceptable values must be in days and between P0D and P60D. If not specified, the default value is P30D. The sum of gracePeriodDuration and accountHoldDuration must be between P30D and P60D days, inclusive.
    accountHoldDuration :: (Core.Maybe Core.Text),
    -- | Required. Immutable. Subscription period, specified in ISO 8601 format. For a list of acceptable billing periods, refer to the help center. The duration is immutable after the base plan is created.
    billingPeriodDuration :: (Core.Maybe Core.Text),
    -- | Required. Immutable. The number of payments the user is committed to. It is immutable after the base plan is created.
    committedPaymentsCount :: (Core.Maybe Core.Int32),
    -- | Grace period of the subscription, specified in ISO 8601 format. Acceptable values must be in days and between P0D and the lesser of 30D and base plan billing period. If not specified, a default value will be used based on the billing period. The sum of gracePeriodDuration and accountHoldDuration must be between P30D and P60D days, inclusive.
    gracePeriodDuration :: (Core.Maybe Core.Text),
    -- | The proration mode for the base plan determines what happens when a user switches to this plan from another base plan. If unspecified, defaults to CHARGE/ON/NEXT/BILLING/DATE.
    prorationMode :: (Core.Maybe InstallmentsBasePlanType_ProrationMode),
    -- | Required. Immutable. Installments base plan renewal type. Determines the behavior at the end of the initial commitment. The renewal type is immutable after the base plan is created.
    renewalType :: (Core.Maybe InstallmentsBasePlanType_RenewalType),
    -- | Whether users should be able to resubscribe to this base plan in Google Play surfaces. Defaults to RESUBSCRIBE/STATE/ACTIVE if not specified.
    resubscribeState :: (Core.Maybe InstallmentsBasePlanType_ResubscribeState)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InstallmentsBasePlanType' with the minimum fields required to make a request.
newInstallmentsBasePlanType ::
  InstallmentsBasePlanType
newInstallmentsBasePlanType =
  InstallmentsBasePlanType
    { accountHoldDuration = Core.Nothing,
      billingPeriodDuration = Core.Nothing,
      committedPaymentsCount = Core.Nothing,
      gracePeriodDuration = Core.Nothing,
      prorationMode = Core.Nothing,
      renewalType = Core.Nothing,
      resubscribeState = Core.Nothing
    }

instance Core.FromJSON InstallmentsBasePlanType where
  parseJSON =
    Core.withObject
      "InstallmentsBasePlanType"
      ( \o ->
          InstallmentsBasePlanType
            Core.<$> (o Core..:? "accountHoldDuration")
            Core.<*> (o Core..:? "billingPeriodDuration")
            Core.<*> (o Core..:? "committedPaymentsCount")
            Core.<*> (o Core..:? "gracePeriodDuration")
            Core.<*> (o Core..:? "prorationMode")
            Core.<*> (o Core..:? "renewalType")
            Core.<*> (o Core..:? "resubscribeState")
      )

instance Core.ToJSON InstallmentsBasePlanType where
  toJSON InstallmentsBasePlanType {..} =
    Core.object
      ( Core.catMaybes
          [ ("accountHoldDuration" Core..=) Core.<$> accountHoldDuration,
            ("billingPeriodDuration" Core..=) Core.<$> billingPeriodDuration,
            ("committedPaymentsCount" Core..=) Core.<$> committedPaymentsCount,
            ("gracePeriodDuration" Core..=) Core.<$> gracePeriodDuration,
            ("prorationMode" Core..=) Core.<$> prorationMode,
            ("renewalType" Core..=) Core.<$> renewalType,
            ("resubscribeState" Core..=) Core.<$> resubscribeState
          ]
      )

-- | An artifact resource which gets created when uploading an APK or Android App Bundle through internal app sharing.
--
-- /See:/ 'newInternalAppSharingArtifact' smart constructor.
data InternalAppSharingArtifact = InternalAppSharingArtifact
  { -- | The sha256 fingerprint of the certificate used to sign the generated artifact.
    certificateFingerprint :: (Core.Maybe Core.Text),
    -- | The download URL generated for the uploaded artifact. Users that are authorized to download can follow the link to the Play Store app to install it.
    downloadUrl :: (Core.Maybe Core.Text),
    -- | The sha256 hash of the artifact represented as a lowercase hexadecimal number, matching the output of the sha256sum command.
    sha256 :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'InternalAppSharingArtifact' with the minimum fields required to make a request.
newInternalAppSharingArtifact ::
  InternalAppSharingArtifact
newInternalAppSharingArtifact =
  InternalAppSharingArtifact
    { certificateFingerprint = Core.Nothing,
      downloadUrl = Core.Nothing,
      sha256 = Core.Nothing
    }

instance Core.FromJSON InternalAppSharingArtifact where
  parseJSON =
    Core.withObject
      "InternalAppSharingArtifact"
      ( \o ->
          InternalAppSharingArtifact
            Core.<$> (o Core..:? "certificateFingerprint")
            Core.<*> (o Core..:? "downloadUrl")
            Core.<*> (o Core..:? "sha256")
      )

instance Core.ToJSON InternalAppSharingArtifact where
  toJSON InternalAppSharingArtifact {..} =
    Core.object
      ( Core.catMaybes
          [ ("certificateFingerprint" Core..=)
              Core.<$> certificateFingerprint,
            ("downloadUrl" Core..=) Core.<$> downloadUrl,
            ("sha256" Core..=) Core.<$> sha256
          ]
      )

-- | Contains the introductory price information for a subscription.
--
-- /See:/ 'newIntroductoryPriceInfo' smart constructor.
data IntroductoryPriceInfo = IntroductoryPriceInfo
  { -- | Introductory price of the subscription, not including tax. The currency is the same as price/currency/code. Price is expressed in micro-units, where 1,000,000 micro-units represents one unit of the currency. For example, if the subscription price is €1.99, price/amount/micros is 1990000.
    introductoryPriceAmountMicros :: (Core.Maybe Core.Int64),
    -- | ISO 4217 currency code for the introductory subscription price. For example, if the price is specified in British pounds sterling, price/currency/code is \"GBP\".
    introductoryPriceCurrencyCode :: (Core.Maybe Core.Text),
    -- | The number of billing period to offer introductory pricing.
    introductoryPriceCycles :: (Core.Maybe Core.Int32),
    -- | Introductory price period, specified in ISO 8601 format. Common values are (but not limited to) \"P1W\" (one week), \"P1M\" (one month), \"P3M\" (three months), \"P6M\" (six months), and \"P1Y\" (one year).
    introductoryPricePeriod :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'IntroductoryPriceInfo' with the minimum fields required to make a request.
newIntroductoryPriceInfo ::
  IntroductoryPriceInfo
newIntroductoryPriceInfo =
  IntroductoryPriceInfo
    { introductoryPriceAmountMicros =
        Core.Nothing,
      introductoryPriceCurrencyCode = Core.Nothing,
      introductoryPriceCycles = Core.Nothing,
      introductoryPricePeriod = Core.Nothing
    }

instance Core.FromJSON IntroductoryPriceInfo where
  parseJSON =
    Core.withObject
      "IntroductoryPriceInfo"
      ( \o ->
          IntroductoryPriceInfo
            Core.<$> ( o
                         Core..:? "introductoryPriceAmountMicros"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "introductoryPriceCurrencyCode")
            Core.<*> (o Core..:? "introductoryPriceCycles")
            Core.<*> (o Core..:? "introductoryPricePeriod")
      )

instance Core.ToJSON IntroductoryPriceInfo where
  toJSON IntroductoryPriceInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("introductoryPriceAmountMicros" Core..=)
              Core.. Core.AsText
              Core.<$> introductoryPriceAmountMicros,
            ("introductoryPriceCurrencyCode" Core..=)
              Core.<$> introductoryPriceCurrencyCode,
            ("introductoryPriceCycles" Core..=)
              Core.<$> introductoryPriceCycles,
            ("introductoryPricePeriod" Core..=)
              Core.<$> introductoryPricePeriod
          ]
      )

-- | Targeting based on language.
--
-- /See:/ 'newLanguageTargeting' smart constructor.
data LanguageTargeting = LanguageTargeting
  { -- | Alternative languages.
    alternatives :: (Core.Maybe [Core.Text]),
    -- | ISO-639: 2 or 3 letter language code.
    value :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'LanguageTargeting' with the minimum fields required to make a request.
newLanguageTargeting ::
  LanguageTargeting
newLanguageTargeting =
  LanguageTargeting
    { alternatives = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON LanguageTargeting where
  parseJSON =
    Core.withObject
      "LanguageTargeting"
      ( \o ->
          LanguageTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON LanguageTargeting where
  toJSON LanguageTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | Response message for ListAppRecoveries. -- api-linter: core::0158::response-next-page-token-field=disabled
--
-- /See:/ 'newListAppRecoveriesResponse' smart constructor.
newtype ListAppRecoveriesResponse = ListAppRecoveriesResponse
  { -- | List of recovery actions associated with the requested package name.
    recoveryActions :: (Core.Maybe [AppRecoveryAction])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListAppRecoveriesResponse' with the minimum fields required to make a request.
newListAppRecoveriesResponse ::
  ListAppRecoveriesResponse
newListAppRecoveriesResponse =
  ListAppRecoveriesResponse {recoveryActions = Core.Nothing}

instance Core.FromJSON ListAppRecoveriesResponse where
  parseJSON =
    Core.withObject
      "ListAppRecoveriesResponse"
      ( \o ->
          ListAppRecoveriesResponse Core.<$> (o Core..:? "recoveryActions")
      )

instance Core.ToJSON ListAppRecoveriesResponse where
  toJSON ListAppRecoveriesResponse {..} =
    Core.object
      ( Core.catMaybes
          [("recoveryActions" Core..=) Core.<$> recoveryActions]
      )

-- | Response listing existing device tier configs.
--
-- /See:/ 'newListDeviceTierConfigsResponse' smart constructor.
data ListDeviceTierConfigsResponse = ListDeviceTierConfigsResponse
  { -- | Device tier configs created by the developer.
    deviceTierConfigs :: (Core.Maybe [DeviceTierConfig]),
    -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListDeviceTierConfigsResponse' with the minimum fields required to make a request.
newListDeviceTierConfigsResponse ::
  ListDeviceTierConfigsResponse
newListDeviceTierConfigsResponse =
  ListDeviceTierConfigsResponse
    { deviceTierConfigs = Core.Nothing,
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON ListDeviceTierConfigsResponse where
  parseJSON =
    Core.withObject
      "ListDeviceTierConfigsResponse"
      ( \o ->
          ListDeviceTierConfigsResponse
            Core.<$> (o Core..:? "deviceTierConfigs")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON ListDeviceTierConfigsResponse where
  toJSON ListDeviceTierConfigsResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceTierConfigs" Core..=) Core.<$> deviceTierConfigs,
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | Response message for ListSubscriptionOffers.
--
-- /See:/ 'newListSubscriptionOffersResponse' smart constructor.
data ListSubscriptionOffersResponse = ListSubscriptionOffersResponse
  { -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | The subscription offers from the specified subscription.
    subscriptionOffers :: (Core.Maybe [SubscriptionOffer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListSubscriptionOffersResponse' with the minimum fields required to make a request.
newListSubscriptionOffersResponse ::
  ListSubscriptionOffersResponse
newListSubscriptionOffersResponse =
  ListSubscriptionOffersResponse
    { nextPageToken = Core.Nothing,
      subscriptionOffers = Core.Nothing
    }

instance Core.FromJSON ListSubscriptionOffersResponse where
  parseJSON =
    Core.withObject
      "ListSubscriptionOffersResponse"
      ( \o ->
          ListSubscriptionOffersResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "subscriptionOffers")
      )

instance Core.ToJSON ListSubscriptionOffersResponse where
  toJSON ListSubscriptionOffersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("subscriptionOffers" Core..=) Core.<$> subscriptionOffers
          ]
      )

-- | Response message for ListSubscriptions.
--
-- /See:/ 'newListSubscriptionsResponse' smart constructor.
data ListSubscriptionsResponse = ListSubscriptionsResponse
  { -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | The subscriptions from the specified app.
    subscriptions :: (Core.Maybe [Subscription])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListSubscriptionsResponse' with the minimum fields required to make a request.
newListSubscriptionsResponse ::
  ListSubscriptionsResponse
newListSubscriptionsResponse =
  ListSubscriptionsResponse
    { nextPageToken = Core.Nothing,
      subscriptions = Core.Nothing
    }

instance Core.FromJSON ListSubscriptionsResponse where
  parseJSON =
    Core.withObject
      "ListSubscriptionsResponse"
      ( \o ->
          ListSubscriptionsResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "subscriptions")
      )

instance Core.ToJSON ListSubscriptionsResponse where
  toJSON ListSubscriptionsResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("subscriptions" Core..=) Core.<$> subscriptions
          ]
      )

-- | A response containing one or more users with access to an account.
--
-- /See:/ 'newListUsersResponse' smart constructor.
data ListUsersResponse = ListUsersResponse
  { -- | A token to pass to subsequent calls in order to retrieve subsequent results. This will not be set if there are no more results to return.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | The resulting users.
    users :: (Core.Maybe [User])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListUsersResponse' with the minimum fields required to make a request.
newListUsersResponse ::
  ListUsersResponse
newListUsersResponse =
  ListUsersResponse
    { nextPageToken = Core.Nothing,
      users = Core.Nothing
    }

instance Core.FromJSON ListUsersResponse where
  parseJSON =
    Core.withObject
      "ListUsersResponse"
      ( \o ->
          ListUsersResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "users")
      )

instance Core.ToJSON ListUsersResponse where
  toJSON ListUsersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("users" Core..=) Core.<$> users
          ]
      )

-- | A localized store listing. The resource for ListingsService.
--
-- /See:/ 'newListing' smart constructor.
data Listing = Listing
  { -- | Full description of the app.
    fullDescription :: (Core.Maybe Core.Text),
    -- | Language localization code (a BCP-47 language tag; for example, \"de-AT\" for Austrian German).
    language :: (Core.Maybe Core.Text),
    -- | Short description of the app.
    shortDescription :: (Core.Maybe Core.Text),
    -- | Localized title of the app.
    title :: (Core.Maybe Core.Text),
    -- | URL of a promotional YouTube video for the app.
    video :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Listing' with the minimum fields required to make a request.
newListing ::
  Listing
newListing =
  Listing
    { fullDescription = Core.Nothing,
      language = Core.Nothing,
      shortDescription = Core.Nothing,
      title = Core.Nothing,
      video = Core.Nothing
    }

instance Core.FromJSON Listing where
  parseJSON =
    Core.withObject
      "Listing"
      ( \o ->
          Listing
            Core.<$> (o Core..:? "fullDescription")
            Core.<*> (o Core..:? "language")
            Core.<*> (o Core..:? "shortDescription")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "video")
      )

instance Core.ToJSON Listing where
  toJSON Listing {..} =
    Core.object
      ( Core.catMaybes
          [ ("fullDescription" Core..=) Core.<$> fullDescription,
            ("language" Core..=) Core.<$> language,
            ("shortDescription" Core..=) Core.<$> shortDescription,
            ("title" Core..=) Core.<$> title,
            ("video" Core..=) Core.<$> video
          ]
      )

-- | Response listing all localized listings.
--
-- /See:/ 'newListingsListResponse' smart constructor.
data ListingsListResponse = ListingsListResponse
  { -- | The kind of this response (\"androidpublisher#listingsListResponse\").
    kind :: (Core.Maybe Core.Text),
    -- | All localized listings.
    listings :: (Core.Maybe [Listing])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListingsListResponse' with the minimum fields required to make a request.
newListingsListResponse ::
  ListingsListResponse
newListingsListResponse =
  ListingsListResponse
    { kind = Core.Nothing,
      listings = Core.Nothing
    }

instance Core.FromJSON ListingsListResponse where
  parseJSON =
    Core.withObject
      "ListingsListResponse"
      ( \o ->
          ListingsListResponse
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "listings")
      )

instance Core.ToJSON ListingsListResponse where
  toJSON ListingsListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("listings" Core..=) Core.<$> listings
          ]
      )

-- | Localized text in given language.
--
-- /See:/ 'newLocalizedText' smart constructor.
data LocalizedText = LocalizedText
  { -- | Language localization code (a BCP-47 language tag; for example, \"de-AT\" for Austrian German).
    language :: (Core.Maybe Core.Text),
    -- | The text in the given language.
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'LocalizedText' with the minimum fields required to make a request.
newLocalizedText ::
  LocalizedText
newLocalizedText =
  LocalizedText {language = Core.Nothing, text = Core.Nothing}

instance Core.FromJSON LocalizedText where
  parseJSON =
    Core.withObject
      "LocalizedText"
      ( \o ->
          LocalizedText
            Core.<$> (o Core..:? "language")
            Core.<*> (o Core..:? "text")
      )

instance Core.ToJSON LocalizedText where
  toJSON LocalizedText {..} =
    Core.object
      ( Core.catMaybes
          [ ("language" Core..=) Core.<$> language,
            ("text" Core..=) Core.<$> text
          ]
      )

-- | Details about taxation and legal compliance for managed products.
--
-- /See:/ 'newManagedProductTaxAndComplianceSettings' smart constructor.
data ManagedProductTaxAndComplianceSettings = ManagedProductTaxAndComplianceSettings
  { -- | Digital content or service classification for products distributed to users in the European Economic Area (EEA). The withdrawal regime under EEA consumer laws depends on this classification. Refer to the <https://support.google.com/googleplay/android-developer/answer/10463498 Help Center article> for more information.
    eeaWithdrawalRightType ::
      ( Core.Maybe
          ManagedProductTaxAndComplianceSettings_EeaWithdrawalRightType
      ),
    -- | Whether this in-app product is declared as a product representing a tokenized digital asset.
    isTokenizedDigitalAsset :: (Core.Maybe Core.Bool),
    -- | A mapping from region code to tax rate details. The keys are region codes as defined by Unicode\'s \"CLDR\".
    taxRateInfoByRegionCode ::
      ( Core.Maybe
          ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
      )
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ManagedProductTaxAndComplianceSettings' with the minimum fields required to make a request.
newManagedProductTaxAndComplianceSettings ::
  ManagedProductTaxAndComplianceSettings
newManagedProductTaxAndComplianceSettings =
  ManagedProductTaxAndComplianceSettings
    { eeaWithdrawalRightType =
        Core.Nothing,
      isTokenizedDigitalAsset = Core.Nothing,
      taxRateInfoByRegionCode = Core.Nothing
    }

instance Core.FromJSON ManagedProductTaxAndComplianceSettings where
  parseJSON =
    Core.withObject
      "ManagedProductTaxAndComplianceSettings"
      ( \o ->
          ManagedProductTaxAndComplianceSettings
            Core.<$> (o Core..:? "eeaWithdrawalRightType")
            Core.<*> (o Core..:? "isTokenizedDigitalAsset")
            Core.<*> (o Core..:? "taxRateInfoByRegionCode")
      )

instance Core.ToJSON ManagedProductTaxAndComplianceSettings where
  toJSON ManagedProductTaxAndComplianceSettings {..} =
    Core.object
      ( Core.catMaybes
          [ ("eeaWithdrawalRightType" Core..=)
              Core.<$> eeaWithdrawalRightType,
            ("isTokenizedDigitalAsset" Core..=)
              Core.<$> isTokenizedDigitalAsset,
            ("taxRateInfoByRegionCode" Core..=)
              Core.<$> taxRateInfoByRegionCode
          ]
      )

-- | A mapping from region code to tax rate details. The keys are region codes as defined by Unicode\'s \"CLDR\".
--
-- /See:/ 'newManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode' smart constructor.
newtype ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode = ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
  { additional :: (Core.HashMap Core.Text RegionalTaxRateInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode' with the minimum fields required to make a request.
newManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode ::
  -- |  See 'additional'.
  Core.HashMap
    Core.Text
    RegionalTaxRateInfo ->
  ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
newManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
  additional =
    ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
      { additional =
          additional
      }

instance
  Core.FromJSON
    ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
  where
  parseJSON =
    Core.withObject
      "ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode"
      ( \o ->
          ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
            Core.<$> (Core.parseJSONObject o)
      )

instance
  Core.ToJSON
    ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode
  where
  toJSON
    ManagedProductTaxAndComplianceSettings_TaxRateInfoByRegionCode {..} =
      Core.toJSON additional

-- | Request message for MigrateBasePlanPrices.
--
-- /See:/ 'newMigrateBasePlanPricesRequest' smart constructor.
data MigrateBasePlanPricesRequest = MigrateBasePlanPricesRequest
  { -- | Required. The unique base plan ID of the base plan to update prices on.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe MigrateBasePlanPricesRequest_LatencyTolerance),
    -- | Required. Package name of the parent app. Must be equal to the package_name field on the Subscription resource.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The ID of the subscription to update. Must be equal to the product_id field on the Subscription resource.
    productId :: (Core.Maybe Core.Text),
    -- | Required. The regional prices to update.
    regionalPriceMigrations :: (Core.Maybe [RegionalPriceMigrationConfig]),
    -- | Required. The version of the available regions being used for the regional/price/migrations.
    regionsVersion :: (Core.Maybe RegionsVersion)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MigrateBasePlanPricesRequest' with the minimum fields required to make a request.
newMigrateBasePlanPricesRequest ::
  MigrateBasePlanPricesRequest
newMigrateBasePlanPricesRequest =
  MigrateBasePlanPricesRequest
    { basePlanId = Core.Nothing,
      latencyTolerance = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing,
      regionalPriceMigrations = Core.Nothing,
      regionsVersion = Core.Nothing
    }

instance Core.FromJSON MigrateBasePlanPricesRequest where
  parseJSON =
    Core.withObject
      "MigrateBasePlanPricesRequest"
      ( \o ->
          MigrateBasePlanPricesRequest
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
            Core.<*> (o Core..:? "regionalPriceMigrations")
            Core.<*> (o Core..:? "regionsVersion")
      )

instance Core.ToJSON MigrateBasePlanPricesRequest where
  toJSON MigrateBasePlanPricesRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId,
            ("regionalPriceMigrations" Core..=)
              Core.<$> regionalPriceMigrations,
            ("regionsVersion" Core..=) Core.<$> regionsVersion
          ]
      )

-- | Response message for MigrateBasePlanPrices.
--
-- /See:/ 'newMigrateBasePlanPricesResponse' smart constructor.
data MigrateBasePlanPricesResponse = MigrateBasePlanPricesResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MigrateBasePlanPricesResponse' with the minimum fields required to make a request.
newMigrateBasePlanPricesResponse ::
  MigrateBasePlanPricesResponse
newMigrateBasePlanPricesResponse = MigrateBasePlanPricesResponse

instance Core.FromJSON MigrateBasePlanPricesResponse where
  parseJSON =
    Core.withObject
      "MigrateBasePlanPricesResponse"
      (\o -> Core.pure MigrateBasePlanPricesResponse)

instance Core.ToJSON MigrateBasePlanPricesResponse where
  toJSON = Core.const Core.emptyObject

-- | Metadata of a module.
--
-- /See:/ 'newModuleMetadata' smart constructor.
data ModuleMetadata = ModuleMetadata
  { -- | Indicates the delivery type (e.g. on-demand) of the module.
    deliveryType :: (Core.Maybe ModuleMetadata_DeliveryType),
    -- | Names of the modules that this module directly depends on. Each module implicitly depends on the base module.
    dependencies :: (Core.Maybe [Core.Text]),
    -- | Indicates the type of this feature module.
    moduleType :: (Core.Maybe ModuleMetadata_ModuleType),
    -- | Module name.
    name :: (Core.Maybe Core.Text),
    -- | The targeting that makes a conditional module installed. Relevant only for Split APKs.
    targeting :: (Core.Maybe ModuleTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ModuleMetadata' with the minimum fields required to make a request.
newModuleMetadata ::
  ModuleMetadata
newModuleMetadata =
  ModuleMetadata
    { deliveryType = Core.Nothing,
      dependencies = Core.Nothing,
      moduleType = Core.Nothing,
      name = Core.Nothing,
      targeting = Core.Nothing
    }

instance Core.FromJSON ModuleMetadata where
  parseJSON =
    Core.withObject
      "ModuleMetadata"
      ( \o ->
          ModuleMetadata
            Core.<$> (o Core..:? "deliveryType")
            Core.<*> (o Core..:? "dependencies")
            Core.<*> (o Core..:? "moduleType")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "targeting")
      )

instance Core.ToJSON ModuleMetadata where
  toJSON ModuleMetadata {..} =
    Core.object
      ( Core.catMaybes
          [ ("deliveryType" Core..=) Core.<$> deliveryType,
            ("dependencies" Core..=) Core.<$> dependencies,
            ("moduleType" Core..=) Core.<$> moduleType,
            ("name" Core..=) Core.<$> name,
            ("targeting" Core..=) Core.<$> targeting
          ]
      )

-- | Targeting on the module level.
--
-- /See:/ 'newModuleTargeting' smart constructor.
data ModuleTargeting = ModuleTargeting
  { -- | Targeting for device features.
    deviceFeatureTargeting :: (Core.Maybe [DeviceFeatureTargeting]),
    -- | The sdk version that the variant targets
    sdkVersionTargeting :: (Core.Maybe SdkVersionTargeting),
    -- | Countries-level targeting
    userCountriesTargeting :: (Core.Maybe UserCountriesTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ModuleTargeting' with the minimum fields required to make a request.
newModuleTargeting ::
  ModuleTargeting
newModuleTargeting =
  ModuleTargeting
    { deviceFeatureTargeting = Core.Nothing,
      sdkVersionTargeting = Core.Nothing,
      userCountriesTargeting = Core.Nothing
    }

instance Core.FromJSON ModuleTargeting where
  parseJSON =
    Core.withObject
      "ModuleTargeting"
      ( \o ->
          ModuleTargeting
            Core.<$> (o Core..:? "deviceFeatureTargeting")
            Core.<*> (o Core..:? "sdkVersionTargeting")
            Core.<*> (o Core..:? "userCountriesTargeting")
      )

instance Core.ToJSON ModuleTargeting where
  toJSON ModuleTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceFeatureTargeting" Core..=)
              Core.<$> deviceFeatureTargeting,
            ("sdkVersionTargeting" Core..=) Core.<$> sdkVersionTargeting,
            ("userCountriesTargeting" Core..=)
              Core.<$> userCountriesTargeting
          ]
      )

-- | Represents an amount of money with its currency type.
--
-- /See:/ 'newMoney' smart constructor.
data Money = Money
  { -- | The three-letter currency code defined in ISO 4217.
    currencyCode :: (Core.Maybe Core.Text),
    -- | Number of nano (10^-9) units of the amount. The value must be between -999,999,999 and +999,999,999 inclusive. If @units@ is positive, @nanos@ must be positive or zero. If @units@ is zero, @nanos@ can be positive, zero, or negative. If @units@ is negative, @nanos@ must be negative or zero. For example $-1.75 is represented as @units@=-1 and @nanos@=-750,000,000.
    nanos :: (Core.Maybe Core.Int32),
    -- | The whole units of the amount. For example if @currencyCode@ is @\"USD\"@, then 1 unit is one US dollar.
    units :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Money' with the minimum fields required to make a request.
newMoney ::
  Money
newMoney =
  Money
    { currencyCode = Core.Nothing,
      nanos = Core.Nothing,
      units = Core.Nothing
    }

instance Core.FromJSON Money where
  parseJSON =
    Core.withObject
      "Money"
      ( \o ->
          Money
            Core.<$> (o Core..:? "currencyCode")
            Core.<*> (o Core..:? "nanos")
            Core.<*> (o Core..:? "units" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON Money where
  toJSON Money {..} =
    Core.object
      ( Core.catMaybes
          [ ("currencyCode" Core..=) Core.<$> currencyCode,
            ("nanos" Core..=) Core.<$> nanos,
            ("units" Core..=) Core.. Core.AsText Core.<$> units
          ]
      )

-- | Represents a list of ABIs.
--
-- /See:/ 'newMultiAbi' smart constructor.
newtype MultiAbi = MultiAbi
  { -- | A list of targeted ABIs, as represented by the Android Platform
    abi :: (Core.Maybe [Abi])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MultiAbi' with the minimum fields required to make a request.
newMultiAbi ::
  MultiAbi
newMultiAbi = MultiAbi {abi = Core.Nothing}

instance Core.FromJSON MultiAbi where
  parseJSON =
    Core.withObject
      "MultiAbi"
      (\o -> MultiAbi Core.<$> (o Core..:? "abi"))

instance Core.ToJSON MultiAbi where
  toJSON MultiAbi {..} =
    Core.object (Core.catMaybes [("abi" Core..=) Core.<$> abi])

-- | Targeting based on multiple abis.
--
-- /See:/ 'newMultiAbiTargeting' smart constructor.
data MultiAbiTargeting = MultiAbiTargeting
  { -- | Targeting of other sibling directories that were in the Bundle. For main splits this is targeting of other main splits.
    alternatives :: (Core.Maybe [MultiAbi]),
    -- | Value of a multi abi.
    value :: (Core.Maybe [MultiAbi])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MultiAbiTargeting' with the minimum fields required to make a request.
newMultiAbiTargeting ::
  MultiAbiTargeting
newMultiAbiTargeting =
  MultiAbiTargeting
    { alternatives = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON MultiAbiTargeting where
  parseJSON =
    Core.withObject
      "MultiAbiTargeting"
      ( \o ->
          MultiAbiTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON MultiAbiTargeting where
  toJSON MultiAbiTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | Offer details information related to a purchase line item.
--
-- /See:/ 'newOfferDetails' smart constructor.
data OfferDetails = OfferDetails
  { -- | The base plan ID. Present for all base plan and offers.
    basePlanId :: (Core.Maybe Core.Text),
    -- | The offer ID. Only present for discounted offers.
    offerId :: (Core.Maybe Core.Text),
    -- | The latest offer tags associated with the offer. It includes tags inherited from the base plan.
    offerTags :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OfferDetails' with the minimum fields required to make a request.
newOfferDetails ::
  OfferDetails
newOfferDetails =
  OfferDetails
    { basePlanId = Core.Nothing,
      offerId = Core.Nothing,
      offerTags = Core.Nothing
    }

instance Core.FromJSON OfferDetails where
  parseJSON =
    Core.withObject
      "OfferDetails"
      ( \o ->
          OfferDetails
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "offerId")
            Core.<*> (o Core..:? "offerTags")
      )

instance Core.ToJSON OfferDetails where
  toJSON OfferDetails {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("offerId" Core..=) Core.<$> offerId,
            ("offerTags" Core..=) Core.<$> offerTags
          ]
      )

-- | Represents a custom tag specified for a product offer.
--
-- /See:/ 'newOfferTag' smart constructor.
newtype OfferTag = OfferTag
  { -- | Must conform with RFC-1034. That is, this string can only contain lower-case letters (a-z), numbers (0-9), and hyphens (-), and be at most 20 characters.
    tag :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OfferTag' with the minimum fields required to make a request.
newOfferTag ::
  OfferTag
newOfferTag = OfferTag {tag = Core.Nothing}

instance Core.FromJSON OfferTag where
  parseJSON =
    Core.withObject
      "OfferTag"
      (\o -> OfferTag Core.<$> (o Core..:? "tag"))

instance Core.ToJSON OfferTag where
  toJSON OfferTag {..} =
    Core.object (Core.catMaybes [("tag" Core..=) Core.<$> tag])

-- | A single use promotion code.
--
-- /See:/ 'newOneTimeCode' smart constructor.
data OneTimeCode = OneTimeCode
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OneTimeCode' with the minimum fields required to make a request.
newOneTimeCode ::
  OneTimeCode
newOneTimeCode = OneTimeCode

instance Core.FromJSON OneTimeCode where
  parseJSON =
    Core.withObject "OneTimeCode" (\o -> Core.pure OneTimeCode)

instance Core.ToJSON OneTimeCode where
  toJSON = Core.const Core.emptyObject

-- | Represents a one-time transaction.
--
-- /See:/ 'newOneTimeExternalTransaction' smart constructor.
newtype OneTimeExternalTransaction = OneTimeExternalTransaction
  { -- | Input only. Provided during the call to Create. Retrieved from the client when the alternative billing flow is launched.
    externalTransactionToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OneTimeExternalTransaction' with the minimum fields required to make a request.
newOneTimeExternalTransaction ::
  OneTimeExternalTransaction
newOneTimeExternalTransaction =
  OneTimeExternalTransaction
    { externalTransactionToken =
        Core.Nothing
    }

instance Core.FromJSON OneTimeExternalTransaction where
  parseJSON =
    Core.withObject
      "OneTimeExternalTransaction"
      ( \o ->
          OneTimeExternalTransaction
            Core.<$> (o Core..:? "externalTransactionToken")
      )

instance Core.ToJSON OneTimeExternalTransaction where
  toJSON OneTimeExternalTransaction {..} =
    Core.object
      ( Core.catMaybes
          [ ("externalTransactionToken" Core..=)
              Core.<$> externalTransactionToken
          ]
      )

-- | Details of a recurring external transaction product which doesn\'t belong to any other more specific category.
--
-- /See:/ 'newOtherRecurringProduct' smart constructor.
data OtherRecurringProduct = OtherRecurringProduct
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRecurringProduct' with the minimum fields required to make a request.
newOtherRecurringProduct ::
  OtherRecurringProduct
newOtherRecurringProduct = OtherRecurringProduct

instance Core.FromJSON OtherRecurringProduct where
  parseJSON =
    Core.withObject
      "OtherRecurringProduct"
      (\o -> Core.pure OtherRecurringProduct)

instance Core.ToJSON OtherRecurringProduct where
  toJSON = Core.const Core.emptyObject

-- | Pricing information for any new locations Play may launch in.
--
-- /See:/ 'newOtherRegionsBasePlanConfig' smart constructor.
data OtherRegionsBasePlanConfig = OtherRegionsBasePlanConfig
  { -- | Required. Price in EUR to use for any new locations Play may launch in.
    eurPrice :: (Core.Maybe Money),
    -- | Whether the base plan is available for new subscribers in any new locations Play may launch in. If not specified, this will default to false.
    newSubscriberAvailability' :: (Core.Maybe Core.Bool),
    -- | Required. Price in USD to use for any new locations Play may launch in.
    usdPrice :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRegionsBasePlanConfig' with the minimum fields required to make a request.
newOtherRegionsBasePlanConfig ::
  OtherRegionsBasePlanConfig
newOtherRegionsBasePlanConfig =
  OtherRegionsBasePlanConfig
    { eurPrice = Core.Nothing,
      newSubscriberAvailability' = Core.Nothing,
      usdPrice = Core.Nothing
    }

instance Core.FromJSON OtherRegionsBasePlanConfig where
  parseJSON =
    Core.withObject
      "OtherRegionsBasePlanConfig"
      ( \o ->
          OtherRegionsBasePlanConfig
            Core.<$> (o Core..:? "eurPrice")
            Core.<*> (o Core..:? "newSubscriberAvailability")
            Core.<*> (o Core..:? "usdPrice")
      )

instance Core.ToJSON OtherRegionsBasePlanConfig where
  toJSON OtherRegionsBasePlanConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("eurPrice" Core..=) Core.<$> eurPrice,
            ("newSubscriberAvailability" Core..=)
              Core.<$> newSubscriberAvailability',
            ("usdPrice" Core..=) Core.<$> usdPrice
          ]
      )

-- | Configuration for any new locations Play may launch in specified on a subscription offer.
--
-- /See:/ 'newOtherRegionsSubscriptionOfferConfig' smart constructor.
newtype OtherRegionsSubscriptionOfferConfig = OtherRegionsSubscriptionOfferConfig
  { -- | Whether the subscription offer in any new locations Play may launch in the future. If not specified, this will default to false.
    otherRegionsNewSubscriberAvailability :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRegionsSubscriptionOfferConfig' with the minimum fields required to make a request.
newOtherRegionsSubscriptionOfferConfig ::
  OtherRegionsSubscriptionOfferConfig
newOtherRegionsSubscriptionOfferConfig =
  OtherRegionsSubscriptionOfferConfig
    { otherRegionsNewSubscriberAvailability =
        Core.Nothing
    }

instance Core.FromJSON OtherRegionsSubscriptionOfferConfig where
  parseJSON =
    Core.withObject
      "OtherRegionsSubscriptionOfferConfig"
      ( \o ->
          OtherRegionsSubscriptionOfferConfig
            Core.<$> (o Core..:? "otherRegionsNewSubscriberAvailability")
      )

instance Core.ToJSON OtherRegionsSubscriptionOfferConfig where
  toJSON OtherRegionsSubscriptionOfferConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("otherRegionsNewSubscriberAvailability" Core..=)
              Core.<$> otherRegionsNewSubscriberAvailability
          ]
      )

-- | Configuration for any new locations Play may launch in for a single offer phase.
--
-- /See:/ 'newOtherRegionsSubscriptionOfferPhaseConfig' smart constructor.
data OtherRegionsSubscriptionOfferPhaseConfig = OtherRegionsSubscriptionOfferPhaseConfig
  { -- | The absolute amount of money subtracted from the base plan price prorated over the phase duration that the user pays for this offer phase. For example, if the base plan price for this region is $12 for a period of 1 year, then a $1 absolute discount for a phase of a duration of 3 months would correspond to a price of $2. The resulting price may not be smaller than the minimum price allowed for any new locations Play may launch in.
    absoluteDiscounts :: (Core.Maybe OtherRegionsSubscriptionOfferPhasePrices),
    -- | Set to specify this offer is free to obtain.
    free :: (Core.Maybe OtherRegionsSubscriptionOfferPhaseFreePriceOverride),
    -- | The absolute price the user pays for this offer phase. The price must not be smaller than the minimum price allowed for any new locations Play may launch in.
    otherRegionsPrices :: (Core.Maybe OtherRegionsSubscriptionOfferPhasePrices),
    -- | The fraction of the base plan price prorated over the phase duration that the user pays for this offer phase. For example, if the base plan price for this region is $12 for a period of 1 year, then a 50% discount for a phase of a duration of 3 months would correspond to a price of $1.50. The discount must be specified as a fraction strictly larger than 0 and strictly smaller than 1. The resulting price will be rounded to the nearest billable unit (e.g. cents for USD). The relative discount is considered invalid if the discounted price ends up being smaller than the minimum price allowed in any new locations Play may launch in.
    relativeDiscount :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRegionsSubscriptionOfferPhaseConfig' with the minimum fields required to make a request.
newOtherRegionsSubscriptionOfferPhaseConfig ::
  OtherRegionsSubscriptionOfferPhaseConfig
newOtherRegionsSubscriptionOfferPhaseConfig =
  OtherRegionsSubscriptionOfferPhaseConfig
    { absoluteDiscounts =
        Core.Nothing,
      free = Core.Nothing,
      otherRegionsPrices = Core.Nothing,
      relativeDiscount = Core.Nothing
    }

instance Core.FromJSON OtherRegionsSubscriptionOfferPhaseConfig where
  parseJSON =
    Core.withObject
      "OtherRegionsSubscriptionOfferPhaseConfig"
      ( \o ->
          OtherRegionsSubscriptionOfferPhaseConfig
            Core.<$> (o Core..:? "absoluteDiscounts")
            Core.<*> (o Core..:? "free")
            Core.<*> (o Core..:? "otherRegionsPrices")
            Core.<*> (o Core..:? "relativeDiscount")
      )

instance Core.ToJSON OtherRegionsSubscriptionOfferPhaseConfig where
  toJSON OtherRegionsSubscriptionOfferPhaseConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("absoluteDiscounts" Core..=) Core.<$> absoluteDiscounts,
            ("free" Core..=) Core.<$> free,
            ("otherRegionsPrices" Core..=) Core.<$> otherRegionsPrices,
            ("relativeDiscount" Core..=) Core.<$> relativeDiscount
          ]
      )

-- | Represents the free price override configuration for any new locations Play may launch for a single offer phase.
--
-- /See:/ 'newOtherRegionsSubscriptionOfferPhaseFreePriceOverride' smart constructor.
data OtherRegionsSubscriptionOfferPhaseFreePriceOverride = OtherRegionsSubscriptionOfferPhaseFreePriceOverride
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRegionsSubscriptionOfferPhaseFreePriceOverride' with the minimum fields required to make a request.
newOtherRegionsSubscriptionOfferPhaseFreePriceOverride ::
  OtherRegionsSubscriptionOfferPhaseFreePriceOverride
newOtherRegionsSubscriptionOfferPhaseFreePriceOverride =
  OtherRegionsSubscriptionOfferPhaseFreePriceOverride

instance
  Core.FromJSON
    OtherRegionsSubscriptionOfferPhaseFreePriceOverride
  where
  parseJSON =
    Core.withObject
      "OtherRegionsSubscriptionOfferPhaseFreePriceOverride"
      ( \o ->
          Core.pure OtherRegionsSubscriptionOfferPhaseFreePriceOverride
      )

instance
  Core.ToJSON
    OtherRegionsSubscriptionOfferPhaseFreePriceOverride
  where
  toJSON = Core.const Core.emptyObject

-- | Pricing information for any new locations Play may launch in.
--
-- /See:/ 'newOtherRegionsSubscriptionOfferPhasePrices' smart constructor.
data OtherRegionsSubscriptionOfferPhasePrices = OtherRegionsSubscriptionOfferPhasePrices
  { -- | Required. Price in EUR to use for any new locations Play may launch in.
    eurPrice :: (Core.Maybe Money),
    -- | Required. Price in USD to use for any new locations Play may launch in.
    usdPrice :: (Core.Maybe Money)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OtherRegionsSubscriptionOfferPhasePrices' with the minimum fields required to make a request.
newOtherRegionsSubscriptionOfferPhasePrices ::
  OtherRegionsSubscriptionOfferPhasePrices
newOtherRegionsSubscriptionOfferPhasePrices =
  OtherRegionsSubscriptionOfferPhasePrices
    { eurPrice = Core.Nothing,
      usdPrice = Core.Nothing
    }

instance Core.FromJSON OtherRegionsSubscriptionOfferPhasePrices where
  parseJSON =
    Core.withObject
      "OtherRegionsSubscriptionOfferPhasePrices"
      ( \o ->
          OtherRegionsSubscriptionOfferPhasePrices
            Core.<$> (o Core..:? "eurPrice")
            Core.<*> (o Core..:? "usdPrice")
      )

instance Core.ToJSON OtherRegionsSubscriptionOfferPhasePrices where
  toJSON OtherRegionsSubscriptionOfferPhasePrices {..} =
    Core.object
      ( Core.catMaybes
          [ ("eurPrice" Core..=) Core.<$> eurPrice,
            ("usdPrice" Core..=) Core.<$> usdPrice
          ]
      )

-- | Information about the current page. List operations that supports paging return only one \"page\" of results. This protocol buffer message describes the page that has been returned.
--
-- /See:/ 'newPageInfo' smart constructor.
data PageInfo = PageInfo
  { -- | Maximum number of results returned in one page. ! The number of results included in the API response.
    resultPerPage :: (Core.Maybe Core.Int32),
    -- | Index of the first result returned in the current page.
    startIndex :: (Core.Maybe Core.Int32),
    -- | Total number of results available on the backend ! The total number of results in the result set.
    totalResults :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PageInfo' with the minimum fields required to make a request.
newPageInfo ::
  PageInfo
newPageInfo =
  PageInfo
    { resultPerPage = Core.Nothing,
      startIndex = Core.Nothing,
      totalResults = Core.Nothing
    }

instance Core.FromJSON PageInfo where
  parseJSON =
    Core.withObject
      "PageInfo"
      ( \o ->
          PageInfo
            Core.<$> (o Core..:? "resultPerPage")
            Core.<*> (o Core..:? "startIndex")
            Core.<*> (o Core..:? "totalResults")
      )

instance Core.ToJSON PageInfo where
  toJSON PageInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("resultPerPage" Core..=) Core.<$> resultPerPage,
            ("startIndex" Core..=) Core.<$> startIndex,
            ("totalResults" Core..=) Core.<$> totalResults
          ]
      )

-- | A partial refund of a transaction.
--
-- /See:/ 'newPartialRefund' smart constructor.
data PartialRefund = PartialRefund
  { -- | Required. A unique id distinguishing this partial refund. If the refund is successful, subsequent refunds with the same id will fail. Must be unique across refunds for one individual transaction.
    refundId :: (Core.Maybe Core.Text),
    -- | Required. The pre-tax amount of the partial refund. Should be less than the remaining pre-tax amount of the transaction.
    refundPreTaxAmount :: (Core.Maybe Price)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PartialRefund' with the minimum fields required to make a request.
newPartialRefund ::
  PartialRefund
newPartialRefund =
  PartialRefund
    { refundId = Core.Nothing,
      refundPreTaxAmount = Core.Nothing
    }

instance Core.FromJSON PartialRefund where
  parseJSON =
    Core.withObject
      "PartialRefund"
      ( \o ->
          PartialRefund
            Core.<$> (o Core..:? "refundId")
            Core.<*> (o Core..:? "refundPreTaxAmount")
      )

instance Core.ToJSON PartialRefund where
  toJSON PartialRefund {..} =
    Core.object
      ( Core.catMaybes
          [ ("refundId" Core..=) Core.<$> refundId,
            ("refundPreTaxAmount" Core..=) Core.<$> refundPreTaxAmount
          ]
      )

-- | Information specific to a subscription in paused state.
--
-- /See:/ 'newPausedStateContext' smart constructor.
newtype PausedStateContext = PausedStateContext
  { -- | Time at which the subscription will be automatically resumed.
    autoResumeTime :: (Core.Maybe Core.DateTime)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PausedStateContext' with the minimum fields required to make a request.
newPausedStateContext ::
  PausedStateContext
newPausedStateContext =
  PausedStateContext {autoResumeTime = Core.Nothing}

instance Core.FromJSON PausedStateContext where
  parseJSON =
    Core.withObject
      "PausedStateContext"
      (\o -> PausedStateContext Core.<$> (o Core..:? "autoResumeTime"))

instance Core.ToJSON PausedStateContext where
  toJSON PausedStateContext {..} =
    Core.object
      ( Core.catMaybes
          [("autoResumeTime" Core..=) Core.<$> autoResumeTime]
      )

-- | This is an indicator of whether there is a pending cancellation on the virtual installment plan. The cancellation will happen only after the user finished all committed payments.
--
-- /See:/ 'newPendingCancellation' smart constructor.
data PendingCancellation = PendingCancellation
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PendingCancellation' with the minimum fields required to make a request.
newPendingCancellation ::
  PendingCancellation
newPendingCancellation = PendingCancellation

instance Core.FromJSON PendingCancellation where
  parseJSON =
    Core.withObject
      "PendingCancellation"
      (\o -> Core.pure PendingCancellation)

instance Core.ToJSON PendingCancellation where
  toJSON = Core.const Core.emptyObject

-- | Represents a base plan that does not automatically renew at the end of the base plan, and must be manually renewed by the user.
--
-- /See:/ 'newPrepaidBasePlanType' smart constructor.
data PrepaidBasePlanType = PrepaidBasePlanType
  { -- | Required. Immutable. Subscription period, specified in ISO 8601 format. For a list of acceptable billing periods, refer to the help center. The duration is immutable after the base plan is created.
    billingPeriodDuration :: (Core.Maybe Core.Text),
    -- | Whether users should be able to extend this prepaid base plan in Google Play surfaces. Defaults to TIME/EXTENSION/ACTIVE if not specified.
    timeExtension :: (Core.Maybe PrepaidBasePlanType_TimeExtension)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PrepaidBasePlanType' with the minimum fields required to make a request.
newPrepaidBasePlanType ::
  PrepaidBasePlanType
newPrepaidBasePlanType =
  PrepaidBasePlanType
    { billingPeriodDuration = Core.Nothing,
      timeExtension = Core.Nothing
    }

instance Core.FromJSON PrepaidBasePlanType where
  parseJSON =
    Core.withObject
      "PrepaidBasePlanType"
      ( \o ->
          PrepaidBasePlanType
            Core.<$> (o Core..:? "billingPeriodDuration")
            Core.<*> (o Core..:? "timeExtension")
      )

instance Core.ToJSON PrepaidBasePlanType where
  toJSON PrepaidBasePlanType {..} =
    Core.object
      ( Core.catMaybes
          [ ("billingPeriodDuration" Core..=) Core.<$> billingPeriodDuration,
            ("timeExtension" Core..=) Core.<$> timeExtension
          ]
      )

-- | Information related to a prepaid plan.
--
-- /See:/ 'newPrepaidPlan' smart constructor.
newtype PrepaidPlan = PrepaidPlan
  { -- | If present, this is the time after which top up purchases are allowed for the prepaid plan. Will not be present for expired prepaid plans.
    allowExtendAfterTime :: (Core.Maybe Core.DateTime)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PrepaidPlan' with the minimum fields required to make a request.
newPrepaidPlan ::
  PrepaidPlan
newPrepaidPlan = PrepaidPlan {allowExtendAfterTime = Core.Nothing}

instance Core.FromJSON PrepaidPlan where
  parseJSON =
    Core.withObject
      "PrepaidPlan"
      (\o -> PrepaidPlan Core.<$> (o Core..:? "allowExtendAfterTime"))

instance Core.ToJSON PrepaidPlan where
  toJSON PrepaidPlan {..} =
    Core.object
      ( Core.catMaybes
          [("allowExtendAfterTime" Core..=) Core.<$> allowExtendAfterTime]
      )

-- | Definition of a price, i.e. currency and units.
--
-- /See:/ 'newPrice' smart constructor.
data Price = Price
  { -- | 3 letter Currency code, as defined by ISO 4217. See java\/com\/google\/common\/money\/CurrencyCode.java
    currency :: (Core.Maybe Core.Text),
    -- | Price in 1\/million of the currency base unit, represented as a string.
    priceMicros :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Price' with the minimum fields required to make a request.
newPrice ::
  Price
newPrice =
  Price {currency = Core.Nothing, priceMicros = Core.Nothing}

instance Core.FromJSON Price where
  parseJSON =
    Core.withObject
      "Price"
      ( \o ->
          Price
            Core.<$> (o Core..:? "currency")
            Core.<*> (o Core..:? "priceMicros")
      )

instance Core.ToJSON Price where
  toJSON Price {..} =
    Core.object
      ( Core.catMaybes
          [ ("currency" Core..=) Core.<$> currency,
            ("priceMicros" Core..=) Core.<$> priceMicros
          ]
      )

-- | A ProductPurchase resource indicates the status of a user\'s inapp product purchase.
--
-- /See:/ 'newProductPurchase' smart constructor.
data ProductPurchase = ProductPurchase
  { -- | The acknowledgement state of the inapp product. Possible values are: 0. Yet to be acknowledged 1. Acknowledged
    acknowledgementState :: (Core.Maybe Core.Int32),
    -- | The consumption state of the inapp product. Possible values are: 0. Yet to be consumed 1. Consumed
    consumptionState :: (Core.Maybe Core.Int32),
    -- | A developer-specified string that contains supplemental information about an order.
    developerPayload :: (Core.Maybe Core.Text),
    -- | This kind represents an inappPurchase object in the androidpublisher service.
    kind :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s account in your app. Only present if specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedaccountid when the purchase was made.
    obfuscatedExternalAccountId :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s profile in your app. Only present if specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedprofileid when the purchase was made.
    obfuscatedExternalProfileId :: (Core.Maybe Core.Text),
    -- | The order id associated with the purchase of the inapp product.
    orderId :: (Core.Maybe Core.Text),
    -- | The inapp product SKU. May not be present.
    productId :: (Core.Maybe Core.Text),
    -- | The purchase state of the order. Possible values are: 0. Purchased 1. Canceled 2. Pending
    purchaseState :: (Core.Maybe Core.Int32),
    -- | The time the product was purchased, in milliseconds since the epoch (Jan 1, 1970).
    purchaseTimeMillis :: (Core.Maybe Core.Int64),
    -- | The purchase token generated to identify this purchase. May not be present.
    purchaseToken :: (Core.Maybe Core.Text),
    -- | The type of purchase of the inapp product. This field is only set if this purchase was not made using the standard in-app billing flow. Possible values are: 0. Test (i.e. purchased from a license testing account) 1. Promo (i.e. purchased using a promo code). Does not include Play Points purchases. 2. Rewarded (i.e. from watching a video ad instead of paying)
    purchaseType :: (Core.Maybe Core.Int32),
    -- | The quantity associated with the purchase of the inapp product. If not present, the quantity is 1.
    quantity :: (Core.Maybe Core.Int32),
    -- | The quantity eligible for refund, i.e. quantity that hasn\'t been refunded. The value reflects quantity-based partial refunds and full refunds.
    refundableQuantity :: (Core.Maybe Core.Int32),
    -- | ISO 3166-1 alpha-2 billing region code of the user at the time the product was granted.
    regionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ProductPurchase' with the minimum fields required to make a request.
newProductPurchase ::
  ProductPurchase
newProductPurchase =
  ProductPurchase
    { acknowledgementState = Core.Nothing,
      consumptionState = Core.Nothing,
      developerPayload = Core.Nothing,
      kind = Core.Nothing,
      obfuscatedExternalAccountId = Core.Nothing,
      obfuscatedExternalProfileId = Core.Nothing,
      orderId = Core.Nothing,
      productId = Core.Nothing,
      purchaseState = Core.Nothing,
      purchaseTimeMillis = Core.Nothing,
      purchaseToken = Core.Nothing,
      purchaseType = Core.Nothing,
      quantity = Core.Nothing,
      refundableQuantity = Core.Nothing,
      regionCode = Core.Nothing
    }

instance Core.FromJSON ProductPurchase where
  parseJSON =
    Core.withObject
      "ProductPurchase"
      ( \o ->
          ProductPurchase
            Core.<$> (o Core..:? "acknowledgementState")
            Core.<*> (o Core..:? "consumptionState")
            Core.<*> (o Core..:? "developerPayload")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "obfuscatedExternalAccountId")
            Core.<*> (o Core..:? "obfuscatedExternalProfileId")
            Core.<*> (o Core..:? "orderId")
            Core.<*> (o Core..:? "productId")
            Core.<*> (o Core..:? "purchaseState")
            Core.<*> ( o
                         Core..:? "purchaseTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "purchaseToken")
            Core.<*> (o Core..:? "purchaseType")
            Core.<*> (o Core..:? "quantity")
            Core.<*> (o Core..:? "refundableQuantity")
            Core.<*> (o Core..:? "regionCode")
      )

instance Core.ToJSON ProductPurchase where
  toJSON ProductPurchase {..} =
    Core.object
      ( Core.catMaybes
          [ ("acknowledgementState" Core..=) Core.<$> acknowledgementState,
            ("consumptionState" Core..=) Core.<$> consumptionState,
            ("developerPayload" Core..=) Core.<$> developerPayload,
            ("kind" Core..=) Core.<$> kind,
            ("obfuscatedExternalAccountId" Core..=)
              Core.<$> obfuscatedExternalAccountId,
            ("obfuscatedExternalProfileId" Core..=)
              Core.<$> obfuscatedExternalProfileId,
            ("orderId" Core..=) Core.<$> orderId,
            ("productId" Core..=) Core.<$> productId,
            ("purchaseState" Core..=) Core.<$> purchaseState,
            ("purchaseTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> purchaseTimeMillis,
            ("purchaseToken" Core..=) Core.<$> purchaseToken,
            ("purchaseType" Core..=) Core.<$> purchaseType,
            ("quantity" Core..=) Core.<$> quantity,
            ("refundableQuantity" Core..=) Core.<$> refundableQuantity,
            ("regionCode" Core..=) Core.<$> regionCode
          ]
      )

-- | Request for the product.purchases.acknowledge API.
--
-- /See:/ 'newProductPurchasesAcknowledgeRequest' smart constructor.
newtype ProductPurchasesAcknowledgeRequest = ProductPurchasesAcknowledgeRequest
  { -- | Payload to attach to the purchase.
    developerPayload :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ProductPurchasesAcknowledgeRequest' with the minimum fields required to make a request.
newProductPurchasesAcknowledgeRequest ::
  ProductPurchasesAcknowledgeRequest
newProductPurchasesAcknowledgeRequest =
  ProductPurchasesAcknowledgeRequest
    { developerPayload =
        Core.Nothing
    }

instance Core.FromJSON ProductPurchasesAcknowledgeRequest where
  parseJSON =
    Core.withObject
      "ProductPurchasesAcknowledgeRequest"
      ( \o ->
          ProductPurchasesAcknowledgeRequest
            Core.<$> (o Core..:? "developerPayload")
      )

instance Core.ToJSON ProductPurchasesAcknowledgeRequest where
  toJSON ProductPurchasesAcknowledgeRequest {..} =
    Core.object
      ( Core.catMaybes
          [("developerPayload" Core..=) Core.<$> developerPayload]
      )

-- | Represents a transaction that is part of a recurring series of payments. This can be a subscription or a one-time product with multiple payments (such as preorder).
--
-- /See:/ 'newRecurringExternalTransaction' smart constructor.
data RecurringExternalTransaction = RecurringExternalTransaction
  { -- | Details of an external subscription.
    externalSubscription :: (Core.Maybe ExternalSubscription),
    -- | Input only. Provided during the call to Create. Retrieved from the client when the alternative billing flow is launched. Required only for the initial purchase.
    externalTransactionToken :: (Core.Maybe Core.Text),
    -- | The external transaction id of the first transaction of this recurring series of transactions. For example, for a subscription this would be the transaction id of the first payment. Required when creating recurring external transactions.
    initialExternalTransactionId :: (Core.Maybe Core.Text),
    -- | Input only. Provided during the call to Create. Must only be used when migrating a subscription from manual monthly reporting to automated reporting.
    migratedTransactionProgram ::
      ( Core.Maybe
          RecurringExternalTransaction_MigratedTransactionProgram
      ),
    -- | Details of a recurring external transaction product which doesn\'t belong to any other specific category.
    otherRecurringProduct :: (Core.Maybe OtherRecurringProduct)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RecurringExternalTransaction' with the minimum fields required to make a request.
newRecurringExternalTransaction ::
  RecurringExternalTransaction
newRecurringExternalTransaction =
  RecurringExternalTransaction
    { externalSubscription = Core.Nothing,
      externalTransactionToken = Core.Nothing,
      initialExternalTransactionId = Core.Nothing,
      migratedTransactionProgram = Core.Nothing,
      otherRecurringProduct = Core.Nothing
    }

instance Core.FromJSON RecurringExternalTransaction where
  parseJSON =
    Core.withObject
      "RecurringExternalTransaction"
      ( \o ->
          RecurringExternalTransaction
            Core.<$> (o Core..:? "externalSubscription")
            Core.<*> (o Core..:? "externalTransactionToken")
            Core.<*> (o Core..:? "initialExternalTransactionId")
            Core.<*> (o Core..:? "migratedTransactionProgram")
            Core.<*> (o Core..:? "otherRecurringProduct")
      )

instance Core.ToJSON RecurringExternalTransaction where
  toJSON RecurringExternalTransaction {..} =
    Core.object
      ( Core.catMaybes
          [ ("externalSubscription" Core..=) Core.<$> externalSubscription,
            ("externalTransactionToken" Core..=)
              Core.<$> externalTransactionToken,
            ("initialExternalTransactionId" Core..=)
              Core.<$> initialExternalTransactionId,
            ("migratedTransactionProgram" Core..=)
              Core.<$> migratedTransactionProgram,
            ("otherRecurringProduct" Core..=) Core.<$> otherRecurringProduct
          ]
      )

-- | A request to refund an existing external transaction.
--
-- /See:/ 'newRefundExternalTransactionRequest' smart constructor.
data RefundExternalTransactionRequest = RefundExternalTransactionRequest
  { -- | A full-amount refund.
    fullRefund :: (Core.Maybe FullRefund),
    -- | A partial refund.
    partialRefund :: (Core.Maybe PartialRefund),
    -- | Required. The time that the transaction was refunded.
    refundTime :: (Core.Maybe Core.DateTime)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RefundExternalTransactionRequest' with the minimum fields required to make a request.
newRefundExternalTransactionRequest ::
  RefundExternalTransactionRequest
newRefundExternalTransactionRequest =
  RefundExternalTransactionRequest
    { fullRefund = Core.Nothing,
      partialRefund = Core.Nothing,
      refundTime = Core.Nothing
    }

instance Core.FromJSON RefundExternalTransactionRequest where
  parseJSON =
    Core.withObject
      "RefundExternalTransactionRequest"
      ( \o ->
          RefundExternalTransactionRequest
            Core.<$> (o Core..:? "fullRefund")
            Core.<*> (o Core..:? "partialRefund")
            Core.<*> (o Core..:? "refundTime")
      )

instance Core.ToJSON RefundExternalTransactionRequest where
  toJSON RefundExternalTransactionRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("fullRefund" Core..=) Core.<$> fullRefund,
            ("partialRefund" Core..=) Core.<$> partialRefund,
            ("refundTime" Core..=) Core.<$> refundTime
          ]
      )

-- | Configuration for a base plan specific to a region.
--
-- /See:/ 'newRegionalBasePlanConfig' smart constructor.
data RegionalBasePlanConfig = RegionalBasePlanConfig
  { -- | Whether the base plan in the specified region is available for new subscribers. Existing subscribers will not have their subscription canceled if this value is set to false. If not specified, this will default to false.
    newSubscriberAvailability' :: (Core.Maybe Core.Bool),
    -- | The price of the base plan in the specified region. Must be set if the base plan is available to new subscribers. Must be set in the currency that is linked to the specified region.
    price :: (Core.Maybe Money),
    -- | Required. Region code this configuration applies to, as defined by ISO 3166-2, e.g. \"US\".
    regionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalBasePlanConfig' with the minimum fields required to make a request.
newRegionalBasePlanConfig ::
  RegionalBasePlanConfig
newRegionalBasePlanConfig =
  RegionalBasePlanConfig
    { newSubscriberAvailability' = Core.Nothing,
      price = Core.Nothing,
      regionCode = Core.Nothing
    }

instance Core.FromJSON RegionalBasePlanConfig where
  parseJSON =
    Core.withObject
      "RegionalBasePlanConfig"
      ( \o ->
          RegionalBasePlanConfig
            Core.<$> (o Core..:? "newSubscriberAvailability")
            Core.<*> (o Core..:? "price")
            Core.<*> (o Core..:? "regionCode")
      )

instance Core.ToJSON RegionalBasePlanConfig where
  toJSON RegionalBasePlanConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("newSubscriberAvailability" Core..=)
              Core.<$> newSubscriberAvailability',
            ("price" Core..=) Core.<$> price,
            ("regionCode" Core..=) Core.<$> regionCode
          ]
      )

-- | Configuration for migration of a legacy price cohort.
--
-- /See:/ 'newRegionalPriceMigrationConfig' smart constructor.
data RegionalPriceMigrationConfig = RegionalPriceMigrationConfig
  { -- | Required. Subscribers in all legacy price cohorts before this time will be migrated to the current price. Subscribers in any newer price cohorts are unaffected. Affected subscribers will receive one or more notifications from Google Play about the price change. Price decreases occur at the subscriber\'s next billing date. Price increases occur at the subscriber\'s next billing date following a notification period that varies by region and price increase type.
    oldestAllowedPriceVersionTime :: (Core.Maybe Core.DateTime),
    -- | Optional. The requested type of price increase
    priceIncreaseType :: (Core.Maybe RegionalPriceMigrationConfig_PriceIncreaseType),
    -- | Required. Region code this configuration applies to, as defined by ISO 3166-2, e.g. \"US\".
    regionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalPriceMigrationConfig' with the minimum fields required to make a request.
newRegionalPriceMigrationConfig ::
  RegionalPriceMigrationConfig
newRegionalPriceMigrationConfig =
  RegionalPriceMigrationConfig
    { oldestAllowedPriceVersionTime =
        Core.Nothing,
      priceIncreaseType = Core.Nothing,
      regionCode = Core.Nothing
    }

instance Core.FromJSON RegionalPriceMigrationConfig where
  parseJSON =
    Core.withObject
      "RegionalPriceMigrationConfig"
      ( \o ->
          RegionalPriceMigrationConfig
            Core.<$> (o Core..:? "oldestAllowedPriceVersionTime")
            Core.<*> (o Core..:? "priceIncreaseType")
            Core.<*> (o Core..:? "regionCode")
      )

instance Core.ToJSON RegionalPriceMigrationConfig where
  toJSON RegionalPriceMigrationConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("oldestAllowedPriceVersionTime" Core..=)
              Core.<$> oldestAllowedPriceVersionTime,
            ("priceIncreaseType" Core..=) Core.<$> priceIncreaseType,
            ("regionCode" Core..=) Core.<$> regionCode
          ]
      )

-- | Configuration for a subscription offer in a single region.
--
-- /See:/ 'newRegionalSubscriptionOfferConfig' smart constructor.
data RegionalSubscriptionOfferConfig = RegionalSubscriptionOfferConfig
  { -- | Whether the subscription offer in the specified region is available for new subscribers. Existing subscribers will not have their subscription cancelled if this value is set to false. If not specified, this will default to false.
    newSubscriberAvailability' :: (Core.Maybe Core.Bool),
    -- | Required. Immutable. Region code this configuration applies to, as defined by ISO 3166-2, e.g. \"US\".
    regionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalSubscriptionOfferConfig' with the minimum fields required to make a request.
newRegionalSubscriptionOfferConfig ::
  RegionalSubscriptionOfferConfig
newRegionalSubscriptionOfferConfig =
  RegionalSubscriptionOfferConfig
    { newSubscriberAvailability' =
        Core.Nothing,
      regionCode = Core.Nothing
    }

instance Core.FromJSON RegionalSubscriptionOfferConfig where
  parseJSON =
    Core.withObject
      "RegionalSubscriptionOfferConfig"
      ( \o ->
          RegionalSubscriptionOfferConfig
            Core.<$> (o Core..:? "newSubscriberAvailability")
            Core.<*> (o Core..:? "regionCode")
      )

instance Core.ToJSON RegionalSubscriptionOfferConfig where
  toJSON RegionalSubscriptionOfferConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("newSubscriberAvailability" Core..=)
              Core.<$> newSubscriberAvailability',
            ("regionCode" Core..=) Core.<$> regionCode
          ]
      )

-- | Configuration for a single phase of a subscription offer in a single region.
--
-- /See:/ 'newRegionalSubscriptionOfferPhaseConfig' smart constructor.
data RegionalSubscriptionOfferPhaseConfig = RegionalSubscriptionOfferPhaseConfig
  { -- | The absolute amount of money subtracted from the base plan price prorated over the phase duration that the user pays for this offer phase. For example, if the base plan price for this region is $12 for a period of 1 year, then a $1 absolute discount for a phase of a duration of 3 months would correspond to a price of $2. The resulting price may not be smaller than the minimum price allowed for this region.
    absoluteDiscount :: (Core.Maybe Money),
    -- | Set to specify this offer is free to obtain.
    free :: (Core.Maybe RegionalSubscriptionOfferPhaseFreePriceOverride),
    -- | The absolute price the user pays for this offer phase. The price must not be smaller than the minimum price allowed for this region.
    price :: (Core.Maybe Money),
    -- | Required. Immutable. The region to which this config applies.
    regionCode :: (Core.Maybe Core.Text),
    -- | The fraction of the base plan price prorated over the phase duration that the user pays for this offer phase. For example, if the base plan price for this region is $12 for a period of 1 year, then a 50% discount for a phase of a duration of 3 months would correspond to a price of $1.50. The discount must be specified as a fraction strictly larger than 0 and strictly smaller than 1. The resulting price will be rounded to the nearest billable unit (e.g. cents for USD). The relative discount is considered invalid if the discounted price ends up being smaller than the minimum price allowed in this region.
    relativeDiscount :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalSubscriptionOfferPhaseConfig' with the minimum fields required to make a request.
newRegionalSubscriptionOfferPhaseConfig ::
  RegionalSubscriptionOfferPhaseConfig
newRegionalSubscriptionOfferPhaseConfig =
  RegionalSubscriptionOfferPhaseConfig
    { absoluteDiscount =
        Core.Nothing,
      free = Core.Nothing,
      price = Core.Nothing,
      regionCode = Core.Nothing,
      relativeDiscount = Core.Nothing
    }

instance Core.FromJSON RegionalSubscriptionOfferPhaseConfig where
  parseJSON =
    Core.withObject
      "RegionalSubscriptionOfferPhaseConfig"
      ( \o ->
          RegionalSubscriptionOfferPhaseConfig
            Core.<$> (o Core..:? "absoluteDiscount")
            Core.<*> (o Core..:? "free")
            Core.<*> (o Core..:? "price")
            Core.<*> (o Core..:? "regionCode")
            Core.<*> (o Core..:? "relativeDiscount")
      )

instance Core.ToJSON RegionalSubscriptionOfferPhaseConfig where
  toJSON RegionalSubscriptionOfferPhaseConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("absoluteDiscount" Core..=) Core.<$> absoluteDiscount,
            ("free" Core..=) Core.<$> free,
            ("price" Core..=) Core.<$> price,
            ("regionCode" Core..=) Core.<$> regionCode,
            ("relativeDiscount" Core..=) Core.<$> relativeDiscount
          ]
      )

-- | Represents the free price override configuration for a single phase of a subscription offer
--
-- /See:/ 'newRegionalSubscriptionOfferPhaseFreePriceOverride' smart constructor.
data RegionalSubscriptionOfferPhaseFreePriceOverride = RegionalSubscriptionOfferPhaseFreePriceOverride
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalSubscriptionOfferPhaseFreePriceOverride' with the minimum fields required to make a request.
newRegionalSubscriptionOfferPhaseFreePriceOverride ::
  RegionalSubscriptionOfferPhaseFreePriceOverride
newRegionalSubscriptionOfferPhaseFreePriceOverride =
  RegionalSubscriptionOfferPhaseFreePriceOverride

instance
  Core.FromJSON
    RegionalSubscriptionOfferPhaseFreePriceOverride
  where
  parseJSON =
    Core.withObject
      "RegionalSubscriptionOfferPhaseFreePriceOverride"
      (\o -> Core.pure RegionalSubscriptionOfferPhaseFreePriceOverride)

instance
  Core.ToJSON
    RegionalSubscriptionOfferPhaseFreePriceOverride
  where
  toJSON = Core.const Core.emptyObject

-- | Specified details about taxation in a given geographical region.
--
-- /See:/ 'newRegionalTaxRateInfo' smart constructor.
data RegionalTaxRateInfo = RegionalTaxRateInfo
  { -- | You must tell us if your app contains streaming products to correctly charge US state and local sales tax. Field only supported in the United States.
    eligibleForStreamingServiceTaxRate :: (Core.Maybe Core.Bool),
    -- | To collect communications or amusement taxes in the United States, choose the appropriate tax category. <https://support.google.com/googleplay/android-developer/answer/10463498#streaming_tax Learn more>.
    streamingTaxType :: (Core.Maybe RegionalTaxRateInfo_StreamingTaxType),
    -- | Tax tier to specify reduced tax rate. Developers who sell digital news, magazines, newspapers, books, or audiobooks in various regions may be eligible for reduced tax rates. <https://support.google.com/googleplay/android-developer/answer/10463498 Learn more>.
    taxTier :: (Core.Maybe RegionalTaxRateInfo_TaxTier)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionalTaxRateInfo' with the minimum fields required to make a request.
newRegionalTaxRateInfo ::
  RegionalTaxRateInfo
newRegionalTaxRateInfo =
  RegionalTaxRateInfo
    { eligibleForStreamingServiceTaxRate =
        Core.Nothing,
      streamingTaxType = Core.Nothing,
      taxTier = Core.Nothing
    }

instance Core.FromJSON RegionalTaxRateInfo where
  parseJSON =
    Core.withObject
      "RegionalTaxRateInfo"
      ( \o ->
          RegionalTaxRateInfo
            Core.<$> (o Core..:? "eligibleForStreamingServiceTaxRate")
            Core.<*> (o Core..:? "streamingTaxType")
            Core.<*> (o Core..:? "taxTier")
      )

instance Core.ToJSON RegionalTaxRateInfo where
  toJSON RegionalTaxRateInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("eligibleForStreamingServiceTaxRate" Core..=)
              Core.<$> eligibleForStreamingServiceTaxRate,
            ("streamingTaxType" Core..=) Core.<$> streamingTaxType,
            ("taxTier" Core..=) Core.<$> taxTier
          ]
      )

-- | Region targeting data for app recovery action targeting.
--
-- /See:/ 'newRegions' smart constructor.
newtype Regions = Regions
  { -- | Regions targeted by the recovery action. Region codes are ISO 3166 Alpha-2 country codes. For example, US stands for United States of America. See https:\/\/www.iso.org\/iso-3166-country-codes.html for the complete list of country codes.
    regionCode :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Regions' with the minimum fields required to make a request.
newRegions ::
  Regions
newRegions = Regions {regionCode = Core.Nothing}

instance Core.FromJSON Regions where
  parseJSON =
    Core.withObject
      "Regions"
      (\o -> Regions Core.<$> (o Core..:? "regionCode"))

instance Core.ToJSON Regions where
  toJSON Regions {..} =
    Core.object
      (Core.catMaybes [("regionCode" Core..=) Core.<$> regionCode])

-- | The version of the available regions being used for the specified resource.
--
-- /See:/ 'newRegionsVersion' smart constructor.
newtype RegionsVersion = RegionsVersion
  { -- | Required. A string representing the version of available regions being used for the specified resource. Regional prices for the resource have to be specified according to the information published in <https://support.google.com/googleplay/android-developer/answer/10532353 this article>. Each time the supported locations substantially change, the version will be incremented. Using this field will ensure that creating and updating the resource with an older region\'s version and set of regional prices and currencies will succeed even though a new version is available. The latest version is 2022\/02.
    version :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RegionsVersion' with the minimum fields required to make a request.
newRegionsVersion ::
  RegionsVersion
newRegionsVersion = RegionsVersion {version = Core.Nothing}

instance Core.FromJSON RegionsVersion where
  parseJSON =
    Core.withObject
      "RegionsVersion"
      (\o -> RegionsVersion Core.<$> (o Core..:? "version"))

instance Core.ToJSON RegionsVersion where
  toJSON RegionsVersion {..} =
    Core.object
      (Core.catMaybes [("version" Core..=) Core.<$> version])

-- | Object representation for Remote in-app update action type.
--
-- /See:/ 'newRemoteInAppUpdate' smart constructor.
newtype RemoteInAppUpdate = RemoteInAppUpdate
  { -- | Required. Set to true if Remote In-App Update action type is needed.
    isRemoteInAppUpdateRequested :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RemoteInAppUpdate' with the minimum fields required to make a request.
newRemoteInAppUpdate ::
  RemoteInAppUpdate
newRemoteInAppUpdate =
  RemoteInAppUpdate {isRemoteInAppUpdateRequested = Core.Nothing}

instance Core.FromJSON RemoteInAppUpdate where
  parseJSON =
    Core.withObject
      "RemoteInAppUpdate"
      ( \o ->
          RemoteInAppUpdate
            Core.<$> (o Core..:? "isRemoteInAppUpdateRequested")
      )

instance Core.ToJSON RemoteInAppUpdate where
  toJSON RemoteInAppUpdate {..} =
    Core.object
      ( Core.catMaybes
          [ ("isRemoteInAppUpdateRequested" Core..=)
              Core.<$> isRemoteInAppUpdateRequested
          ]
      )

-- | Data related to Remote In-App Update action such as recovered user count, affected user count etc.
--
-- /See:/ 'newRemoteInAppUpdateData' smart constructor.
newtype RemoteInAppUpdateData = RemoteInAppUpdateData
  { -- | Data related to the recovery action at bundle level.
    remoteAppUpdateDataPerBundle :: (Core.Maybe [RemoteInAppUpdateDataPerBundle])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RemoteInAppUpdateData' with the minimum fields required to make a request.
newRemoteInAppUpdateData ::
  RemoteInAppUpdateData
newRemoteInAppUpdateData =
  RemoteInAppUpdateData
    { remoteAppUpdateDataPerBundle =
        Core.Nothing
    }

instance Core.FromJSON RemoteInAppUpdateData where
  parseJSON =
    Core.withObject
      "RemoteInAppUpdateData"
      ( \o ->
          RemoteInAppUpdateData
            Core.<$> (o Core..:? "remoteAppUpdateDataPerBundle")
      )

instance Core.ToJSON RemoteInAppUpdateData where
  toJSON RemoteInAppUpdateData {..} =
    Core.object
      ( Core.catMaybes
          [ ("remoteAppUpdateDataPerBundle" Core..=)
              Core.<$> remoteAppUpdateDataPerBundle
          ]
      )

-- | Data related to the recovery action at bundle level.
--
-- /See:/ 'newRemoteInAppUpdateDataPerBundle' smart constructor.
data RemoteInAppUpdateDataPerBundle = RemoteInAppUpdateDataPerBundle
  { -- | Total number of devices which have been rescued.
    recoveredDeviceCount :: (Core.Maybe Core.Int64),
    -- | Total number of devices affected by this recovery action associated with bundle of the app.
    totalDeviceCount :: (Core.Maybe Core.Int64),
    -- | Version Code corresponding to the target bundle.
    versionCode :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RemoteInAppUpdateDataPerBundle' with the minimum fields required to make a request.
newRemoteInAppUpdateDataPerBundle ::
  RemoteInAppUpdateDataPerBundle
newRemoteInAppUpdateDataPerBundle =
  RemoteInAppUpdateDataPerBundle
    { recoveredDeviceCount =
        Core.Nothing,
      totalDeviceCount = Core.Nothing,
      versionCode = Core.Nothing
    }

instance Core.FromJSON RemoteInAppUpdateDataPerBundle where
  parseJSON =
    Core.withObject
      "RemoteInAppUpdateDataPerBundle"
      ( \o ->
          RemoteInAppUpdateDataPerBundle
            Core.<$> ( o
                         Core..:? "recoveredDeviceCount"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "totalDeviceCount" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "versionCode" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON RemoteInAppUpdateDataPerBundle where
  toJSON RemoteInAppUpdateDataPerBundle {..} =
    Core.object
      ( Core.catMaybes
          [ ("recoveredDeviceCount" Core..=)
              Core.. Core.AsText
              Core.<$> recoveredDeviceCount,
            ("totalDeviceCount" Core..=)
              Core.. Core.AsText
              Core.<$> totalDeviceCount,
            ("versionCode" Core..=) Core.. Core.AsText Core.<$> versionCode
          ]
      )

-- | Information specific to cancellations caused by subscription replacement.
--
-- /See:/ 'newReplacementCancellation' smart constructor.
data ReplacementCancellation = ReplacementCancellation
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReplacementCancellation' with the minimum fields required to make a request.
newReplacementCancellation ::
  ReplacementCancellation
newReplacementCancellation = ReplacementCancellation

instance Core.FromJSON ReplacementCancellation where
  parseJSON =
    Core.withObject
      "ReplacementCancellation"
      (\o -> Core.pure ReplacementCancellation)

instance Core.ToJSON ReplacementCancellation where
  toJSON = Core.const Core.emptyObject

-- | Countries where the purchase of this product is restricted to payment methods registered in the same country. If empty, no payment location restrictions are imposed.
--
-- /See:/ 'newRestrictedPaymentCountries' smart constructor.
newtype RestrictedPaymentCountries = RestrictedPaymentCountries
  { -- | Required. Region codes to impose payment restrictions on, as defined by ISO 3166-2, e.g. \"US\".
    regionCodes :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RestrictedPaymentCountries' with the minimum fields required to make a request.
newRestrictedPaymentCountries ::
  RestrictedPaymentCountries
newRestrictedPaymentCountries =
  RestrictedPaymentCountries {regionCodes = Core.Nothing}

instance Core.FromJSON RestrictedPaymentCountries where
  parseJSON =
    Core.withObject
      "RestrictedPaymentCountries"
      ( \o ->
          RestrictedPaymentCountries Core.<$> (o Core..:? "regionCodes")
      )

instance Core.ToJSON RestrictedPaymentCountries where
  toJSON RestrictedPaymentCountries {..} =
    Core.object
      (Core.catMaybes [("regionCodes" Core..=) Core.<$> regionCodes])

-- | An Android app review.
--
-- /See:/ 'newReview' smart constructor.
data Review = Review
  { -- | The name of the user who wrote the review.
    authorName :: (Core.Maybe Core.Text),
    -- | A repeated field containing comments for the review.
    comments :: (Core.Maybe [Comment]),
    -- | Unique identifier for this review.
    reviewId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Review' with the minimum fields required to make a request.
newReview ::
  Review
newReview =
  Review
    { authorName = Core.Nothing,
      comments = Core.Nothing,
      reviewId = Core.Nothing
    }

instance Core.FromJSON Review where
  parseJSON =
    Core.withObject
      "Review"
      ( \o ->
          Review
            Core.<$> (o Core..:? "authorName")
            Core.<*> (o Core..:? "comments")
            Core.<*> (o Core..:? "reviewId")
      )

instance Core.ToJSON Review where
  toJSON Review {..} =
    Core.object
      ( Core.catMaybes
          [ ("authorName" Core..=) Core.<$> authorName,
            ("comments" Core..=) Core.<$> comments,
            ("reviewId" Core..=) Core.<$> reviewId
          ]
      )

-- | The result of replying\/updating a reply to review.
--
-- /See:/ 'newReviewReplyResult' smart constructor.
data ReviewReplyResult = ReviewReplyResult
  { -- | The time at which the reply took effect.
    lastEdited :: (Core.Maybe Timestamp),
    -- | The reply text that was applied.
    replyText :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReviewReplyResult' with the minimum fields required to make a request.
newReviewReplyResult ::
  ReviewReplyResult
newReviewReplyResult =
  ReviewReplyResult
    { lastEdited = Core.Nothing,
      replyText = Core.Nothing
    }

instance Core.FromJSON ReviewReplyResult where
  parseJSON =
    Core.withObject
      "ReviewReplyResult"
      ( \o ->
          ReviewReplyResult
            Core.<$> (o Core..:? "lastEdited")
            Core.<*> (o Core..:? "replyText")
      )

instance Core.ToJSON ReviewReplyResult where
  toJSON ReviewReplyResult {..} =
    Core.object
      ( Core.catMaybes
          [ ("lastEdited" Core..=) Core.<$> lastEdited,
            ("replyText" Core..=) Core.<$> replyText
          ]
      )

-- | Response listing reviews.
--
-- /See:/ 'newReviewsListResponse' smart constructor.
data ReviewsListResponse = ReviewsListResponse
  { -- | Information about the current page.
    pageInfo :: (Core.Maybe PageInfo),
    -- | List of reviews.
    reviews :: (Core.Maybe [Review]),
    -- | Pagination token, to handle a number of products that is over one page.
    tokenPagination :: (Core.Maybe TokenPagination)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReviewsListResponse' with the minimum fields required to make a request.
newReviewsListResponse ::
  ReviewsListResponse
newReviewsListResponse =
  ReviewsListResponse
    { pageInfo = Core.Nothing,
      reviews = Core.Nothing,
      tokenPagination = Core.Nothing
    }

instance Core.FromJSON ReviewsListResponse where
  parseJSON =
    Core.withObject
      "ReviewsListResponse"
      ( \o ->
          ReviewsListResponse
            Core.<$> (o Core..:? "pageInfo")
            Core.<*> (o Core..:? "reviews")
            Core.<*> (o Core..:? "tokenPagination")
      )

instance Core.ToJSON ReviewsListResponse where
  toJSON ReviewsListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("pageInfo" Core..=) Core.<$> pageInfo,
            ("reviews" Core..=) Core.<$> reviews,
            ("tokenPagination" Core..=) Core.<$> tokenPagination
          ]
      )

-- | Request to reply to review or update existing reply.
--
-- /See:/ 'newReviewsReplyRequest' smart constructor.
newtype ReviewsReplyRequest = ReviewsReplyRequest
  { -- | The text to set as the reply. Replies of more than approximately 350 characters will be rejected. HTML tags will be stripped.
    replyText :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReviewsReplyRequest' with the minimum fields required to make a request.
newReviewsReplyRequest ::
  ReviewsReplyRequest
newReviewsReplyRequest =
  ReviewsReplyRequest {replyText = Core.Nothing}

instance Core.FromJSON ReviewsReplyRequest where
  parseJSON =
    Core.withObject
      "ReviewsReplyRequest"
      (\o -> ReviewsReplyRequest Core.<$> (o Core..:? "replyText"))

instance Core.ToJSON ReviewsReplyRequest where
  toJSON ReviewsReplyRequest {..} =
    Core.object
      (Core.catMaybes [("replyText" Core..=) Core.<$> replyText])

-- | Response on status of replying to a review.
--
-- /See:/ 'newReviewsReplyResponse' smart constructor.
newtype ReviewsReplyResponse = ReviewsReplyResponse
  { -- | The result of replying\/updating a reply to review.
    result :: (Core.Maybe ReviewReplyResult)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReviewsReplyResponse' with the minimum fields required to make a request.
newReviewsReplyResponse ::
  ReviewsReplyResponse
newReviewsReplyResponse =
  ReviewsReplyResponse {result = Core.Nothing}

instance Core.FromJSON ReviewsReplyResponse where
  parseJSON =
    Core.withObject
      "ReviewsReplyResponse"
      (\o -> ReviewsReplyResponse Core.<$> (o Core..:? "result"))

instance Core.ToJSON ReviewsReplyResponse where
  toJSON ReviewsReplyResponse {..} =
    Core.object (Core.catMaybes [("result" Core..=) Core.<$> result])

-- | Revocation context of the purchases.subscriptionsv2.revoke API.
--
-- /See:/ 'newRevocationContext' smart constructor.
data RevocationContext = RevocationContext
  { -- | Optional. Used when users should be refunded the full amount of the latest order of the subscription.
    fullRefund :: (Core.Maybe RevocationContextFullRefund),
    -- | Optional. Used when users should be refunded a prorated amount they paid for their subscription based on the amount of time remaining in a subscription.
    proratedRefund :: (Core.Maybe RevocationContextProratedRefund)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RevocationContext' with the minimum fields required to make a request.
newRevocationContext ::
  RevocationContext
newRevocationContext =
  RevocationContext
    { fullRefund = Core.Nothing,
      proratedRefund = Core.Nothing
    }

instance Core.FromJSON RevocationContext where
  parseJSON =
    Core.withObject
      "RevocationContext"
      ( \o ->
          RevocationContext
            Core.<$> (o Core..:? "fullRefund")
            Core.<*> (o Core..:? "proratedRefund")
      )

instance Core.ToJSON RevocationContext where
  toJSON RevocationContext {..} =
    Core.object
      ( Core.catMaybes
          [ ("fullRefund" Core..=) Core.<$> fullRefund,
            ("proratedRefund" Core..=) Core.<$> proratedRefund
          ]
      )

-- | Used to determine if the refund type in the RevocationContext is a full refund.
--
-- /See:/ 'newRevocationContextFullRefund' smart constructor.
data RevocationContextFullRefund = RevocationContextFullRefund
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RevocationContextFullRefund' with the minimum fields required to make a request.
newRevocationContextFullRefund ::
  RevocationContextFullRefund
newRevocationContextFullRefund = RevocationContextFullRefund

instance Core.FromJSON RevocationContextFullRefund where
  parseJSON =
    Core.withObject
      "RevocationContextFullRefund"
      (\o -> Core.pure RevocationContextFullRefund)

instance Core.ToJSON RevocationContextFullRefund where
  toJSON = Core.const Core.emptyObject

-- | Used to determine if the refund type in the RevocationContext is a prorated refund.
--
-- /See:/ 'newRevocationContextProratedRefund' smart constructor.
data RevocationContextProratedRefund = RevocationContextProratedRefund
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RevocationContextProratedRefund' with the minimum fields required to make a request.
newRevocationContextProratedRefund ::
  RevocationContextProratedRefund
newRevocationContextProratedRefund =
  RevocationContextProratedRefund

instance Core.FromJSON RevocationContextProratedRefund where
  parseJSON =
    Core.withObject
      "RevocationContextProratedRefund"
      (\o -> Core.pure RevocationContextProratedRefund)

instance Core.ToJSON RevocationContextProratedRefund where
  toJSON = Core.const Core.emptyObject

-- | Request for the purchases.subscriptionsv2.revoke API.
--
-- /See:/ 'newRevokeSubscriptionPurchaseRequest' smart constructor.
newtype RevokeSubscriptionPurchaseRequest = RevokeSubscriptionPurchaseRequest
  { -- | Required. Additional details around the subscription revocation.
    revocationContext :: (Core.Maybe RevocationContext)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RevokeSubscriptionPurchaseRequest' with the minimum fields required to make a request.
newRevokeSubscriptionPurchaseRequest ::
  RevokeSubscriptionPurchaseRequest
newRevokeSubscriptionPurchaseRequest =
  RevokeSubscriptionPurchaseRequest
    { revocationContext =
        Core.Nothing
    }

instance Core.FromJSON RevokeSubscriptionPurchaseRequest where
  parseJSON =
    Core.withObject
      "RevokeSubscriptionPurchaseRequest"
      ( \o ->
          RevokeSubscriptionPurchaseRequest
            Core.<$> (o Core..:? "revocationContext")
      )

instance Core.ToJSON RevokeSubscriptionPurchaseRequest where
  toJSON RevokeSubscriptionPurchaseRequest {..} =
    Core.object
      ( Core.catMaybes
          [("revocationContext" Core..=) Core.<$> revocationContext]
      )

-- | Response for the purchases.subscriptionsv2.revoke API.
--
-- /See:/ 'newRevokeSubscriptionPurchaseResponse' smart constructor.
data RevokeSubscriptionPurchaseResponse = RevokeSubscriptionPurchaseResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RevokeSubscriptionPurchaseResponse' with the minimum fields required to make a request.
newRevokeSubscriptionPurchaseResponse ::
  RevokeSubscriptionPurchaseResponse
newRevokeSubscriptionPurchaseResponse =
  RevokeSubscriptionPurchaseResponse

instance Core.FromJSON RevokeSubscriptionPurchaseResponse where
  parseJSON =
    Core.withObject
      "RevokeSubscriptionPurchaseResponse"
      (\o -> Core.pure RevokeSubscriptionPurchaseResponse)

instance Core.ToJSON RevokeSubscriptionPurchaseResponse where
  toJSON = Core.const Core.emptyObject

-- | Request to update Safety Labels of an app.
--
-- /See:/ 'newSafetyLabelsUpdateRequest' smart constructor.
newtype SafetyLabelsUpdateRequest = SafetyLabelsUpdateRequest
  { -- | Required. Contents of the CSV file containing Data Safety responses. For the format of this file, see the Help Center documentation at https:\/\/support.google.com\/googleplay\/android-developer\/answer\/10787469?#zippy=%2Cunderstand-the-csv-format To download an up to date template, follow the steps at https:\/\/support.google.com\/googleplay\/android-developer\/answer\/10787469?#zippy=%2Cexport-to-a-csv-file
    safetyLabels :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SafetyLabelsUpdateRequest' with the minimum fields required to make a request.
newSafetyLabelsUpdateRequest ::
  SafetyLabelsUpdateRequest
newSafetyLabelsUpdateRequest =
  SafetyLabelsUpdateRequest {safetyLabels = Core.Nothing}

instance Core.FromJSON SafetyLabelsUpdateRequest where
  parseJSON =
    Core.withObject
      "SafetyLabelsUpdateRequest"
      ( \o ->
          SafetyLabelsUpdateRequest Core.<$> (o Core..:? "safetyLabels")
      )

instance Core.ToJSON SafetyLabelsUpdateRequest where
  toJSON SafetyLabelsUpdateRequest {..} =
    Core.object
      (Core.catMaybes [("safetyLabels" Core..=) Core.<$> safetyLabels])

-- | Response for SafetyLabelsUpdate rpc.
--
-- /See:/ 'newSafetyLabelsUpdateResponse' smart constructor.
data SafetyLabelsUpdateResponse = SafetyLabelsUpdateResponse
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SafetyLabelsUpdateResponse' with the minimum fields required to make a request.
newSafetyLabelsUpdateResponse ::
  SafetyLabelsUpdateResponse
newSafetyLabelsUpdateResponse = SafetyLabelsUpdateResponse

instance Core.FromJSON SafetyLabelsUpdateResponse where
  parseJSON =
    Core.withObject
      "SafetyLabelsUpdateResponse"
      (\o -> Core.pure SafetyLabelsUpdateResponse)

instance Core.ToJSON SafetyLabelsUpdateResponse where
  toJSON = Core.const Core.emptyObject

-- | Represents a screen density.
--
-- /See:/ 'newScreenDensity' smart constructor.
data ScreenDensity = ScreenDensity
  { -- | Alias for a screen density.
    densityAlias :: (Core.Maybe ScreenDensity_DensityAlias),
    -- | Value for density dpi.
    densityDpi :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ScreenDensity' with the minimum fields required to make a request.
newScreenDensity ::
  ScreenDensity
newScreenDensity =
  ScreenDensity
    { densityAlias = Core.Nothing,
      densityDpi = Core.Nothing
    }

instance Core.FromJSON ScreenDensity where
  parseJSON =
    Core.withObject
      "ScreenDensity"
      ( \o ->
          ScreenDensity
            Core.<$> (o Core..:? "densityAlias")
            Core.<*> (o Core..:? "densityDpi")
      )

instance Core.ToJSON ScreenDensity where
  toJSON ScreenDensity {..} =
    Core.object
      ( Core.catMaybes
          [ ("densityAlias" Core..=) Core.<$> densityAlias,
            ("densityDpi" Core..=) Core.<$> densityDpi
          ]
      )

-- | Targeting based on screen density.
--
-- /See:/ 'newScreenDensityTargeting' smart constructor.
data ScreenDensityTargeting = ScreenDensityTargeting
  { -- | Targeting of other sibling directories that were in the Bundle. For main splits this is targeting of other main splits.
    alternatives :: (Core.Maybe [ScreenDensity]),
    -- | Value of a screen density.
    value :: (Core.Maybe [ScreenDensity])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ScreenDensityTargeting' with the minimum fields required to make a request.
newScreenDensityTargeting ::
  ScreenDensityTargeting
newScreenDensityTargeting =
  ScreenDensityTargeting
    { alternatives = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON ScreenDensityTargeting where
  parseJSON =
    Core.withObject
      "ScreenDensityTargeting"
      ( \o ->
          ScreenDensityTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON ScreenDensityTargeting where
  toJSON ScreenDensityTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | Represents an sdk version.
--
-- /See:/ 'newSdkVersion' smart constructor.
newtype SdkVersion = SdkVersion
  { -- | Inclusive minimum value of an sdk version.
    min :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SdkVersion' with the minimum fields required to make a request.
newSdkVersion ::
  SdkVersion
newSdkVersion = SdkVersion {min = Core.Nothing}

instance Core.FromJSON SdkVersion where
  parseJSON =
    Core.withObject
      "SdkVersion"
      (\o -> SdkVersion Core.<$> (o Core..:? "min"))

instance Core.ToJSON SdkVersion where
  toJSON SdkVersion {..} =
    Core.object (Core.catMaybes [("min" Core..=) Core.<$> min])

-- | Targeting based on sdk version.
--
-- /See:/ 'newSdkVersionTargeting' smart constructor.
data SdkVersionTargeting = SdkVersionTargeting
  { -- | Targeting of other sibling directories that were in the Bundle. For main splits this is targeting of other main splits.
    alternatives :: (Core.Maybe [SdkVersion]),
    -- | Value of an sdk version.
    value :: (Core.Maybe [SdkVersion])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SdkVersionTargeting' with the minimum fields required to make a request.
newSdkVersionTargeting ::
  SdkVersionTargeting
newSdkVersionTargeting =
  SdkVersionTargeting
    { alternatives = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON SdkVersionTargeting where
  parseJSON =
    Core.withObject
      "SdkVersionTargeting"
      ( \o ->
          SdkVersionTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON SdkVersionTargeting where
  toJSON SdkVersionTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | The promotion applied on this item when purchased.
--
-- /See:/ 'newSignupPromotion' smart constructor.
data SignupPromotion = SignupPromotion
  { -- | A one-time code was applied.
    oneTimeCode :: (Core.Maybe OneTimeCode),
    -- | A vanity code was applied.
    vanityCode :: (Core.Maybe VanityCode)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SignupPromotion' with the minimum fields required to make a request.
newSignupPromotion ::
  SignupPromotion
newSignupPromotion =
  SignupPromotion
    { oneTimeCode = Core.Nothing,
      vanityCode = Core.Nothing
    }

instance Core.FromJSON SignupPromotion where
  parseJSON =
    Core.withObject
      "SignupPromotion"
      ( \o ->
          SignupPromotion
            Core.<$> (o Core..:? "oneTimeCode")
            Core.<*> (o Core..:? "vanityCode")
      )

instance Core.ToJSON SignupPromotion where
  toJSON SignupPromotion {..} =
    Core.object
      ( Core.catMaybes
          [ ("oneTimeCode" Core..=) Core.<$> oneTimeCode,
            ("vanityCode" Core..=) Core.<$> vanityCode
          ]
      )

-- | Holds data specific to Split APKs.
--
-- /See:/ 'newSplitApkMetadata' smart constructor.
data SplitApkMetadata = SplitApkMetadata
  { -- | Indicates whether this APK is the main split of the module.
    isMasterSplit :: (Core.Maybe Core.Bool),
    -- | Id of the split.
    splitId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SplitApkMetadata' with the minimum fields required to make a request.
newSplitApkMetadata ::
  SplitApkMetadata
newSplitApkMetadata =
  SplitApkMetadata
    { isMasterSplit = Core.Nothing,
      splitId = Core.Nothing
    }

instance Core.FromJSON SplitApkMetadata where
  parseJSON =
    Core.withObject
      "SplitApkMetadata"
      ( \o ->
          SplitApkMetadata
            Core.<$> (o Core..:? "isMasterSplit")
            Core.<*> (o Core..:? "splitId")
      )

instance Core.ToJSON SplitApkMetadata where
  toJSON SplitApkMetadata {..} =
    Core.object
      ( Core.catMaybes
          [ ("isMasterSplit" Core..=) Core.<$> isMasterSplit,
            ("splitId" Core..=) Core.<$> splitId
          ]
      )

-- | Variant is a group of APKs that covers a part of the device configuration space. APKs from multiple variants are never combined on one device.
--
-- /See:/ 'newSplitApkVariant' smart constructor.
data SplitApkVariant = SplitApkVariant
  { -- | Set of APKs, one set per module.
    apkSet :: (Core.Maybe [ApkSet]),
    -- | Variant-level targeting.
    targeting :: (Core.Maybe VariantTargeting),
    -- | Number of the variant, starting at 0 (unless overridden). A device will receive APKs from the first variant that matches the device configuration, with higher variant numbers having priority over lower variant numbers.
    variantNumber :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SplitApkVariant' with the minimum fields required to make a request.
newSplitApkVariant ::
  SplitApkVariant
newSplitApkVariant =
  SplitApkVariant
    { apkSet = Core.Nothing,
      targeting = Core.Nothing,
      variantNumber = Core.Nothing
    }

instance Core.FromJSON SplitApkVariant where
  parseJSON =
    Core.withObject
      "SplitApkVariant"
      ( \o ->
          SplitApkVariant
            Core.<$> (o Core..:? "apkSet")
            Core.<*> (o Core..:? "targeting")
            Core.<*> (o Core..:? "variantNumber")
      )

instance Core.ToJSON SplitApkVariant where
  toJSON SplitApkVariant {..} =
    Core.object
      ( Core.catMaybes
          [ ("apkSet" Core..=) Core.<$> apkSet,
            ("targeting" Core..=) Core.<$> targeting,
            ("variantNumber" Core..=) Core.<$> variantNumber
          ]
      )

-- | Holds data specific to Standalone APKs.
--
-- /See:/ 'newStandaloneApkMetadata' smart constructor.
newtype StandaloneApkMetadata = StandaloneApkMetadata
  { -- | Names of the modules fused in this standalone APK.
    fusedModuleName :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'StandaloneApkMetadata' with the minimum fields required to make a request.
newStandaloneApkMetadata ::
  StandaloneApkMetadata
newStandaloneApkMetadata =
  StandaloneApkMetadata {fusedModuleName = Core.Nothing}

instance Core.FromJSON StandaloneApkMetadata where
  parseJSON =
    Core.withObject
      "StandaloneApkMetadata"
      ( \o ->
          StandaloneApkMetadata Core.<$> (o Core..:? "fusedModuleName")
      )

instance Core.ToJSON StandaloneApkMetadata where
  toJSON StandaloneApkMetadata {..} =
    Core.object
      ( Core.catMaybes
          [("fusedModuleName" Core..=) Core.<$> fusedModuleName]
      )

-- | Information associated with purchases made with \'Subscribe with Google\'.
--
-- /See:/ 'newSubscribeWithGoogleInfo' smart constructor.
data SubscribeWithGoogleInfo = SubscribeWithGoogleInfo
  { -- | The email address of the user when the subscription was purchased.
    emailAddress :: (Core.Maybe Core.Text),
    -- | The family name of the user when the subscription was purchased.
    familyName :: (Core.Maybe Core.Text),
    -- | The given name of the user when the subscription was purchased.
    givenName :: (Core.Maybe Core.Text),
    -- | The Google profile id of the user when the subscription was purchased.
    profileId :: (Core.Maybe Core.Text),
    -- | The profile name of the user when the subscription was purchased.
    profileName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscribeWithGoogleInfo' with the minimum fields required to make a request.
newSubscribeWithGoogleInfo ::
  SubscribeWithGoogleInfo
newSubscribeWithGoogleInfo =
  SubscribeWithGoogleInfo
    { emailAddress = Core.Nothing,
      familyName = Core.Nothing,
      givenName = Core.Nothing,
      profileId = Core.Nothing,
      profileName = Core.Nothing
    }

instance Core.FromJSON SubscribeWithGoogleInfo where
  parseJSON =
    Core.withObject
      "SubscribeWithGoogleInfo"
      ( \o ->
          SubscribeWithGoogleInfo
            Core.<$> (o Core..:? "emailAddress")
            Core.<*> (o Core..:? "familyName")
            Core.<*> (o Core..:? "givenName")
            Core.<*> (o Core..:? "profileId")
            Core.<*> (o Core..:? "profileName")
      )

instance Core.ToJSON SubscribeWithGoogleInfo where
  toJSON SubscribeWithGoogleInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("emailAddress" Core..=) Core.<$> emailAddress,
            ("familyName" Core..=) Core.<$> familyName,
            ("givenName" Core..=) Core.<$> givenName,
            ("profileId" Core..=) Core.<$> profileId,
            ("profileName" Core..=) Core.<$> profileName
          ]
      )

-- | A single subscription for an app.
--
-- /See:/ 'newSubscription' smart constructor.
data Subscription = Subscription
  { -- | Output only. Deprecated: subscription archiving is not supported.
    archived :: (Core.Maybe Core.Bool),
    -- | The set of base plans for this subscription. Represents the prices and duration of the subscription if no other offers apply.
    basePlans :: (Core.Maybe [BasePlan]),
    -- | Required. List of localized listings for this subscription. Must contain at least an entry for the default language of the parent app.
    listings :: (Core.Maybe [SubscriptionListing]),
    -- | Immutable. Package name of the parent app.
    packageName :: (Core.Maybe Core.Text),
    -- | Immutable. Unique product ID of the product. Unique within the parent app. Product IDs must be composed of lower-case letters (a-z), numbers (0-9), underscores (_) and dots (.). It must start with a lower-case letter or number, and be between 1 and 40 (inclusive) characters in length.
    productId :: (Core.Maybe Core.Text),
    -- | Optional. Countries where the purchase of this subscription is restricted to payment methods registered in the same country. If empty, no payment location restrictions are imposed.
    restrictedPaymentCountries :: (Core.Maybe RestrictedPaymentCountries),
    -- | Details about taxes and legal compliance.
    taxAndComplianceSettings :: (Core.Maybe SubscriptionTaxAndComplianceSettings)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Subscription' with the minimum fields required to make a request.
newSubscription ::
  Subscription
newSubscription =
  Subscription
    { archived = Core.Nothing,
      basePlans = Core.Nothing,
      listings = Core.Nothing,
      packageName = Core.Nothing,
      productId = Core.Nothing,
      restrictedPaymentCountries = Core.Nothing,
      taxAndComplianceSettings = Core.Nothing
    }

instance Core.FromJSON Subscription where
  parseJSON =
    Core.withObject
      "Subscription"
      ( \o ->
          Subscription
            Core.<$> (o Core..:? "archived")
            Core.<*> (o Core..:? "basePlans")
            Core.<*> (o Core..:? "listings")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "productId")
            Core.<*> (o Core..:? "restrictedPaymentCountries")
            Core.<*> (o Core..:? "taxAndComplianceSettings")
      )

instance Core.ToJSON Subscription where
  toJSON Subscription {..} =
    Core.object
      ( Core.catMaybes
          [ ("archived" Core..=) Core.<$> archived,
            ("basePlans" Core..=) Core.<$> basePlans,
            ("listings" Core..=) Core.<$> listings,
            ("packageName" Core..=) Core.<$> packageName,
            ("productId" Core..=) Core.<$> productId,
            ("restrictedPaymentCountries" Core..=)
              Core.<$> restrictedPaymentCountries,
            ("taxAndComplianceSettings" Core..=)
              Core.<$> taxAndComplianceSettings
          ]
      )

-- | Information provided by the user when they complete the subscription cancellation flow (cancellation reason survey).
--
-- /See:/ 'newSubscriptionCancelSurveyResult' smart constructor.
data SubscriptionCancelSurveyResult = SubscriptionCancelSurveyResult
  { -- | The cancellation reason the user chose in the survey. Possible values are: 0. Other 1. I don\'t use this service enough 2. Technical issues 3. Cost-related reasons 4. I found a better app
    cancelSurveyReason :: (Core.Maybe Core.Int32),
    -- | The customized input cancel reason from the user. Only present when cancelReason is 0.
    userInputCancelReason :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionCancelSurveyResult' with the minimum fields required to make a request.
newSubscriptionCancelSurveyResult ::
  SubscriptionCancelSurveyResult
newSubscriptionCancelSurveyResult =
  SubscriptionCancelSurveyResult
    { cancelSurveyReason = Core.Nothing,
      userInputCancelReason = Core.Nothing
    }

instance Core.FromJSON SubscriptionCancelSurveyResult where
  parseJSON =
    Core.withObject
      "SubscriptionCancelSurveyResult"
      ( \o ->
          SubscriptionCancelSurveyResult
            Core.<$> (o Core..:? "cancelSurveyReason")
            Core.<*> (o Core..:? "userInputCancelReason")
      )

instance Core.ToJSON SubscriptionCancelSurveyResult where
  toJSON SubscriptionCancelSurveyResult {..} =
    Core.object
      ( Core.catMaybes
          [ ("cancelSurveyReason" Core..=) Core.<$> cancelSurveyReason,
            ("userInputCancelReason" Core..=) Core.<$> userInputCancelReason
          ]
      )

-- | A SubscriptionDeferralInfo contains the data needed to defer a subscription purchase to a future expiry time.
--
-- /See:/ 'newSubscriptionDeferralInfo' smart constructor.
data SubscriptionDeferralInfo = SubscriptionDeferralInfo
  { -- | The desired next expiry time to assign to the subscription, in milliseconds since the Epoch. The given time must be later\/greater than the current expiry time for the subscription.
    desiredExpiryTimeMillis :: (Core.Maybe Core.Int64),
    -- | The expected expiry time for the subscription. If the current expiry time for the subscription is not the value specified here, the deferral will not occur.
    expectedExpiryTimeMillis :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionDeferralInfo' with the minimum fields required to make a request.
newSubscriptionDeferralInfo ::
  SubscriptionDeferralInfo
newSubscriptionDeferralInfo =
  SubscriptionDeferralInfo
    { desiredExpiryTimeMillis = Core.Nothing,
      expectedExpiryTimeMillis = Core.Nothing
    }

instance Core.FromJSON SubscriptionDeferralInfo where
  parseJSON =
    Core.withObject
      "SubscriptionDeferralInfo"
      ( \o ->
          SubscriptionDeferralInfo
            Core.<$> ( o
                         Core..:? "desiredExpiryTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> ( o
                         Core..:? "expectedExpiryTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
      )

instance Core.ToJSON SubscriptionDeferralInfo where
  toJSON SubscriptionDeferralInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("desiredExpiryTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> desiredExpiryTimeMillis,
            ("expectedExpiryTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> expectedExpiryTimeMillis
          ]
      )

-- | Price change related information of a subscription item.
--
-- /See:/ 'newSubscriptionItemPriceChangeDetails' smart constructor.
data SubscriptionItemPriceChangeDetails = SubscriptionItemPriceChangeDetails
  { -- | The renewal time at which the price change will become effective for the user. This is subject to change(to a future time) due to cases where the renewal time shifts like pause. This field is only populated if the price change has not taken effect.
    expectedNewPriceChargeTime :: (Core.Maybe Core.DateTime),
    -- | New recurring price for the subscription item.
    newPrice' :: (Core.Maybe Money),
    -- | Price change mode specifies how the subscription item price is changing.
    priceChangeMode :: (Core.Maybe SubscriptionItemPriceChangeDetails_PriceChangeMode),
    -- | State the price change is currently in.
    priceChangeState :: (Core.Maybe SubscriptionItemPriceChangeDetails_PriceChangeState)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionItemPriceChangeDetails' with the minimum fields required to make a request.
newSubscriptionItemPriceChangeDetails ::
  SubscriptionItemPriceChangeDetails
newSubscriptionItemPriceChangeDetails =
  SubscriptionItemPriceChangeDetails
    { expectedNewPriceChargeTime =
        Core.Nothing,
      newPrice' = Core.Nothing,
      priceChangeMode = Core.Nothing,
      priceChangeState = Core.Nothing
    }

instance Core.FromJSON SubscriptionItemPriceChangeDetails where
  parseJSON =
    Core.withObject
      "SubscriptionItemPriceChangeDetails"
      ( \o ->
          SubscriptionItemPriceChangeDetails
            Core.<$> (o Core..:? "expectedNewPriceChargeTime")
            Core.<*> (o Core..:? "newPrice")
            Core.<*> (o Core..:? "priceChangeMode")
            Core.<*> (o Core..:? "priceChangeState")
      )

instance Core.ToJSON SubscriptionItemPriceChangeDetails where
  toJSON SubscriptionItemPriceChangeDetails {..} =
    Core.object
      ( Core.catMaybes
          [ ("expectedNewPriceChargeTime" Core..=)
              Core.<$> expectedNewPriceChargeTime,
            ("newPrice" Core..=) Core.<$> newPrice',
            ("priceChangeMode" Core..=) Core.<$> priceChangeMode,
            ("priceChangeState" Core..=) Core.<$> priceChangeState
          ]
      )

-- | The consumer-visible metadata of a subscription.
--
-- /See:/ 'newSubscriptionListing' smart constructor.
data SubscriptionListing = SubscriptionListing
  { -- | A list of benefits shown to the user on platforms such as the Play Store and in restoration flows in the language of this listing. Plain text. Ordered list of at most four benefits.
    benefits :: (Core.Maybe [Core.Text]),
    -- | The description of this subscription in the language of this listing. Maximum length - 80 characters. Plain text.
    description :: (Core.Maybe Core.Text),
    -- | Required. The language of this listing, as defined by BCP-47, e.g. \"en-US\".
    languageCode :: (Core.Maybe Core.Text),
    -- | Required. The title of this subscription in the language of this listing. Plain text.
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionListing' with the minimum fields required to make a request.
newSubscriptionListing ::
  SubscriptionListing
newSubscriptionListing =
  SubscriptionListing
    { benefits = Core.Nothing,
      description = Core.Nothing,
      languageCode = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON SubscriptionListing where
  parseJSON =
    Core.withObject
      "SubscriptionListing"
      ( \o ->
          SubscriptionListing
            Core.<$> (o Core..:? "benefits")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "languageCode")
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON SubscriptionListing where
  toJSON SubscriptionListing {..} =
    Core.object
      ( Core.catMaybes
          [ ("benefits" Core..=) Core.<$> benefits,
            ("description" Core..=) Core.<$> description,
            ("languageCode" Core..=) Core.<$> languageCode,
            ("title" Core..=) Core.<$> title
          ]
      )

-- | A single, temporary offer
--
-- /See:/ 'newSubscriptionOffer' smart constructor.
data SubscriptionOffer = SubscriptionOffer
  { -- | Required. Immutable. The ID of the base plan to which this offer is an extension.
    basePlanId :: (Core.Maybe Core.Text),
    -- | Required. Immutable. Unique ID of this subscription offer. Must be unique within the base plan.
    offerId :: (Core.Maybe Core.Text),
    -- | List of up to 20 custom tags specified for this offer, and returned to the app through the billing library.
    offerTags :: (Core.Maybe [OfferTag]),
    -- | The configuration for any new locations Play may launch in the future.
    otherRegionsConfig :: (Core.Maybe OtherRegionsSubscriptionOfferConfig),
    -- | Required. Immutable. The package name of the app the parent subscription belongs to.
    packageName :: (Core.Maybe Core.Text),
    -- | Required. The phases of this subscription offer. Must contain at least one and at most two entries. Users will always receive all these phases in the specified order.
    phases :: (Core.Maybe [SubscriptionOfferPhase]),
    -- | Required. Immutable. The ID of the parent subscription this offer belongs to.
    productId :: (Core.Maybe Core.Text),
    -- | Required. The region-specific configuration of this offer. Must contain at least one entry.
    regionalConfigs :: (Core.Maybe [RegionalSubscriptionOfferConfig]),
    -- | Output only. The current state of this offer. Can be changed using Activate and Deactivate actions. NB: the base plan state supersedes this state, so an active offer may not be available if the base plan is not active.
    state :: (Core.Maybe SubscriptionOffer_State),
    -- | The requirements that users need to fulfil to be eligible for this offer. Represents the requirements that Play will evaluate to decide whether an offer should be returned. Developers may further filter these offers themselves.
    targeting :: (Core.Maybe SubscriptionOfferTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionOffer' with the minimum fields required to make a request.
newSubscriptionOffer ::
  SubscriptionOffer
newSubscriptionOffer =
  SubscriptionOffer
    { basePlanId = Core.Nothing,
      offerId = Core.Nothing,
      offerTags = Core.Nothing,
      otherRegionsConfig = Core.Nothing,
      packageName = Core.Nothing,
      phases = Core.Nothing,
      productId = Core.Nothing,
      regionalConfigs = Core.Nothing,
      state = Core.Nothing,
      targeting = Core.Nothing
    }

instance Core.FromJSON SubscriptionOffer where
  parseJSON =
    Core.withObject
      "SubscriptionOffer"
      ( \o ->
          SubscriptionOffer
            Core.<$> (o Core..:? "basePlanId")
            Core.<*> (o Core..:? "offerId")
            Core.<*> (o Core..:? "offerTags")
            Core.<*> (o Core..:? "otherRegionsConfig")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "phases")
            Core.<*> (o Core..:? "productId")
            Core.<*> (o Core..:? "regionalConfigs")
            Core.<*> (o Core..:? "state")
            Core.<*> (o Core..:? "targeting")
      )

instance Core.ToJSON SubscriptionOffer where
  toJSON SubscriptionOffer {..} =
    Core.object
      ( Core.catMaybes
          [ ("basePlanId" Core..=) Core.<$> basePlanId,
            ("offerId" Core..=) Core.<$> offerId,
            ("offerTags" Core..=) Core.<$> offerTags,
            ("otherRegionsConfig" Core..=) Core.<$> otherRegionsConfig,
            ("packageName" Core..=) Core.<$> packageName,
            ("phases" Core..=) Core.<$> phases,
            ("productId" Core..=) Core.<$> productId,
            ("regionalConfigs" Core..=) Core.<$> regionalConfigs,
            ("state" Core..=) Core.<$> state,
            ("targeting" Core..=) Core.<$> targeting
          ]
      )

-- | A single phase of a subscription offer.
--
-- /See:/ 'newSubscriptionOfferPhase' smart constructor.
data SubscriptionOfferPhase = SubscriptionOfferPhase
  { -- | Required. The duration of a single recurrence of this phase. Specified in ISO 8601 format.
    duration :: (Core.Maybe Core.Text),
    -- | Pricing information for any new locations Play may launch in.
    otherRegionsConfig :: (Core.Maybe OtherRegionsSubscriptionOfferPhaseConfig),
    -- | Required. The number of times this phase repeats. If this offer phase is not free, each recurrence charges the user the price of this offer phase.
    recurrenceCount :: (Core.Maybe Core.Int32),
    -- | Required. The region-specific configuration of this offer phase. This list must contain exactly one entry for each region for which the subscription offer has a regional config.
    regionalConfigs :: (Core.Maybe [RegionalSubscriptionOfferPhaseConfig])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionOfferPhase' with the minimum fields required to make a request.
newSubscriptionOfferPhase ::
  SubscriptionOfferPhase
newSubscriptionOfferPhase =
  SubscriptionOfferPhase
    { duration = Core.Nothing,
      otherRegionsConfig = Core.Nothing,
      recurrenceCount = Core.Nothing,
      regionalConfigs = Core.Nothing
    }

instance Core.FromJSON SubscriptionOfferPhase where
  parseJSON =
    Core.withObject
      "SubscriptionOfferPhase"
      ( \o ->
          SubscriptionOfferPhase
            Core.<$> (o Core..:? "duration")
            Core.<*> (o Core..:? "otherRegionsConfig")
            Core.<*> (o Core..:? "recurrenceCount")
            Core.<*> (o Core..:? "regionalConfigs")
      )

instance Core.ToJSON SubscriptionOfferPhase where
  toJSON SubscriptionOfferPhase {..} =
    Core.object
      ( Core.catMaybes
          [ ("duration" Core..=) Core.<$> duration,
            ("otherRegionsConfig" Core..=) Core.<$> otherRegionsConfig,
            ("recurrenceCount" Core..=) Core.<$> recurrenceCount,
            ("regionalConfigs" Core..=) Core.<$> regionalConfigs
          ]
      )

-- | Defines the rule a user needs to satisfy to receive this offer.
--
-- /See:/ 'newSubscriptionOfferTargeting' smart constructor.
data SubscriptionOfferTargeting = SubscriptionOfferTargeting
  { -- | Offer targeting rule for new user acquisition.
    acquisitionRule :: (Core.Maybe AcquisitionTargetingRule),
    -- | Offer targeting rule for upgrading users\' existing plans.
    upgradeRule :: (Core.Maybe UpgradeTargetingRule)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionOfferTargeting' with the minimum fields required to make a request.
newSubscriptionOfferTargeting ::
  SubscriptionOfferTargeting
newSubscriptionOfferTargeting =
  SubscriptionOfferTargeting
    { acquisitionRule = Core.Nothing,
      upgradeRule = Core.Nothing
    }

instance Core.FromJSON SubscriptionOfferTargeting where
  parseJSON =
    Core.withObject
      "SubscriptionOfferTargeting"
      ( \o ->
          SubscriptionOfferTargeting
            Core.<$> (o Core..:? "acquisitionRule")
            Core.<*> (o Core..:? "upgradeRule")
      )

instance Core.ToJSON SubscriptionOfferTargeting where
  toJSON SubscriptionOfferTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("acquisitionRule" Core..=) Core.<$> acquisitionRule,
            ("upgradeRule" Core..=) Core.<$> upgradeRule
          ]
      )

-- | Contains the price change information for a subscription that can be used to control the user journey for the price change in the app. This can be in the form of seeking confirmation from the user or tailoring the experience for a successful conversion.
--
-- /See:/ 'newSubscriptionPriceChange' smart constructor.
data SubscriptionPriceChange = SubscriptionPriceChange
  { -- | The new price the subscription will renew with if the price change is accepted by the user.
    newPrice' :: (Core.Maybe Price),
    -- | The current state of the price change. Possible values are: 0. Outstanding: State for a pending price change waiting for the user to agree. In this state, you can optionally seek confirmation from the user using the In-App API. 1. Accepted: State for an accepted price change that the subscription will renew with unless it\'s canceled. The price change takes effect on a future date when the subscription renews. Note that the change might not occur when the subscription is renewed next.
    state :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPriceChange' with the minimum fields required to make a request.
newSubscriptionPriceChange ::
  SubscriptionPriceChange
newSubscriptionPriceChange =
  SubscriptionPriceChange
    { newPrice' = Core.Nothing,
      state = Core.Nothing
    }

instance Core.FromJSON SubscriptionPriceChange where
  parseJSON =
    Core.withObject
      "SubscriptionPriceChange"
      ( \o ->
          SubscriptionPriceChange
            Core.<$> (o Core..:? "newPrice")
            Core.<*> (o Core..:? "state")
      )

instance Core.ToJSON SubscriptionPriceChange where
  toJSON SubscriptionPriceChange {..} =
    Core.object
      ( Core.catMaybes
          [ ("newPrice" Core..=) Core.<$> newPrice',
            ("state" Core..=) Core.<$> state
          ]
      )

-- | A SubscriptionPurchase resource indicates the status of a user\'s subscription purchase.
--
-- /See:/ 'newSubscriptionPurchase' smart constructor.
data SubscriptionPurchase = SubscriptionPurchase
  { -- | The acknowledgement state of the subscription product. Possible values are: 0. Yet to be acknowledged 1. Acknowledged
    acknowledgementState :: (Core.Maybe Core.Int32),
    -- | Whether the subscription will automatically be renewed when it reaches its current expiry time.
    autoRenewing :: (Core.Maybe Core.Bool),
    -- | Time at which the subscription will be automatically resumed, in milliseconds since the Epoch. Only present if the user has requested to pause the subscription.
    autoResumeTimeMillis :: (Core.Maybe Core.Int64),
    -- | The reason why a subscription was canceled or is not auto-renewing. Possible values are: 0. User canceled the subscription 1. Subscription was canceled by the system, for example because of a billing problem 2. Subscription was replaced with a new subscription 3. Subscription was canceled by the developer
    cancelReason :: (Core.Maybe Core.Int32),
    -- | Information provided by the user when they complete the subscription cancellation flow (cancellation reason survey).
    cancelSurveyResult :: (Core.Maybe SubscriptionCancelSurveyResult),
    -- | ISO 3166-1 alpha-2 billing country\/region code of the user at the time the subscription was granted.
    countryCode :: (Core.Maybe Core.Text),
    -- | A developer-specified string that contains supplemental information about an order.
    developerPayload :: (Core.Maybe Core.Text),
    -- | The email address of the user when the subscription was purchased. Only present for purchases made with \'Subscribe with Google\'.
    emailAddress :: (Core.Maybe Core.Text),
    -- | Time at which the subscription will expire, in milliseconds since the Epoch.
    expiryTimeMillis :: (Core.Maybe Core.Int64),
    -- | User account identifier in the third-party service. Only present if account linking happened as part of the subscription purchase flow.
    externalAccountId :: (Core.Maybe Core.Text),
    -- | The family name of the user when the subscription was purchased. Only present for purchases made with \'Subscribe with Google\'.
    familyName :: (Core.Maybe Core.Text),
    -- | The given name of the user when the subscription was purchased. Only present for purchases made with \'Subscribe with Google\'.
    givenName :: (Core.Maybe Core.Text),
    -- | Introductory price information of the subscription. This is only present when the subscription was purchased with an introductory price. This field does not indicate the subscription is currently in introductory price period.
    introductoryPriceInfo :: (Core.Maybe IntroductoryPriceInfo),
    -- | This kind represents a subscriptionPurchase object in the androidpublisher service.
    kind :: (Core.Maybe Core.Text),
    -- | The purchase token of the originating purchase if this subscription is one of the following: 0. Re-signup of a canceled but non-lapsed subscription 1. Upgrade\/downgrade from a previous subscription For example, suppose a user originally signs up and you receive purchase token X, then the user cancels and goes through the resignup flow (before their subscription lapses) and you receive purchase token Y, and finally the user upgrades their subscription and you receive purchase token Z. If you call this API with purchase token Z, this field will be set to Y. If you call this API with purchase token Y, this field will be set to X. If you call this API with purchase token X, this field will not be set.
    linkedPurchaseToken :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s account in your app. Present for the following purchases: * If account linking happened as part of the subscription purchase flow. * It was specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedaccountid when the purchase was made.
    obfuscatedExternalAccountId :: (Core.Maybe Core.Text),
    -- | An obfuscated version of the id that is uniquely associated with the user\'s profile in your app. Only present if specified using https:\/\/developer.android.com\/reference\/com\/android\/billingclient\/api\/BillingFlowParams.Builder#setobfuscatedprofileid when the purchase was made.
    obfuscatedExternalProfileId :: (Core.Maybe Core.Text),
    -- | The order id of the latest recurring order associated with the purchase of the subscription. If the subscription was canceled because payment was declined, this will be the order id from the payment declined order.
    orderId :: (Core.Maybe Core.Text),
    -- | The payment state of the subscription. Possible values are: 0. Payment pending 1. Payment received 2. Free trial 3. Pending deferred upgrade\/downgrade Not present for canceled, expired subscriptions.
    paymentState :: (Core.Maybe Core.Int32),
    -- | Price of the subscription, For tax exclusive countries, the price doesn\'t include tax. For tax inclusive countries, the price includes tax. Price is expressed in micro-units, where 1,000,000 micro-units represents one unit of the currency. For example, if the subscription price is €1.99, price/amount/micros is 1990000.
    priceAmountMicros :: (Core.Maybe Core.Int64),
    -- | The latest price change information available. This is present only when there is an upcoming price change for the subscription yet to be applied. Once the subscription renews with the new price or the subscription is canceled, no price change information will be returned.
    priceChange :: (Core.Maybe SubscriptionPriceChange),
    -- | ISO 4217 currency code for the subscription price. For example, if the price is specified in British pounds sterling, price/currency/code is \"GBP\".
    priceCurrencyCode :: (Core.Maybe Core.Text),
    -- | The Google profile id of the user when the subscription was purchased. Only present for purchases made with \'Subscribe with Google\'.
    profileId :: (Core.Maybe Core.Text),
    -- | The profile name of the user when the subscription was purchased. Only present for purchases made with \'Subscribe with Google\'.
    profileName :: (Core.Maybe Core.Text),
    -- | The promotion code applied on this purchase. This field is only set if a vanity code promotion is applied when the subscription was purchased.
    promotionCode :: (Core.Maybe Core.Text),
    -- | The type of promotion applied on this purchase. This field is only set if a promotion is applied when the subscription was purchased. Possible values are: 0. One time code 1. Vanity code
    promotionType :: (Core.Maybe Core.Int32),
    -- | The type of purchase of the subscription. This field is only set if this purchase was not made using the standard in-app billing flow. Possible values are: 0. Test (i.e. purchased from a license testing account) 1. Promo (i.e. purchased using a promo code)
    purchaseType :: (Core.Maybe Core.Int32),
    -- | Time at which the subscription was granted, in milliseconds since the Epoch.
    startTimeMillis :: (Core.Maybe Core.Int64),
    -- | The time at which the subscription was canceled by the user, in milliseconds since the epoch. Only present if cancelReason is 0.
    userCancellationTimeMillis :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchase' with the minimum fields required to make a request.
newSubscriptionPurchase ::
  SubscriptionPurchase
newSubscriptionPurchase =
  SubscriptionPurchase
    { acknowledgementState = Core.Nothing,
      autoRenewing = Core.Nothing,
      autoResumeTimeMillis = Core.Nothing,
      cancelReason = Core.Nothing,
      cancelSurveyResult = Core.Nothing,
      countryCode = Core.Nothing,
      developerPayload = Core.Nothing,
      emailAddress = Core.Nothing,
      expiryTimeMillis = Core.Nothing,
      externalAccountId = Core.Nothing,
      familyName = Core.Nothing,
      givenName = Core.Nothing,
      introductoryPriceInfo = Core.Nothing,
      kind = Core.Nothing,
      linkedPurchaseToken = Core.Nothing,
      obfuscatedExternalAccountId = Core.Nothing,
      obfuscatedExternalProfileId = Core.Nothing,
      orderId = Core.Nothing,
      paymentState = Core.Nothing,
      priceAmountMicros = Core.Nothing,
      priceChange = Core.Nothing,
      priceCurrencyCode = Core.Nothing,
      profileId = Core.Nothing,
      profileName = Core.Nothing,
      promotionCode = Core.Nothing,
      promotionType = Core.Nothing,
      purchaseType = Core.Nothing,
      startTimeMillis = Core.Nothing,
      userCancellationTimeMillis = Core.Nothing
    }

instance Core.FromJSON SubscriptionPurchase where
  parseJSON =
    Core.withObject
      "SubscriptionPurchase"
      ( \o ->
          SubscriptionPurchase
            Core.<$> (o Core..:? "acknowledgementState")
            Core.<*> (o Core..:? "autoRenewing")
            Core.<*> ( o
                         Core..:? "autoResumeTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "cancelReason")
            Core.<*> (o Core..:? "cancelSurveyResult")
            Core.<*> (o Core..:? "countryCode")
            Core.<*> (o Core..:? "developerPayload")
            Core.<*> (o Core..:? "emailAddress")
            Core.<*> (o Core..:? "expiryTimeMillis" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "externalAccountId")
            Core.<*> (o Core..:? "familyName")
            Core.<*> (o Core..:? "givenName")
            Core.<*> (o Core..:? "introductoryPriceInfo")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "linkedPurchaseToken")
            Core.<*> (o Core..:? "obfuscatedExternalAccountId")
            Core.<*> (o Core..:? "obfuscatedExternalProfileId")
            Core.<*> (o Core..:? "orderId")
            Core.<*> (o Core..:? "paymentState")
            Core.<*> (o Core..:? "priceAmountMicros" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "priceChange")
            Core.<*> (o Core..:? "priceCurrencyCode")
            Core.<*> (o Core..:? "profileId")
            Core.<*> (o Core..:? "profileName")
            Core.<*> (o Core..:? "promotionCode")
            Core.<*> (o Core..:? "promotionType")
            Core.<*> (o Core..:? "purchaseType")
            Core.<*> (o Core..:? "startTimeMillis" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> ( o
                         Core..:? "userCancellationTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
      )

instance Core.ToJSON SubscriptionPurchase where
  toJSON SubscriptionPurchase {..} =
    Core.object
      ( Core.catMaybes
          [ ("acknowledgementState" Core..=) Core.<$> acknowledgementState,
            ("autoRenewing" Core..=) Core.<$> autoRenewing,
            ("autoResumeTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> autoResumeTimeMillis,
            ("cancelReason" Core..=) Core.<$> cancelReason,
            ("cancelSurveyResult" Core..=) Core.<$> cancelSurveyResult,
            ("countryCode" Core..=) Core.<$> countryCode,
            ("developerPayload" Core..=) Core.<$> developerPayload,
            ("emailAddress" Core..=) Core.<$> emailAddress,
            ("expiryTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> expiryTimeMillis,
            ("externalAccountId" Core..=) Core.<$> externalAccountId,
            ("familyName" Core..=) Core.<$> familyName,
            ("givenName" Core..=) Core.<$> givenName,
            ("introductoryPriceInfo" Core..=) Core.<$> introductoryPriceInfo,
            ("kind" Core..=) Core.<$> kind,
            ("linkedPurchaseToken" Core..=) Core.<$> linkedPurchaseToken,
            ("obfuscatedExternalAccountId" Core..=)
              Core.<$> obfuscatedExternalAccountId,
            ("obfuscatedExternalProfileId" Core..=)
              Core.<$> obfuscatedExternalProfileId,
            ("orderId" Core..=) Core.<$> orderId,
            ("paymentState" Core..=) Core.<$> paymentState,
            ("priceAmountMicros" Core..=)
              Core.. Core.AsText
              Core.<$> priceAmountMicros,
            ("priceChange" Core..=) Core.<$> priceChange,
            ("priceCurrencyCode" Core..=) Core.<$> priceCurrencyCode,
            ("profileId" Core..=) Core.<$> profileId,
            ("profileName" Core..=) Core.<$> profileName,
            ("promotionCode" Core..=) Core.<$> promotionCode,
            ("promotionType" Core..=) Core.<$> promotionType,
            ("purchaseType" Core..=) Core.<$> purchaseType,
            ("startTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> startTimeMillis,
            ("userCancellationTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> userCancellationTimeMillis
          ]
      )

-- | Item-level info for a subscription purchase.
--
-- /See:/ 'newSubscriptionPurchaseLineItem' smart constructor.
data SubscriptionPurchaseLineItem = SubscriptionPurchaseLineItem
  { -- | The item is auto renewing.
    autoRenewingPlan :: (Core.Maybe AutoRenewingPlan),
    -- | Information for deferred item replacement.
    deferredItemReplacement :: (Core.Maybe DeferredItemReplacement),
    -- | Time at which the subscription expired or will expire unless the access is extended (ex. renews).
    expiryTime :: (Core.Maybe Core.DateTime),
    -- | The offer details for this item.
    offerDetails :: (Core.Maybe OfferDetails),
    -- | The item is prepaid.
    prepaidPlan :: (Core.Maybe PrepaidPlan),
    -- | The purchased product ID (for example, \'monthly001\').
    productId :: (Core.Maybe Core.Text),
    -- | Promotion details about this item. Only set if a promotion was applied during signup.
    signupPromotion :: (Core.Maybe SignupPromotion)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchaseLineItem' with the minimum fields required to make a request.
newSubscriptionPurchaseLineItem ::
  SubscriptionPurchaseLineItem
newSubscriptionPurchaseLineItem =
  SubscriptionPurchaseLineItem
    { autoRenewingPlan = Core.Nothing,
      deferredItemReplacement = Core.Nothing,
      expiryTime = Core.Nothing,
      offerDetails = Core.Nothing,
      prepaidPlan = Core.Nothing,
      productId = Core.Nothing,
      signupPromotion = Core.Nothing
    }

instance Core.FromJSON SubscriptionPurchaseLineItem where
  parseJSON =
    Core.withObject
      "SubscriptionPurchaseLineItem"
      ( \o ->
          SubscriptionPurchaseLineItem
            Core.<$> (o Core..:? "autoRenewingPlan")
            Core.<*> (o Core..:? "deferredItemReplacement")
            Core.<*> (o Core..:? "expiryTime")
            Core.<*> (o Core..:? "offerDetails")
            Core.<*> (o Core..:? "prepaidPlan")
            Core.<*> (o Core..:? "productId")
            Core.<*> (o Core..:? "signupPromotion")
      )

instance Core.ToJSON SubscriptionPurchaseLineItem where
  toJSON SubscriptionPurchaseLineItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("autoRenewingPlan" Core..=) Core.<$> autoRenewingPlan,
            ("deferredItemReplacement" Core..=)
              Core.<$> deferredItemReplacement,
            ("expiryTime" Core..=) Core.<$> expiryTime,
            ("offerDetails" Core..=) Core.<$> offerDetails,
            ("prepaidPlan" Core..=) Core.<$> prepaidPlan,
            ("productId" Core..=) Core.<$> productId,
            ("signupPromotion" Core..=) Core.<$> signupPromotion
          ]
      )

-- | Indicates the status of a user\'s subscription purchase.
--
-- /See:/ 'newSubscriptionPurchaseV2' smart constructor.
data SubscriptionPurchaseV2 = SubscriptionPurchaseV2
  { -- | The acknowledgement state of the subscription.
    acknowledgementState :: (Core.Maybe SubscriptionPurchaseV2_AcknowledgementState),
    -- | Additional context around canceled subscriptions. Only present if the subscription currently has subscription/state SUBSCRIPTION/STATE/CANCELED or SUBSCRIPTION/STATE_EXPIRED.
    canceledStateContext :: (Core.Maybe CanceledStateContext),
    -- | User account identifier in the third-party service.
    externalAccountIdentifiers :: (Core.Maybe ExternalAccountIdentifiers),
    -- | This kind represents a SubscriptionPurchaseV2 object in the androidpublisher service.
    kind :: (Core.Maybe Core.Text),
    -- | The order id of the latest order associated with the purchase of the subscription. For autoRenewing subscription, this is the order id of signup order if it is not renewed yet, or the last recurring order id (success, pending, or declined order). For prepaid subscription, this is the order id associated with the queried purchase token.
    latestOrderId :: (Core.Maybe Core.Text),
    -- | Item-level info for a subscription purchase. The items in the same purchase should be either all with AutoRenewingPlan or all with PrepaidPlan.
    lineItems :: (Core.Maybe [SubscriptionPurchaseLineItem]),
    -- | The purchase token of the old subscription if this subscription is one of the following: * Re-signup of a canceled but non-lapsed subscription * Upgrade\/downgrade from a previous subscription. * Convert from prepaid to auto renewing subscription. * Convert from an auto renewing subscription to prepaid. * Topup a prepaid subscription.
    linkedPurchaseToken :: (Core.Maybe Core.Text),
    -- | Additional context around paused subscriptions. Only present if the subscription currently has subscription/state SUBSCRIPTION/STATE_PAUSED.
    pausedStateContext :: (Core.Maybe PausedStateContext),
    -- | ISO 3166-1 alpha-2 billing country\/region code of the user at the time the subscription was granted.
    regionCode :: (Core.Maybe Core.Text),
    -- | Time at which the subscription was granted. Not set for pending subscriptions (subscription was created but awaiting payment during signup).
    startTime :: (Core.Maybe Core.DateTime),
    -- | User profile associated with purchases made with \'Subscribe with Google\'.
    subscribeWithGoogleInfo :: (Core.Maybe SubscribeWithGoogleInfo),
    -- | The current state of the subscription.
    subscriptionState :: (Core.Maybe SubscriptionPurchaseV2_SubscriptionState),
    -- | Only present if this subscription purchase is a test purchase.
    testPurchase :: (Core.Maybe TestPurchase)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchaseV2' with the minimum fields required to make a request.
newSubscriptionPurchaseV2 ::
  SubscriptionPurchaseV2
newSubscriptionPurchaseV2 =
  SubscriptionPurchaseV2
    { acknowledgementState = Core.Nothing,
      canceledStateContext = Core.Nothing,
      externalAccountIdentifiers = Core.Nothing,
      kind = Core.Nothing,
      latestOrderId = Core.Nothing,
      lineItems = Core.Nothing,
      linkedPurchaseToken = Core.Nothing,
      pausedStateContext = Core.Nothing,
      regionCode = Core.Nothing,
      startTime = Core.Nothing,
      subscribeWithGoogleInfo = Core.Nothing,
      subscriptionState = Core.Nothing,
      testPurchase = Core.Nothing
    }

instance Core.FromJSON SubscriptionPurchaseV2 where
  parseJSON =
    Core.withObject
      "SubscriptionPurchaseV2"
      ( \o ->
          SubscriptionPurchaseV2
            Core.<$> (o Core..:? "acknowledgementState")
            Core.<*> (o Core..:? "canceledStateContext")
            Core.<*> (o Core..:? "externalAccountIdentifiers")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "latestOrderId")
            Core.<*> (o Core..:? "lineItems")
            Core.<*> (o Core..:? "linkedPurchaseToken")
            Core.<*> (o Core..:? "pausedStateContext")
            Core.<*> (o Core..:? "regionCode")
            Core.<*> (o Core..:? "startTime")
            Core.<*> (o Core..:? "subscribeWithGoogleInfo")
            Core.<*> (o Core..:? "subscriptionState")
            Core.<*> (o Core..:? "testPurchase")
      )

instance Core.ToJSON SubscriptionPurchaseV2 where
  toJSON SubscriptionPurchaseV2 {..} =
    Core.object
      ( Core.catMaybes
          [ ("acknowledgementState" Core..=) Core.<$> acknowledgementState,
            ("canceledStateContext" Core..=) Core.<$> canceledStateContext,
            ("externalAccountIdentifiers" Core..=)
              Core.<$> externalAccountIdentifiers,
            ("kind" Core..=) Core.<$> kind,
            ("latestOrderId" Core..=) Core.<$> latestOrderId,
            ("lineItems" Core..=) Core.<$> lineItems,
            ("linkedPurchaseToken" Core..=) Core.<$> linkedPurchaseToken,
            ("pausedStateContext" Core..=) Core.<$> pausedStateContext,
            ("regionCode" Core..=) Core.<$> regionCode,
            ("startTime" Core..=) Core.<$> startTime,
            ("subscribeWithGoogleInfo" Core..=)
              Core.<$> subscribeWithGoogleInfo,
            ("subscriptionState" Core..=) Core.<$> subscriptionState,
            ("testPurchase" Core..=) Core.<$> testPurchase
          ]
      )

-- | Request for the purchases.subscriptions.acknowledge API.
--
-- /See:/ 'newSubscriptionPurchasesAcknowledgeRequest' smart constructor.
newtype SubscriptionPurchasesAcknowledgeRequest = SubscriptionPurchasesAcknowledgeRequest
  { -- | Payload to attach to the purchase.
    developerPayload :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchasesAcknowledgeRequest' with the minimum fields required to make a request.
newSubscriptionPurchasesAcknowledgeRequest ::
  SubscriptionPurchasesAcknowledgeRequest
newSubscriptionPurchasesAcknowledgeRequest =
  SubscriptionPurchasesAcknowledgeRequest
    { developerPayload =
        Core.Nothing
    }

instance Core.FromJSON SubscriptionPurchasesAcknowledgeRequest where
  parseJSON =
    Core.withObject
      "SubscriptionPurchasesAcknowledgeRequest"
      ( \o ->
          SubscriptionPurchasesAcknowledgeRequest
            Core.<$> (o Core..:? "developerPayload")
      )

instance Core.ToJSON SubscriptionPurchasesAcknowledgeRequest where
  toJSON SubscriptionPurchasesAcknowledgeRequest {..} =
    Core.object
      ( Core.catMaybes
          [("developerPayload" Core..=) Core.<$> developerPayload]
      )

-- | Request for the purchases.subscriptions.defer API.
--
-- /See:/ 'newSubscriptionPurchasesDeferRequest' smart constructor.
newtype SubscriptionPurchasesDeferRequest = SubscriptionPurchasesDeferRequest
  { -- | The information about the new desired expiry time for the subscription.
    deferralInfo :: (Core.Maybe SubscriptionDeferralInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchasesDeferRequest' with the minimum fields required to make a request.
newSubscriptionPurchasesDeferRequest ::
  SubscriptionPurchasesDeferRequest
newSubscriptionPurchasesDeferRequest =
  SubscriptionPurchasesDeferRequest {deferralInfo = Core.Nothing}

instance Core.FromJSON SubscriptionPurchasesDeferRequest where
  parseJSON =
    Core.withObject
      "SubscriptionPurchasesDeferRequest"
      ( \o ->
          SubscriptionPurchasesDeferRequest
            Core.<$> (o Core..:? "deferralInfo")
      )

instance Core.ToJSON SubscriptionPurchasesDeferRequest where
  toJSON SubscriptionPurchasesDeferRequest {..} =
    Core.object
      (Core.catMaybes [("deferralInfo" Core..=) Core.<$> deferralInfo])

-- | Response for the purchases.subscriptions.defer API.
--
-- /See:/ 'newSubscriptionPurchasesDeferResponse' smart constructor.
newtype SubscriptionPurchasesDeferResponse = SubscriptionPurchasesDeferResponse
  { -- | The new expiry time for the subscription in milliseconds since the Epoch.
    newExpiryTimeMillis' :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionPurchasesDeferResponse' with the minimum fields required to make a request.
newSubscriptionPurchasesDeferResponse ::
  SubscriptionPurchasesDeferResponse
newSubscriptionPurchasesDeferResponse =
  SubscriptionPurchasesDeferResponse
    { newExpiryTimeMillis' =
        Core.Nothing
    }

instance Core.FromJSON SubscriptionPurchasesDeferResponse where
  parseJSON =
    Core.withObject
      "SubscriptionPurchasesDeferResponse"
      ( \o ->
          SubscriptionPurchasesDeferResponse
            Core.<$> ( o
                         Core..:? "newExpiryTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
      )

instance Core.ToJSON SubscriptionPurchasesDeferResponse where
  toJSON SubscriptionPurchasesDeferResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("newExpiryTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> newExpiryTimeMillis'
          ]
      )

-- | Details about taxation, Google Play policy and legal compliance for subscription products.
--
-- /See:/ 'newSubscriptionTaxAndComplianceSettings' smart constructor.
data SubscriptionTaxAndComplianceSettings = SubscriptionTaxAndComplianceSettings
  { -- | Digital content or service classification for products distributed to users in the European Economic Area (EEA). The withdrawal regime under EEA consumer laws depends on this classification. Refer to the <https://support.google.com/googleplay/android-developer/answer/10463498 Help Center article> for more information.
    eeaWithdrawalRightType ::
      ( Core.Maybe
          SubscriptionTaxAndComplianceSettings_EeaWithdrawalRightType
      ),
    -- | Whether this subscription is declared as a product representing a tokenized digital asset.
    isTokenizedDigitalAsset :: (Core.Maybe Core.Bool),
    -- | A mapping from region code to tax rate details. The keys are region codes as defined by Unicode\'s \"CLDR\".
    taxRateInfoByRegionCode ::
      ( Core.Maybe
          SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
      )
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionTaxAndComplianceSettings' with the minimum fields required to make a request.
newSubscriptionTaxAndComplianceSettings ::
  SubscriptionTaxAndComplianceSettings
newSubscriptionTaxAndComplianceSettings =
  SubscriptionTaxAndComplianceSettings
    { eeaWithdrawalRightType =
        Core.Nothing,
      isTokenizedDigitalAsset = Core.Nothing,
      taxRateInfoByRegionCode = Core.Nothing
    }

instance Core.FromJSON SubscriptionTaxAndComplianceSettings where
  parseJSON =
    Core.withObject
      "SubscriptionTaxAndComplianceSettings"
      ( \o ->
          SubscriptionTaxAndComplianceSettings
            Core.<$> (o Core..:? "eeaWithdrawalRightType")
            Core.<*> (o Core..:? "isTokenizedDigitalAsset")
            Core.<*> (o Core..:? "taxRateInfoByRegionCode")
      )

instance Core.ToJSON SubscriptionTaxAndComplianceSettings where
  toJSON SubscriptionTaxAndComplianceSettings {..} =
    Core.object
      ( Core.catMaybes
          [ ("eeaWithdrawalRightType" Core..=)
              Core.<$> eeaWithdrawalRightType,
            ("isTokenizedDigitalAsset" Core..=)
              Core.<$> isTokenizedDigitalAsset,
            ("taxRateInfoByRegionCode" Core..=)
              Core.<$> taxRateInfoByRegionCode
          ]
      )

-- | A mapping from region code to tax rate details. The keys are region codes as defined by Unicode\'s \"CLDR\".
--
-- /See:/ 'newSubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode' smart constructor.
newtype SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode = SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
  { additional :: (Core.HashMap Core.Text RegionalTaxRateInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode' with the minimum fields required to make a request.
newSubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode ::
  -- |  See 'additional'.
  Core.HashMap
    Core.Text
    RegionalTaxRateInfo ->
  SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
newSubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
  additional =
    SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
      { additional =
          additional
      }

instance
  Core.FromJSON
    SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
  where
  parseJSON =
    Core.withObject
      "SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode"
      ( \o ->
          SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
            Core.<$> (Core.parseJSONObject o)
      )

instance
  Core.ToJSON
    SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode
  where
  toJSON
    SubscriptionTaxAndComplianceSettings_TaxRateInfoByRegionCode {..} =
      Core.toJSON additional

-- | Options for system APKs.
--
-- /See:/ 'newSystemApkOptions' smart constructor.
data SystemApkOptions = SystemApkOptions
  { -- | Whether to use the rotated key for signing the system APK.
    rotated :: (Core.Maybe Core.Bool),
    -- | Whether system APK was generated with uncompressed dex files.
    uncompressedDexFiles :: (Core.Maybe Core.Bool),
    -- | Whether system APK was generated with uncompressed native libraries.
    uncompressedNativeLibraries :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SystemApkOptions' with the minimum fields required to make a request.
newSystemApkOptions ::
  SystemApkOptions
newSystemApkOptions =
  SystemApkOptions
    { rotated = Core.Nothing,
      uncompressedDexFiles = Core.Nothing,
      uncompressedNativeLibraries = Core.Nothing
    }

instance Core.FromJSON SystemApkOptions where
  parseJSON =
    Core.withObject
      "SystemApkOptions"
      ( \o ->
          SystemApkOptions
            Core.<$> (o Core..:? "rotated")
            Core.<*> (o Core..:? "uncompressedDexFiles")
            Core.<*> (o Core..:? "uncompressedNativeLibraries")
      )

instance Core.ToJSON SystemApkOptions where
  toJSON SystemApkOptions {..} =
    Core.object
      ( Core.catMaybes
          [ ("rotated" Core..=) Core.<$> rotated,
            ("uncompressedDexFiles" Core..=) Core.<$> uncompressedDexFiles,
            ("uncompressedNativeLibraries" Core..=)
              Core.<$> uncompressedNativeLibraries
          ]
      )

-- | Response to list previously created system APK variants.
--
-- /See:/ 'newSystemApksListResponse' smart constructor.
newtype SystemApksListResponse = SystemApksListResponse
  { -- | All system APK variants created.
    variants :: (Core.Maybe [Variant])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SystemApksListResponse' with the minimum fields required to make a request.
newSystemApksListResponse ::
  SystemApksListResponse
newSystemApksListResponse =
  SystemApksListResponse {variants = Core.Nothing}

instance Core.FromJSON SystemApksListResponse where
  parseJSON =
    Core.withObject
      "SystemApksListResponse"
      (\o -> SystemApksListResponse Core.<$> (o Core..:? "variants"))

instance Core.ToJSON SystemApksListResponse where
  toJSON SystemApksListResponse {..} =
    Core.object
      (Core.catMaybes [("variants" Core..=) Core.<$> variants])

-- | Representation of a system feature.
--
-- /See:/ 'newSystemFeature' smart constructor.
newtype SystemFeature = SystemFeature
  { -- | The name of the feature.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SystemFeature' with the minimum fields required to make a request.
newSystemFeature ::
  SystemFeature
newSystemFeature = SystemFeature {name = Core.Nothing}

instance Core.FromJSON SystemFeature where
  parseJSON =
    Core.withObject
      "SystemFeature"
      (\o -> SystemFeature Core.<$> (o Core..:? "name"))

instance Core.ToJSON SystemFeature where
  toJSON SystemFeature {..} =
    Core.object (Core.catMaybes [("name" Core..=) Core.<$> name])

-- | Information specific to cancellations initiated by Google system.
--
-- /See:/ 'newSystemInitiatedCancellation' smart constructor.
data SystemInitiatedCancellation = SystemInitiatedCancellation
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SystemInitiatedCancellation' with the minimum fields required to make a request.
newSystemInitiatedCancellation ::
  SystemInitiatedCancellation
newSystemInitiatedCancellation = SystemInitiatedCancellation

instance Core.FromJSON SystemInitiatedCancellation where
  parseJSON =
    Core.withObject
      "SystemInitiatedCancellation"
      (\o -> Core.pure SystemInitiatedCancellation)

instance Core.ToJSON SystemInitiatedCancellation where
  toJSON = Core.const Core.emptyObject

-- | Representation of a System-on-Chip (SoC) of an Android device. Can be used to target S+ devices.
--
-- /See:/ 'newSystemOnChip' smart constructor.
data SystemOnChip = SystemOnChip
  { -- | Required. The designer of the SoC, eg. \"Google\" Value of build property \"ro.soc.manufacturer\" https:\/\/developer.android.com\/reference\/android\/os\/Build#SOC_MANUFACTURER Required.
    manufacturer :: (Core.Maybe Core.Text),
    -- | Required. The model of the SoC, eg. \"Tensor\" Value of build property \"ro.soc.model\" https:\/\/developer.android.com\/reference\/android\/os\/Build#SOC_MODEL Required.
    model :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SystemOnChip' with the minimum fields required to make a request.
newSystemOnChip ::
  SystemOnChip
newSystemOnChip =
  SystemOnChip {manufacturer = Core.Nothing, model = Core.Nothing}

instance Core.FromJSON SystemOnChip where
  parseJSON =
    Core.withObject
      "SystemOnChip"
      ( \o ->
          SystemOnChip
            Core.<$> (o Core..:? "manufacturer")
            Core.<*> (o Core..:? "model")
      )

instance Core.ToJSON SystemOnChip where
  toJSON SystemOnChip {..} =
    Core.object
      ( Core.catMaybes
          [ ("manufacturer" Core..=) Core.<$> manufacturer,
            ("model" Core..=) Core.<$> model
          ]
      )

-- | Targeting details for a recovery action such as regions, android sdk levels, app versions etc.
--
-- /See:/ 'newTargeting' smart constructor.
data Targeting = Targeting
  { -- | All users are targeted.
    allUsers :: (Core.Maybe AllUsers),
    -- | Targeting is based on android api levels of devices.
    androidSdks :: (Core.Maybe AndroidSdks),
    -- | Targeting is based on the user account region.
    regions :: (Core.Maybe Regions),
    -- | Target version codes as a list.
    versionList :: (Core.Maybe AppVersionList),
    -- | Target version codes as a range.
    versionRange :: (Core.Maybe AppVersionRange)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Targeting' with the minimum fields required to make a request.
newTargeting ::
  Targeting
newTargeting =
  Targeting
    { allUsers = Core.Nothing,
      androidSdks = Core.Nothing,
      regions = Core.Nothing,
      versionList = Core.Nothing,
      versionRange = Core.Nothing
    }

instance Core.FromJSON Targeting where
  parseJSON =
    Core.withObject
      "Targeting"
      ( \o ->
          Targeting
            Core.<$> (o Core..:? "allUsers")
            Core.<*> (o Core..:? "androidSdks")
            Core.<*> (o Core..:? "regions")
            Core.<*> (o Core..:? "versionList")
            Core.<*> (o Core..:? "versionRange")
      )

instance Core.ToJSON Targeting where
  toJSON Targeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("allUsers" Core..=) Core.<$> allUsers,
            ("androidSdks" Core..=) Core.<$> androidSdks,
            ("regions" Core..=) Core.<$> regions,
            ("versionList" Core..=) Core.<$> versionList,
            ("versionRange" Core..=) Core.<$> versionRange
          ]
      )

-- | Targeting information about the generated apks.
--
-- /See:/ 'newTargetingInfo' smart constructor.
data TargetingInfo = TargetingInfo
  { -- | List of created asset slices.
    assetSliceSet :: (Core.Maybe [AssetSliceSet]),
    -- | The package name of this app.
    packageName :: (Core.Maybe Core.Text),
    -- | List of the created variants.
    variant :: (Core.Maybe [SplitApkVariant])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TargetingInfo' with the minimum fields required to make a request.
newTargetingInfo ::
  TargetingInfo
newTargetingInfo =
  TargetingInfo
    { assetSliceSet = Core.Nothing,
      packageName = Core.Nothing,
      variant = Core.Nothing
    }

instance Core.FromJSON TargetingInfo where
  parseJSON =
    Core.withObject
      "TargetingInfo"
      ( \o ->
          TargetingInfo
            Core.<$> (o Core..:? "assetSliceSet")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "variant")
      )

instance Core.ToJSON TargetingInfo where
  toJSON TargetingInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("assetSliceSet" Core..=) Core.<$> assetSliceSet,
            ("packageName" Core..=) Core.<$> packageName,
            ("variant" Core..=) Core.<$> variant
          ]
      )

-- | Defines the scope of subscriptions which a targeting rule can match to target offers to users based on past or current entitlement.
--
-- /See:/ 'newTargetingRuleScope' smart constructor.
data TargetingRuleScope = TargetingRuleScope
  { -- | The scope of the current targeting rule is any subscription in the parent app.
    anySubscriptionInApp :: (Core.Maybe TargetingRuleScopeAnySubscriptionInApp),
    -- | The scope of the current targeting rule is the subscription with the specified subscription ID. Must be a subscription within the same parent app.
    specificSubscriptionInApp :: (Core.Maybe Core.Text),
    -- | The scope of the current targeting rule is the subscription in which this offer is defined.
    thisSubscription :: (Core.Maybe TargetingRuleScopeThisSubscription)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TargetingRuleScope' with the minimum fields required to make a request.
newTargetingRuleScope ::
  TargetingRuleScope
newTargetingRuleScope =
  TargetingRuleScope
    { anySubscriptionInApp = Core.Nothing,
      specificSubscriptionInApp = Core.Nothing,
      thisSubscription = Core.Nothing
    }

instance Core.FromJSON TargetingRuleScope where
  parseJSON =
    Core.withObject
      "TargetingRuleScope"
      ( \o ->
          TargetingRuleScope
            Core.<$> (o Core..:? "anySubscriptionInApp")
            Core.<*> (o Core..:? "specificSubscriptionInApp")
            Core.<*> (o Core..:? "thisSubscription")
      )

instance Core.ToJSON TargetingRuleScope where
  toJSON TargetingRuleScope {..} =
    Core.object
      ( Core.catMaybes
          [ ("anySubscriptionInApp" Core..=) Core.<$> anySubscriptionInApp,
            ("specificSubscriptionInApp" Core..=)
              Core.<$> specificSubscriptionInApp,
            ("thisSubscription" Core..=) Core.<$> thisSubscription
          ]
      )

-- | Represents the targeting rule scope corresponding to any subscription in the parent app.
--
-- /See:/ 'newTargetingRuleScopeAnySubscriptionInApp' smart constructor.
data TargetingRuleScopeAnySubscriptionInApp = TargetingRuleScopeAnySubscriptionInApp
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TargetingRuleScopeAnySubscriptionInApp' with the minimum fields required to make a request.
newTargetingRuleScopeAnySubscriptionInApp ::
  TargetingRuleScopeAnySubscriptionInApp
newTargetingRuleScopeAnySubscriptionInApp =
  TargetingRuleScopeAnySubscriptionInApp

instance Core.FromJSON TargetingRuleScopeAnySubscriptionInApp where
  parseJSON =
    Core.withObject
      "TargetingRuleScopeAnySubscriptionInApp"
      (\o -> Core.pure TargetingRuleScopeAnySubscriptionInApp)

instance Core.ToJSON TargetingRuleScopeAnySubscriptionInApp where
  toJSON = Core.const Core.emptyObject

-- | Represents the targeting rule scope corresponding to the subscriptions in which this offer is defined.
--
-- /See:/ 'newTargetingRuleScopeThisSubscription' smart constructor.
data TargetingRuleScopeThisSubscription = TargetingRuleScopeThisSubscription
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TargetingRuleScopeThisSubscription' with the minimum fields required to make a request.
newTargetingRuleScopeThisSubscription ::
  TargetingRuleScopeThisSubscription
newTargetingRuleScopeThisSubscription =
  TargetingRuleScopeThisSubscription

instance Core.FromJSON TargetingRuleScopeThisSubscription where
  parseJSON =
    Core.withObject
      "TargetingRuleScopeThisSubscription"
      (\o -> Core.pure TargetingRuleScopeThisSubscription)

instance Core.ToJSON TargetingRuleScopeThisSubscription where
  toJSON = Core.const Core.emptyObject

-- | Update type for targeting. Note it is always a subset Targeting.
--
-- /See:/ 'newTargetingUpdate' smart constructor.
data TargetingUpdate = TargetingUpdate
  { -- | All users are targeted.
    allUsers :: (Core.Maybe AllUsers),
    -- | Additional android sdk levels are targeted by the recovery action.
    androidSdks :: (Core.Maybe AndroidSdks),
    -- | Additional regions are targeted by the recovery action.
    regions :: (Core.Maybe Regions)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TargetingUpdate' with the minimum fields required to make a request.
newTargetingUpdate ::
  TargetingUpdate
newTargetingUpdate =
  TargetingUpdate
    { allUsers = Core.Nothing,
      androidSdks = Core.Nothing,
      regions = Core.Nothing
    }

instance Core.FromJSON TargetingUpdate where
  parseJSON =
    Core.withObject
      "TargetingUpdate"
      ( \o ->
          TargetingUpdate
            Core.<$> (o Core..:? "allUsers")
            Core.<*> (o Core..:? "androidSdks")
            Core.<*> (o Core..:? "regions")
      )

instance Core.ToJSON TargetingUpdate where
  toJSON TargetingUpdate {..} =
    Core.object
      ( Core.catMaybes
          [ ("allUsers" Core..=) Core.<$> allUsers,
            ("androidSdks" Core..=) Core.<$> androidSdks,
            ("regions" Core..=) Core.<$> regions
          ]
      )

-- | Whether this subscription purchase is a test purchase.
--
-- /See:/ 'newTestPurchase' smart constructor.
data TestPurchase = TestPurchase
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TestPurchase' with the minimum fields required to make a request.
newTestPurchase ::
  TestPurchase
newTestPurchase = TestPurchase

instance Core.FromJSON TestPurchase where
  parseJSON =
    Core.withObject "TestPurchase" (\o -> Core.pure TestPurchase)

instance Core.ToJSON TestPurchase where
  toJSON = Core.const Core.emptyObject

-- | The testers of an app. The resource for TestersService. Note: while it is possible in the Play Console UI to add testers via email lists, email lists are not supported by this resource.
--
-- /See:/ 'newTesters' smart constructor.
newtype Testers = Testers
  { -- | All testing Google Groups, as email addresses.
    googleGroups :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Testers' with the minimum fields required to make a request.
newTesters ::
  Testers
newTesters = Testers {googleGroups = Core.Nothing}

instance Core.FromJSON Testers where
  parseJSON =
    Core.withObject
      "Testers"
      (\o -> Testers Core.<$> (o Core..:? "googleGroups"))

instance Core.ToJSON Testers where
  toJSON Testers {..} =
    Core.object
      (Core.catMaybes [("googleGroups" Core..=) Core.<$> googleGroups])

-- | Represents texture compression format.
--
-- /See:/ 'newTextureCompressionFormat' smart constructor.
newtype TextureCompressionFormat = TextureCompressionFormat
  { -- | Alias for texture compression format.
    alias :: (Core.Maybe TextureCompressionFormat_Alias)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TextureCompressionFormat' with the minimum fields required to make a request.
newTextureCompressionFormat ::
  TextureCompressionFormat
newTextureCompressionFormat =
  TextureCompressionFormat {alias = Core.Nothing}

instance Core.FromJSON TextureCompressionFormat where
  parseJSON =
    Core.withObject
      "TextureCompressionFormat"
      (\o -> TextureCompressionFormat Core.<$> (o Core..:? "alias"))

instance Core.ToJSON TextureCompressionFormat where
  toJSON TextureCompressionFormat {..} =
    Core.object (Core.catMaybes [("alias" Core..=) Core.<$> alias])

-- | Targeting by a texture compression format.
--
-- /See:/ 'newTextureCompressionFormatTargeting' smart constructor.
data TextureCompressionFormatTargeting = TextureCompressionFormatTargeting
  { -- | List of alternative TCFs (TCFs targeted by the sibling splits).
    alternatives :: (Core.Maybe [TextureCompressionFormat]),
    -- | The list of targeted TCFs. Should not be empty.
    value :: (Core.Maybe [TextureCompressionFormat])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TextureCompressionFormatTargeting' with the minimum fields required to make a request.
newTextureCompressionFormatTargeting ::
  TextureCompressionFormatTargeting
newTextureCompressionFormatTargeting =
  TextureCompressionFormatTargeting
    { alternatives = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON TextureCompressionFormatTargeting where
  parseJSON =
    Core.withObject
      "TextureCompressionFormatTargeting"
      ( \o ->
          TextureCompressionFormatTargeting
            Core.<$> (o Core..:? "alternatives")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON TextureCompressionFormatTargeting where
  toJSON TextureCompressionFormatTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternatives" Core..=) Core.<$> alternatives,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | A Timestamp represents a point in time independent of any time zone or local calendar, encoded as a count of seconds and fractions of seconds at nanosecond resolution. The count is relative to an epoch at UTC midnight on January 1, 1970.
--
-- /See:/ 'newTimestamp' smart constructor.
data Timestamp = Timestamp
  { -- | Non-negative fractions of a second at nanosecond resolution. Must be from 0 to 999,999,999 inclusive.
    nanos :: (Core.Maybe Core.Int32),
    -- | Represents seconds of UTC time since Unix epoch.
    seconds :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Timestamp' with the minimum fields required to make a request.
newTimestamp ::
  Timestamp
newTimestamp =
  Timestamp {nanos = Core.Nothing, seconds = Core.Nothing}

instance Core.FromJSON Timestamp where
  parseJSON =
    Core.withObject
      "Timestamp"
      ( \o ->
          Timestamp
            Core.<$> (o Core..:? "nanos")
            Core.<*> (o Core..:? "seconds" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON Timestamp where
  toJSON Timestamp {..} =
    Core.object
      ( Core.catMaybes
          [ ("nanos" Core..=) Core.<$> nanos,
            ("seconds" Core..=) Core.. Core.AsText Core.<$> seconds
          ]
      )

-- | Pagination information returned by a List operation when token pagination is enabled. List operations that supports paging return only one \"page\" of results. This protocol buffer message describes the page that has been returned. When using token pagination, clients should use the next\/previous token to get another page of the result. The presence or absence of next\/previous token indicates whether a next\/previous page is available and provides a mean of accessing this page. ListRequest.page/token should be set to either next/page/token or previous/page_token to access another page.
--
-- /See:/ 'newTokenPagination' smart constructor.
data TokenPagination = TokenPagination
  { -- | Tokens to pass to the standard list field \'page/token\'. Whenever available, tokens are preferred over manipulating start/index.
    nextPageToken :: (Core.Maybe Core.Text),
    previousPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TokenPagination' with the minimum fields required to make a request.
newTokenPagination ::
  TokenPagination
newTokenPagination =
  TokenPagination
    { nextPageToken = Core.Nothing,
      previousPageToken = Core.Nothing
    }

instance Core.FromJSON TokenPagination where
  parseJSON =
    Core.withObject
      "TokenPagination"
      ( \o ->
          TokenPagination
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "previousPageToken")
      )

instance Core.ToJSON TokenPagination where
  toJSON TokenPagination {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("previousPageToken" Core..=) Core.<$> previousPageToken
          ]
      )

-- | A track configuration. The resource for TracksService.
--
-- /See:/ 'newTrack' smart constructor.
data Track = Track
  { -- | In a read request, represents all active releases in the track. In an update request, represents desired changes.
    releases :: (Core.Maybe [TrackRelease]),
    -- | Identifier of the track. Form factor tracks have a special prefix as an identifier, for example @wear:production@, @automotive:production@. <https://developers.google.com/android-publisher/tracks#ff-track-name More on track name>
    track :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Track' with the minimum fields required to make a request.
newTrack ::
  Track
newTrack = Track {releases = Core.Nothing, track = Core.Nothing}

instance Core.FromJSON Track where
  parseJSON =
    Core.withObject
      "Track"
      ( \o ->
          Track
            Core.<$> (o Core..:? "releases")
            Core.<*> (o Core..:? "track")
      )

instance Core.ToJSON Track where
  toJSON Track {..} =
    Core.object
      ( Core.catMaybes
          [ ("releases" Core..=) Core.<$> releases,
            ("track" Core..=) Core.<$> track
          ]
      )

-- | Configurations of the new track.
--
-- /See:/ 'newTrackConfig' smart constructor.
data TrackConfig = TrackConfig
  { -- | Required. Form factor of the new track. Defaults to the default track.
    formFactor :: (Core.Maybe TrackConfig_FormFactor),
    -- | Required. Identifier of the new track. For default tracks, this field consists of the track alias only. Form factor tracks have a special prefix as an identifier, for example @wear:production@, @automotive:production@. This prefix must match the value of the @form_factor@ field, if it is not a default track. <https://developers.google.com/android-publisher/tracks#ff-track-name More on track name>
    track :: (Core.Maybe Core.Text),
    -- | Required. Type of the new track. Currently, the only supported value is closedTesting.
    type' :: (Core.Maybe TrackConfig_Type)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TrackConfig' with the minimum fields required to make a request.
newTrackConfig ::
  TrackConfig
newTrackConfig =
  TrackConfig
    { formFactor = Core.Nothing,
      track = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON TrackConfig where
  parseJSON =
    Core.withObject
      "TrackConfig"
      ( \o ->
          TrackConfig
            Core.<$> (o Core..:? "formFactor")
            Core.<*> (o Core..:? "track")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON TrackConfig where
  toJSON TrackConfig {..} =
    Core.object
      ( Core.catMaybes
          [ ("formFactor" Core..=) Core.<$> formFactor,
            ("track" Core..=) Core.<$> track,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | Resource for per-track country availability information.
--
-- /See:/ 'newTrackCountryAvailability' smart constructor.
data TrackCountryAvailability = TrackCountryAvailability
  { -- | A list of one or more countries where artifacts in this track are available. This list includes all countries that are targeted by the track, even if only specific carriers are targeted in that country.
    countries :: (Core.Maybe [TrackTargetedCountry]),
    -- | Whether artifacts in this track are available to \"rest of the world\" countries.
    restOfWorld :: (Core.Maybe Core.Bool),
    -- | Whether this track\'s availability is synced with the default production track. See https:\/\/support.google.com\/googleplay\/android-developer\/answer\/7550024 for more information on syncing country availability with production. Note that if this is true, the returned \"countries\" and \"rest/of/world\" fields will reflect the values for the default production track.
    syncWithProduction :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TrackCountryAvailability' with the minimum fields required to make a request.
newTrackCountryAvailability ::
  TrackCountryAvailability
newTrackCountryAvailability =
  TrackCountryAvailability
    { countries = Core.Nothing,
      restOfWorld = Core.Nothing,
      syncWithProduction = Core.Nothing
    }

instance Core.FromJSON TrackCountryAvailability where
  parseJSON =
    Core.withObject
      "TrackCountryAvailability"
      ( \o ->
          TrackCountryAvailability
            Core.<$> (o Core..:? "countries")
            Core.<*> (o Core..:? "restOfWorld")
            Core.<*> (o Core..:? "syncWithProduction")
      )

instance Core.ToJSON TrackCountryAvailability where
  toJSON TrackCountryAvailability {..} =
    Core.object
      ( Core.catMaybes
          [ ("countries" Core..=) Core.<$> countries,
            ("restOfWorld" Core..=) Core.<$> restOfWorld,
            ("syncWithProduction" Core..=) Core.<$> syncWithProduction
          ]
      )

-- | A release within a track.
--
-- /See:/ 'newTrackRelease' smart constructor.
data TrackRelease = TrackRelease
  { -- | Restricts a release to a specific set of countries.
    countryTargeting :: (Core.Maybe CountryTargeting),
    -- | In-app update priority of the release. All newly added APKs in the release will be considered at this priority. Can take values in the range [0, 5], with 5 the highest priority. Defaults to 0. in/app/update_priority can not be updated once the release is rolled out. See https:\/\/developer.android.com\/guide\/playcore\/in-app-updates.
    inAppUpdatePriority :: (Core.Maybe Core.Int32),
    -- | The release name. Not required to be unique. If not set, the name is generated from the APK\'s version_name. If the release contains multiple APKs, the name is generated from the date.
    name :: (Core.Maybe Core.Text),
    -- | A description of what is new in this release.
    releaseNotes :: (Core.Maybe [LocalizedText]),
    -- | The status of the release.
    status :: (Core.Maybe TrackRelease_Status),
    -- | Fraction of users who are eligible for a staged release. 0 \< fraction \< 1. Can only be set when status is \"inProgress\" or \"halted\".
    userFraction :: (Core.Maybe Core.Double),
    -- | Version codes of all APKs in the release. Must include version codes to retain from previous releases.
    versionCodes :: (Core.Maybe [Core.Int64])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TrackRelease' with the minimum fields required to make a request.
newTrackRelease ::
  TrackRelease
newTrackRelease =
  TrackRelease
    { countryTargeting = Core.Nothing,
      inAppUpdatePriority = Core.Nothing,
      name = Core.Nothing,
      releaseNotes = Core.Nothing,
      status = Core.Nothing,
      userFraction = Core.Nothing,
      versionCodes = Core.Nothing
    }

instance Core.FromJSON TrackRelease where
  parseJSON =
    Core.withObject
      "TrackRelease"
      ( \o ->
          TrackRelease
            Core.<$> (o Core..:? "countryTargeting")
            Core.<*> (o Core..:? "inAppUpdatePriority")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "releaseNotes")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "userFraction")
            Core.<*> ( o
                         Core..:? "versionCodes"
                         Core.<&> Core.fmap (Core.fmap Core.fromAsText)
                     )
      )

instance Core.ToJSON TrackRelease where
  toJSON TrackRelease {..} =
    Core.object
      ( Core.catMaybes
          [ ("countryTargeting" Core..=) Core.<$> countryTargeting,
            ("inAppUpdatePriority" Core..=) Core.<$> inAppUpdatePriority,
            ("name" Core..=) Core.<$> name,
            ("releaseNotes" Core..=) Core.<$> releaseNotes,
            ("status" Core..=) Core.<$> status,
            ("userFraction" Core..=) Core.<$> userFraction,
            ("versionCodes" Core..=)
              Core.. Core.fmap Core.AsText
              Core.<$> versionCodes
          ]
      )

-- | Representation of a single country where the contents of a track are available.
--
-- /See:/ 'newTrackTargetedCountry' smart constructor.
newtype TrackTargetedCountry = TrackTargetedCountry
  { -- | The country to target, as a two-letter CLDR code.
    countryCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TrackTargetedCountry' with the minimum fields required to make a request.
newTrackTargetedCountry ::
  TrackTargetedCountry
newTrackTargetedCountry =
  TrackTargetedCountry {countryCode = Core.Nothing}

instance Core.FromJSON TrackTargetedCountry where
  parseJSON =
    Core.withObject
      "TrackTargetedCountry"
      (\o -> TrackTargetedCountry Core.<$> (o Core..:? "countryCode"))

instance Core.ToJSON TrackTargetedCountry where
  toJSON TrackTargetedCountry {..} =
    Core.object
      (Core.catMaybes [("countryCode" Core..=) Core.<$> countryCode])

-- | Response listing all tracks.
--
-- /See:/ 'newTracksListResponse' smart constructor.
data TracksListResponse = TracksListResponse
  { -- | The kind of this response (\"androidpublisher#tracksListResponse\").
    kind :: (Core.Maybe Core.Text),
    -- | All tracks (including tracks with no releases).
    tracks :: (Core.Maybe [Track])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'TracksListResponse' with the minimum fields required to make a request.
newTracksListResponse ::
  TracksListResponse
newTracksListResponse =
  TracksListResponse {kind = Core.Nothing, tracks = Core.Nothing}

instance Core.FromJSON TracksListResponse where
  parseJSON =
    Core.withObject
      "TracksListResponse"
      ( \o ->
          TracksListResponse
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "tracks")
      )

instance Core.ToJSON TracksListResponse where
  toJSON TracksListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("tracks" Core..=) Core.<$> tracks
          ]
      )

-- | Request message to update the state of a subscription base plan.
--
-- /See:/ 'newUpdateBasePlanStateRequest' smart constructor.
data UpdateBasePlanStateRequest = UpdateBasePlanStateRequest
  { -- | Activates a base plan. Once activated, base plans will be available to new subscribers.
    activateBasePlanRequest :: (Core.Maybe ActivateBasePlanRequest),
    -- | Deactivates a base plan. Once deactivated, the base plan will become unavailable to new subscribers, but existing subscribers will maintain their subscription
    deactivateBasePlanRequest :: (Core.Maybe DeactivateBasePlanRequest)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UpdateBasePlanStateRequest' with the minimum fields required to make a request.
newUpdateBasePlanStateRequest ::
  UpdateBasePlanStateRequest
newUpdateBasePlanStateRequest =
  UpdateBasePlanStateRequest
    { activateBasePlanRequest =
        Core.Nothing,
      deactivateBasePlanRequest = Core.Nothing
    }

instance Core.FromJSON UpdateBasePlanStateRequest where
  parseJSON =
    Core.withObject
      "UpdateBasePlanStateRequest"
      ( \o ->
          UpdateBasePlanStateRequest
            Core.<$> (o Core..:? "activateBasePlanRequest")
            Core.<*> (o Core..:? "deactivateBasePlanRequest")
      )

instance Core.ToJSON UpdateBasePlanStateRequest where
  toJSON UpdateBasePlanStateRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("activateBasePlanRequest" Core..=)
              Core.<$> activateBasePlanRequest,
            ("deactivateBasePlanRequest" Core..=)
              Core.<$> deactivateBasePlanRequest
          ]
      )

-- | Request message for UpdateSubscriptionOffer.
--
-- /See:/ 'newUpdateSubscriptionOfferRequest' smart constructor.
data UpdateSubscriptionOfferRequest = UpdateSubscriptionOfferRequest
  { -- | Optional. If set to true, and the subscription offer with the given package/name, product/id, base/plan/id and offer/id doesn\'t exist, an offer will be created. If a new offer is created, update/mask is ignored.
    allowMissing :: (Core.Maybe Core.Bool),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe UpdateSubscriptionOfferRequest_LatencyTolerance),
    -- | Required. The version of the available regions being used for the subscription_offer.
    regionsVersion :: (Core.Maybe RegionsVersion),
    -- | Required. The subscription offer to update.
    subscriptionOffer :: (Core.Maybe SubscriptionOffer),
    -- | Required. The list of fields to be updated.
    updateMask :: (Core.Maybe Core.FieldMask)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UpdateSubscriptionOfferRequest' with the minimum fields required to make a request.
newUpdateSubscriptionOfferRequest ::
  UpdateSubscriptionOfferRequest
newUpdateSubscriptionOfferRequest =
  UpdateSubscriptionOfferRequest
    { allowMissing = Core.Nothing,
      latencyTolerance = Core.Nothing,
      regionsVersion = Core.Nothing,
      subscriptionOffer = Core.Nothing,
      updateMask = Core.Nothing
    }

instance Core.FromJSON UpdateSubscriptionOfferRequest where
  parseJSON =
    Core.withObject
      "UpdateSubscriptionOfferRequest"
      ( \o ->
          UpdateSubscriptionOfferRequest
            Core.<$> (o Core..:? "allowMissing")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "regionsVersion")
            Core.<*> (o Core..:? "subscriptionOffer")
            Core.<*> (o Core..:? "updateMask")
      )

instance Core.ToJSON UpdateSubscriptionOfferRequest where
  toJSON UpdateSubscriptionOfferRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowMissing" Core..=) Core.<$> allowMissing,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("regionsVersion" Core..=) Core.<$> regionsVersion,
            ("subscriptionOffer" Core..=) Core.<$> subscriptionOffer,
            ("updateMask" Core..=) Core.<$> updateMask
          ]
      )

-- | Request message to update the state of a subscription offer.
--
-- /See:/ 'newUpdateSubscriptionOfferStateRequest' smart constructor.
data UpdateSubscriptionOfferStateRequest = UpdateSubscriptionOfferStateRequest
  { -- | Activates an offer. Once activated, the offer will be available to new subscribers.
    activateSubscriptionOfferRequest :: (Core.Maybe ActivateSubscriptionOfferRequest),
    -- | Deactivates an offer. Once deactivated, the offer will become unavailable to new subscribers, but existing subscribers will maintain their subscription
    deactivateSubscriptionOfferRequest :: (Core.Maybe DeactivateSubscriptionOfferRequest)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UpdateSubscriptionOfferStateRequest' with the minimum fields required to make a request.
newUpdateSubscriptionOfferStateRequest ::
  UpdateSubscriptionOfferStateRequest
newUpdateSubscriptionOfferStateRequest =
  UpdateSubscriptionOfferStateRequest
    { activateSubscriptionOfferRequest =
        Core.Nothing,
      deactivateSubscriptionOfferRequest = Core.Nothing
    }

instance Core.FromJSON UpdateSubscriptionOfferStateRequest where
  parseJSON =
    Core.withObject
      "UpdateSubscriptionOfferStateRequest"
      ( \o ->
          UpdateSubscriptionOfferStateRequest
            Core.<$> (o Core..:? "activateSubscriptionOfferRequest")
            Core.<*> (o Core..:? "deactivateSubscriptionOfferRequest")
      )

instance Core.ToJSON UpdateSubscriptionOfferStateRequest where
  toJSON UpdateSubscriptionOfferStateRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("activateSubscriptionOfferRequest" Core..=)
              Core.<$> activateSubscriptionOfferRequest,
            ("deactivateSubscriptionOfferRequest" Core..=)
              Core.<$> deactivateSubscriptionOfferRequest
          ]
      )

-- | Request message for UpdateSubscription.
--
-- /See:/ 'newUpdateSubscriptionRequest' smart constructor.
data UpdateSubscriptionRequest = UpdateSubscriptionRequest
  { -- | Optional. If set to true, and the subscription with the given package/name and product/id doesn\'t exist, the subscription will be created. If a new subscription is created, update_mask is ignored.
    allowMissing :: (Core.Maybe Core.Bool),
    -- | Optional. The latency tolerance for the propagation of this product update. Defaults to latency-sensitive.
    latencyTolerance :: (Core.Maybe UpdateSubscriptionRequest_LatencyTolerance),
    -- | Required. The version of the available regions being used for the subscription.
    regionsVersion :: (Core.Maybe RegionsVersion),
    -- | Required. The subscription to update.
    subscription :: (Core.Maybe Subscription),
    -- | Required. The list of fields to be updated.
    updateMask :: (Core.Maybe Core.FieldMask)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UpdateSubscriptionRequest' with the minimum fields required to make a request.
newUpdateSubscriptionRequest ::
  UpdateSubscriptionRequest
newUpdateSubscriptionRequest =
  UpdateSubscriptionRequest
    { allowMissing = Core.Nothing,
      latencyTolerance = Core.Nothing,
      regionsVersion = Core.Nothing,
      subscription = Core.Nothing,
      updateMask = Core.Nothing
    }

instance Core.FromJSON UpdateSubscriptionRequest where
  parseJSON =
    Core.withObject
      "UpdateSubscriptionRequest"
      ( \o ->
          UpdateSubscriptionRequest
            Core.<$> (o Core..:? "allowMissing")
            Core.<*> (o Core..:? "latencyTolerance")
            Core.<*> (o Core..:? "regionsVersion")
            Core.<*> (o Core..:? "subscription")
            Core.<*> (o Core..:? "updateMask")
      )

instance Core.ToJSON UpdateSubscriptionRequest where
  toJSON UpdateSubscriptionRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowMissing" Core..=) Core.<$> allowMissing,
            ("latencyTolerance" Core..=) Core.<$> latencyTolerance,
            ("regionsVersion" Core..=) Core.<$> regionsVersion,
            ("subscription" Core..=) Core.<$> subscription,
            ("updateMask" Core..=) Core.<$> updateMask
          ]
      )

-- | Represents a targeting rule of the form: User currently has {scope} [with billing period {billing_period}].
--
-- /See:/ 'newUpgradeTargetingRule' smart constructor.
data UpgradeTargetingRule = UpgradeTargetingRule
  { -- | The specific billing period duration, specified in ISO 8601 format, that a user must be currently subscribed to to be eligible for this rule. If not specified, users subscribed to any billing period are matched.
    billingPeriodDuration :: (Core.Maybe Core.Text),
    -- | Limit this offer to only once per user. If set to true, a user can never be eligible for this offer again if they ever subscribed to this offer.
    oncePerUser :: (Core.Maybe Core.Bool),
    -- | Required. The scope of subscriptions this rule considers. Only allows \"this subscription\" and \"specific subscription in app\".
    scope :: (Core.Maybe TargetingRuleScope)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UpgradeTargetingRule' with the minimum fields required to make a request.
newUpgradeTargetingRule ::
  UpgradeTargetingRule
newUpgradeTargetingRule =
  UpgradeTargetingRule
    { billingPeriodDuration = Core.Nothing,
      oncePerUser = Core.Nothing,
      scope = Core.Nothing
    }

instance Core.FromJSON UpgradeTargetingRule where
  parseJSON =
    Core.withObject
      "UpgradeTargetingRule"
      ( \o ->
          UpgradeTargetingRule
            Core.<$> (o Core..:? "billingPeriodDuration")
            Core.<*> (o Core..:? "oncePerUser")
            Core.<*> (o Core..:? "scope")
      )

instance Core.ToJSON UpgradeTargetingRule where
  toJSON UpgradeTargetingRule {..} =
    Core.object
      ( Core.catMaybes
          [ ("billingPeriodDuration" Core..=) Core.<$> billingPeriodDuration,
            ("oncePerUser" Core..=) Core.<$> oncePerUser,
            ("scope" Core..=) Core.<$> scope
          ]
      )

-- | A user resource.
--
-- /See:/ 'newUser' smart constructor.
data User = User
  { -- | Output only. The state of the user\'s access to the Play Console.
    accessState :: (Core.Maybe User_AccessState),
    -- | Permissions for the user which apply across the developer account.
    developerAccountPermissions :: (Core.Maybe [User_DeveloperAccountPermissionsItem]),
    -- | Immutable. The user\'s email address.
    email :: (Core.Maybe Core.Text),
    -- | The time at which the user\'s access expires, if set. When setting this value, it must always be in the future.
    expirationTime :: (Core.Maybe Core.DateTime),
    -- | Output only. Per-app permissions for the user.
    grants :: (Core.Maybe [Grant]),
    -- | Required. Resource name for this user, following the pattern \"developers\/{developer}\/users\/{email}\".
    name :: (Core.Maybe Core.Text),
    -- | Output only. Whether there are more permissions for the user that are not represented here. This can happen if the caller does not have permission to manage all apps in the account. This is also @true@ if this user is the account owner. If this field is @true@, it should be taken as a signal that this user cannot be fully managed via the API. That is, the API caller is not be able to manage all of the permissions this user holds, either because it doesn\'t know about them or because the user is the account owner.
    partial :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'User' with the minimum fields required to make a request.
newUser ::
  User
newUser =
  User
    { accessState = Core.Nothing,
      developerAccountPermissions = Core.Nothing,
      email = Core.Nothing,
      expirationTime = Core.Nothing,
      grants = Core.Nothing,
      name = Core.Nothing,
      partial = Core.Nothing
    }

instance Core.FromJSON User where
  parseJSON =
    Core.withObject
      "User"
      ( \o ->
          User
            Core.<$> (o Core..:? "accessState")
            Core.<*> (o Core..:? "developerAccountPermissions")
            Core.<*> (o Core..:? "email")
            Core.<*> (o Core..:? "expirationTime")
            Core.<*> (o Core..:? "grants")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "partial")
      )

instance Core.ToJSON User where
  toJSON User {..} =
    Core.object
      ( Core.catMaybes
          [ ("accessState" Core..=) Core.<$> accessState,
            ("developerAccountPermissions" Core..=)
              Core.<$> developerAccountPermissions,
            ("email" Core..=) Core.<$> email,
            ("expirationTime" Core..=) Core.<$> expirationTime,
            ("grants" Core..=) Core.<$> grants,
            ("name" Core..=) Core.<$> name,
            ("partial" Core..=) Core.<$> partial
          ]
      )

-- | User entry from conversation between user and developer.
--
-- /See:/ 'newUserComment' smart constructor.
data UserComment = UserComment
  { -- | Integer Android SDK version of the user\'s device at the time the review was written, e.g. 23 is Marshmallow. May be absent.
    androidOsVersion :: (Core.Maybe Core.Int32),
    -- | Integer version code of the app as installed at the time the review was written. May be absent.
    appVersionCode :: (Core.Maybe Core.Int32),
    -- | String version name of the app as installed at the time the review was written. May be absent.
    appVersionName :: (Core.Maybe Core.Text),
    -- | Codename for the reviewer\'s device, e.g. klte, flounder. May be absent.
    device :: (Core.Maybe Core.Text),
    -- | Information about the characteristics of the user\'s device.
    deviceMetadata :: (Core.Maybe DeviceMetadata),
    -- | The last time at which this comment was updated.
    lastModified :: (Core.Maybe Timestamp),
    -- | Untranslated text of the review, where the review was translated. If the review was not translated this is left blank.
    originalText :: (Core.Maybe Core.Text),
    -- | Language code for the reviewer. This is taken from the device settings so is not guaranteed to match the language the review is written in. May be absent.
    reviewerLanguage :: (Core.Maybe Core.Text),
    -- | The star rating associated with the review, from 1 to 5.
    starRating :: (Core.Maybe Core.Int32),
    -- | The content of the comment, i.e. review body. In some cases users have been able to write a review with separate title and body; in those cases the title and body are concatenated and separated by a tab character.
    text :: (Core.Maybe Core.Text),
    -- | Number of users who have given this review a thumbs down.
    thumbsDownCount :: (Core.Maybe Core.Int32),
    -- | Number of users who have given this review a thumbs up.
    thumbsUpCount :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserComment' with the minimum fields required to make a request.
newUserComment ::
  UserComment
newUserComment =
  UserComment
    { androidOsVersion = Core.Nothing,
      appVersionCode = Core.Nothing,
      appVersionName = Core.Nothing,
      device = Core.Nothing,
      deviceMetadata = Core.Nothing,
      lastModified = Core.Nothing,
      originalText = Core.Nothing,
      reviewerLanguage = Core.Nothing,
      starRating = Core.Nothing,
      text = Core.Nothing,
      thumbsDownCount = Core.Nothing,
      thumbsUpCount = Core.Nothing
    }

instance Core.FromJSON UserComment where
  parseJSON =
    Core.withObject
      "UserComment"
      ( \o ->
          UserComment
            Core.<$> (o Core..:? "androidOsVersion")
            Core.<*> (o Core..:? "appVersionCode")
            Core.<*> (o Core..:? "appVersionName")
            Core.<*> (o Core..:? "device")
            Core.<*> (o Core..:? "deviceMetadata")
            Core.<*> (o Core..:? "lastModified")
            Core.<*> (o Core..:? "originalText")
            Core.<*> (o Core..:? "reviewerLanguage")
            Core.<*> (o Core..:? "starRating")
            Core.<*> (o Core..:? "text")
            Core.<*> (o Core..:? "thumbsDownCount")
            Core.<*> (o Core..:? "thumbsUpCount")
      )

instance Core.ToJSON UserComment where
  toJSON UserComment {..} =
    Core.object
      ( Core.catMaybes
          [ ("androidOsVersion" Core..=) Core.<$> androidOsVersion,
            ("appVersionCode" Core..=) Core.<$> appVersionCode,
            ("appVersionName" Core..=) Core.<$> appVersionName,
            ("device" Core..=) Core.<$> device,
            ("deviceMetadata" Core..=) Core.<$> deviceMetadata,
            ("lastModified" Core..=) Core.<$> lastModified,
            ("originalText" Core..=) Core.<$> originalText,
            ("reviewerLanguage" Core..=) Core.<$> reviewerLanguage,
            ("starRating" Core..=) Core.<$> starRating,
            ("text" Core..=) Core.<$> text,
            ("thumbsDownCount" Core..=) Core.<$> thumbsDownCount,
            ("thumbsUpCount" Core..=) Core.<$> thumbsUpCount
          ]
      )

-- | Describes an inclusive\/exclusive list of country codes that module targets.
--
-- /See:/ 'newUserCountriesTargeting' smart constructor.
data UserCountriesTargeting = UserCountriesTargeting
  { -- | List of country codes in the two-letter CLDR territory format.
    countryCodes :: (Core.Maybe [Core.Text]),
    -- | Indicates if the list above is exclusive.
    exclude :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserCountriesTargeting' with the minimum fields required to make a request.
newUserCountriesTargeting ::
  UserCountriesTargeting
newUserCountriesTargeting =
  UserCountriesTargeting
    { countryCodes = Core.Nothing,
      exclude = Core.Nothing
    }

instance Core.FromJSON UserCountriesTargeting where
  parseJSON =
    Core.withObject
      "UserCountriesTargeting"
      ( \o ->
          UserCountriesTargeting
            Core.<$> (o Core..:? "countryCodes")
            Core.<*> (o Core..:? "exclude")
      )

instance Core.ToJSON UserCountriesTargeting where
  toJSON UserCountriesTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("countryCodes" Core..=) Core.<$> countryCodes,
            ("exclude" Core..=) Core.<$> exclude
          ]
      )

-- | A set of user countries. A country set determines what variation of app content gets served to a specific location.
--
-- /See:/ 'newUserCountrySet' smart constructor.
data UserCountrySet = UserCountrySet
  { -- | List of country codes representing countries. A Country code is represented in ISO 3166 alpha-2 format. For Example:- \"IT\" for Italy, \"GE\" for Georgia.
    countryCodes :: (Core.Maybe [Core.Text]),
    -- | Country set name.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserCountrySet' with the minimum fields required to make a request.
newUserCountrySet ::
  UserCountrySet
newUserCountrySet =
  UserCountrySet {countryCodes = Core.Nothing, name = Core.Nothing}

instance Core.FromJSON UserCountrySet where
  parseJSON =
    Core.withObject
      "UserCountrySet"
      ( \o ->
          UserCountrySet
            Core.<$> (o Core..:? "countryCodes")
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON UserCountrySet where
  toJSON UserCountrySet {..} =
    Core.object
      ( Core.catMaybes
          [ ("countryCodes" Core..=) Core.<$> countryCodes,
            ("name" Core..=) Core.<$> name
          ]
      )

-- | Information specific to cancellations initiated by users.
--
-- /See:/ 'newUserInitiatedCancellation' smart constructor.
data UserInitiatedCancellation = UserInitiatedCancellation
  { -- | Information provided by the user when they complete the subscription cancellation flow (cancellation reason survey).
    cancelSurveyResult :: (Core.Maybe CancelSurveyResult),
    -- | The time at which the subscription was canceled by the user. The user might still have access to the subscription after this time. Use line/items.expiry/time to determine if a user still has access.
    cancelTime :: (Core.Maybe Core.DateTime)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserInitiatedCancellation' with the minimum fields required to make a request.
newUserInitiatedCancellation ::
  UserInitiatedCancellation
newUserInitiatedCancellation =
  UserInitiatedCancellation
    { cancelSurveyResult = Core.Nothing,
      cancelTime = Core.Nothing
    }

instance Core.FromJSON UserInitiatedCancellation where
  parseJSON =
    Core.withObject
      "UserInitiatedCancellation"
      ( \o ->
          UserInitiatedCancellation
            Core.<$> (o Core..:? "cancelSurveyResult")
            Core.<*> (o Core..:? "cancelTime")
      )

instance Core.ToJSON UserInitiatedCancellation where
  toJSON UserInitiatedCancellation {..} =
    Core.object
      ( Core.catMaybes
          [ ("cancelSurveyResult" Core..=) Core.<$> cancelSurveyResult,
            ("cancelTime" Core..=) Core.<$> cancelTime
          ]
      )

-- | A permission used by this APK.
--
-- /See:/ 'newUsesPermission' smart constructor.
data UsesPermission = UsesPermission
  { -- | Optionally, the maximum SDK version for which the permission is required.
    maxSdkVersion :: (Core.Maybe Core.Int32),
    -- | The name of the permission requested.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UsesPermission' with the minimum fields required to make a request.
newUsesPermission ::
  UsesPermission
newUsesPermission =
  UsesPermission {maxSdkVersion = Core.Nothing, name = Core.Nothing}

instance Core.FromJSON UsesPermission where
  parseJSON =
    Core.withObject
      "UsesPermission"
      ( \o ->
          UsesPermission
            Core.<$> (o Core..:? "maxSdkVersion")
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON UsesPermission where
  toJSON UsesPermission {..} =
    Core.object
      ( Core.catMaybes
          [ ("maxSdkVersion" Core..=) Core.<$> maxSdkVersion,
            ("name" Core..=) Core.<$> name
          ]
      )

-- | A multiple use, predefined promotion code.
--
-- /See:/ 'newVanityCode' smart constructor.
newtype VanityCode = VanityCode
  { -- | The promotion code.
    promotionCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VanityCode' with the minimum fields required to make a request.
newVanityCode ::
  VanityCode
newVanityCode = VanityCode {promotionCode = Core.Nothing}

instance Core.FromJSON VanityCode where
  parseJSON =
    Core.withObject
      "VanityCode"
      (\o -> VanityCode Core.<$> (o Core..:? "promotionCode"))

instance Core.ToJSON VanityCode where
  toJSON VanityCode {..} =
    Core.object
      (Core.catMaybes [("promotionCode" Core..=) Core.<$> promotionCode])

-- | APK that is suitable for inclusion in a system image. The resource of SystemApksService.
--
-- /See:/ 'newVariant' smart constructor.
data Variant = Variant
  { -- | The device spec used to generate the APK.
    deviceSpec :: (Core.Maybe DeviceSpec),
    -- | Optional. Options applied to the generated APK.
    options :: (Core.Maybe SystemApkOptions),
    -- | Output only. The ID of a previously created system APK variant.
    variantId :: (Core.Maybe Core.Word32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Variant' with the minimum fields required to make a request.
newVariant ::
  Variant
newVariant =
  Variant
    { deviceSpec = Core.Nothing,
      options = Core.Nothing,
      variantId = Core.Nothing
    }

instance Core.FromJSON Variant where
  parseJSON =
    Core.withObject
      "Variant"
      ( \o ->
          Variant
            Core.<$> (o Core..:? "deviceSpec")
            Core.<*> (o Core..:? "options")
            Core.<*> (o Core..:? "variantId")
      )

instance Core.ToJSON Variant where
  toJSON Variant {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceSpec" Core..=) Core.<$> deviceSpec,
            ("options" Core..=) Core.<$> options,
            ("variantId" Core..=) Core.<$> variantId
          ]
      )

-- | Targeting on the level of variants.
--
-- /See:/ 'newVariantTargeting' smart constructor.
data VariantTargeting = VariantTargeting
  { -- | The abi that the variant targets
    abiTargeting :: (Core.Maybe AbiTargeting),
    -- | Multi-api-level targeting
    multiAbiTargeting :: (Core.Maybe MultiAbiTargeting),
    -- | The screen densities that this variant supports
    screenDensityTargeting :: (Core.Maybe ScreenDensityTargeting),
    -- | The sdk version that the variant targets
    sdkVersionTargeting :: (Core.Maybe SdkVersionTargeting),
    -- | Texture-compression-format-level targeting
    textureCompressionFormatTargeting :: (Core.Maybe TextureCompressionFormatTargeting)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VariantTargeting' with the minimum fields required to make a request.
newVariantTargeting ::
  VariantTargeting
newVariantTargeting =
  VariantTargeting
    { abiTargeting = Core.Nothing,
      multiAbiTargeting = Core.Nothing,
      screenDensityTargeting = Core.Nothing,
      sdkVersionTargeting = Core.Nothing,
      textureCompressionFormatTargeting = Core.Nothing
    }

instance Core.FromJSON VariantTargeting where
  parseJSON =
    Core.withObject
      "VariantTargeting"
      ( \o ->
          VariantTargeting
            Core.<$> (o Core..:? "abiTargeting")
            Core.<*> (o Core..:? "multiAbiTargeting")
            Core.<*> (o Core..:? "screenDensityTargeting")
            Core.<*> (o Core..:? "sdkVersionTargeting")
            Core.<*> (o Core..:? "textureCompressionFormatTargeting")
      )

instance Core.ToJSON VariantTargeting where
  toJSON VariantTargeting {..} =
    Core.object
      ( Core.catMaybes
          [ ("abiTargeting" Core..=) Core.<$> abiTargeting,
            ("multiAbiTargeting" Core..=) Core.<$> multiAbiTargeting,
            ("screenDensityTargeting" Core..=) Core.<$> screenDensityTargeting,
            ("sdkVersionTargeting" Core..=) Core.<$> sdkVersionTargeting,
            ("textureCompressionFormatTargeting" Core..=)
              Core.<$> textureCompressionFormatTargeting
          ]
      )

-- | A VoidedPurchase resource indicates a purchase that was either canceled\/refunded\/charged-back.
--
-- /See:/ 'newVoidedPurchase' smart constructor.
data VoidedPurchase = VoidedPurchase
  { -- | This kind represents a voided purchase object in the androidpublisher service.
    kind :: (Core.Maybe Core.Text),
    -- | The order id which uniquely identifies a one-time purchase, subscription purchase, or subscription renewal.
    orderId :: (Core.Maybe Core.Text),
    -- | The time at which the purchase was made, in milliseconds since the epoch (Jan 1, 1970).
    purchaseTimeMillis :: (Core.Maybe Core.Int64),
    -- | The token which uniquely identifies a one-time purchase or subscription. To uniquely identify subscription renewals use order_id (available starting from version 3 of the API).
    purchaseToken :: (Core.Maybe Core.Text),
    -- | The voided quantity as the result of a quantity-based partial refund. Voided purchases of quantity-based partial refunds may only be returned when includeQuantityBasedPartialRefund is set to true.
    voidedQuantity :: (Core.Maybe Core.Int32),
    -- | The reason why the purchase was voided, possible values are: 0. Other 1. Remorse 2. Not/received 3. Defective 4. Accidental/purchase 5. Fraud 6. Friendly/fraud 7. Chargeback 8. Unacknowledged/purchase
    voidedReason :: (Core.Maybe Core.Int32),
    -- | The initiator of voided purchase, possible values are: 0. User 1. Developer 2. Google
    voidedSource :: (Core.Maybe Core.Int32),
    -- | The time at which the purchase was canceled\/refunded\/charged-back, in milliseconds since the epoch (Jan 1, 1970).
    voidedTimeMillis :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VoidedPurchase' with the minimum fields required to make a request.
newVoidedPurchase ::
  VoidedPurchase
newVoidedPurchase =
  VoidedPurchase
    { kind = Core.Nothing,
      orderId = Core.Nothing,
      purchaseTimeMillis = Core.Nothing,
      purchaseToken = Core.Nothing,
      voidedQuantity = Core.Nothing,
      voidedReason = Core.Nothing,
      voidedSource = Core.Nothing,
      voidedTimeMillis = Core.Nothing
    }

instance Core.FromJSON VoidedPurchase where
  parseJSON =
    Core.withObject
      "VoidedPurchase"
      ( \o ->
          VoidedPurchase
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "orderId")
            Core.<*> ( o
                         Core..:? "purchaseTimeMillis"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "purchaseToken")
            Core.<*> (o Core..:? "voidedQuantity")
            Core.<*> (o Core..:? "voidedReason")
            Core.<*> (o Core..:? "voidedSource")
            Core.<*> (o Core..:? "voidedTimeMillis" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON VoidedPurchase where
  toJSON VoidedPurchase {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("orderId" Core..=) Core.<$> orderId,
            ("purchaseTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> purchaseTimeMillis,
            ("purchaseToken" Core..=) Core.<$> purchaseToken,
            ("voidedQuantity" Core..=) Core.<$> voidedQuantity,
            ("voidedReason" Core..=) Core.<$> voidedReason,
            ("voidedSource" Core..=) Core.<$> voidedSource,
            ("voidedTimeMillis" Core..=)
              Core.. Core.AsText
              Core.<$> voidedTimeMillis
          ]
      )

-- | Response for the voidedpurchases.list API.
--
-- /See:/ 'newVoidedPurchasesListResponse' smart constructor.
data VoidedPurchasesListResponse = VoidedPurchasesListResponse
  { -- | General pagination information.
    pageInfo :: (Core.Maybe PageInfo),
    -- | Pagination information for token pagination.
    tokenPagination :: (Core.Maybe TokenPagination),
    voidedPurchases :: (Core.Maybe [VoidedPurchase])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VoidedPurchasesListResponse' with the minimum fields required to make a request.
newVoidedPurchasesListResponse ::
  VoidedPurchasesListResponse
newVoidedPurchasesListResponse =
  VoidedPurchasesListResponse
    { pageInfo = Core.Nothing,
      tokenPagination = Core.Nothing,
      voidedPurchases = Core.Nothing
    }

instance Core.FromJSON VoidedPurchasesListResponse where
  parseJSON =
    Core.withObject
      "VoidedPurchasesListResponse"
      ( \o ->
          VoidedPurchasesListResponse
            Core.<$> (o Core..:? "pageInfo")
            Core.<*> (o Core..:? "tokenPagination")
            Core.<*> (o Core..:? "voidedPurchases")
      )

instance Core.ToJSON VoidedPurchasesListResponse where
  toJSON VoidedPurchasesListResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("pageInfo" Core..=) Core.<$> pageInfo,
            ("tokenPagination" Core..=) Core.<$> tokenPagination,
            ("voidedPurchases" Core..=) Core.<$> voidedPurchases
          ]
      )