///
/// HybridRnIapSpec.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#pragma once

#if __has_include(<NitroModules/HybridObject.hpp>)
#include <NitroModules/HybridObject.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif

// Forward declaration of `InitConnectionConfig` to properly resolve imports.
namespace margelo::nitro::iap { struct InitConnectionConfig; }
// Forward declaration of `NitroProduct` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroProduct; }
// Forward declaration of `PurchaseAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct PurchaseAndroid; }
// Forward declaration of `PurchaseIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct PurchaseIOS; }
// Forward declaration of `NitroPurchaseRequest` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroPurchaseRequest; }
// Forward declaration of `NitroPurchase` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroPurchase; }
// Forward declaration of `NitroAvailablePurchasesOptions` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroAvailablePurchasesOptions; }
// Forward declaration of `NitroActiveSubscription` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroActiveSubscription; }
// Forward declaration of `NitroPurchaseResult` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroPurchaseResult; }
// Forward declaration of `NitroFinishTransactionParams` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroFinishTransactionParams; }
// Forward declaration of `NitroSubscriptionStatus` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroSubscriptionStatus; }
// Forward declaration of `NitroReceiptValidationResultIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroReceiptValidationResultIOS; }
// Forward declaration of `NitroReceiptValidationResultAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroReceiptValidationResultAndroid; }
// Forward declaration of `NitroReceiptValidationParams` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroReceiptValidationParams; }
// Forward declaration of `NitroVerifyPurchaseWithProviderResult` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroVerifyPurchaseWithProviderResult; }
// Forward declaration of `NitroVerifyPurchaseWithProviderProps` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroVerifyPurchaseWithProviderProps; }
// Forward declaration of `NitroDeepLinkOptionsAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroDeepLinkOptionsAndroid; }
// Forward declaration of `UserChoiceBillingDetails` to properly resolve imports.
namespace margelo::nitro::iap { struct UserChoiceBillingDetails; }
// Forward declaration of `DeveloperProvidedBillingDetailsAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct DeveloperProvidedBillingDetailsAndroid; }
// Forward declaration of `BillingProgramAndroid` to properly resolve imports.
namespace margelo::nitro::iap { enum class BillingProgramAndroid; }
// Forward declaration of `NitroBillingProgramAvailabilityResultAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroBillingProgramAvailabilityResultAndroid; }
// Forward declaration of `NitroBillingProgramReportingDetailsAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroBillingProgramReportingDetailsAndroid; }
// Forward declaration of `NitroLaunchExternalLinkParamsAndroid` to properly resolve imports.
namespace margelo::nitro::iap { struct NitroLaunchExternalLinkParamsAndroid; }
// Forward declaration of `ExternalPurchaseNoticeResultIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct ExternalPurchaseNoticeResultIOS; }
// Forward declaration of `ExternalPurchaseLinkResultIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct ExternalPurchaseLinkResultIOS; }
// Forward declaration of `ExternalPurchaseCustomLinkTokenResultIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct ExternalPurchaseCustomLinkTokenResultIOS; }
// Forward declaration of `ExternalPurchaseCustomLinkTokenTypeIOS` to properly resolve imports.
namespace margelo::nitro::iap { enum class ExternalPurchaseCustomLinkTokenTypeIOS; }
// Forward declaration of `ExternalPurchaseCustomLinkNoticeResultIOS` to properly resolve imports.
namespace margelo::nitro::iap { struct ExternalPurchaseCustomLinkNoticeResultIOS; }
// Forward declaration of `ExternalPurchaseCustomLinkNoticeTypeIOS` to properly resolve imports.
namespace margelo::nitro::iap { enum class ExternalPurchaseCustomLinkNoticeTypeIOS; }

#include <NitroModules/Promise.hpp>
#include <NitroModules/Null.hpp>
#include "InitConnectionConfig.hpp"
#include <variant>
#include <optional>
#include "NitroProduct.hpp"
#include <vector>
#include <string>
#include "PurchaseAndroid.hpp"
#include "PurchaseIOS.hpp"
#include "NitroPurchaseRequest.hpp"
#include "NitroPurchase.hpp"
#include "NitroAvailablePurchasesOptions.hpp"
#include "NitroActiveSubscription.hpp"
#include "NitroPurchaseResult.hpp"
#include "NitroFinishTransactionParams.hpp"
#include <functional>
#include "NitroSubscriptionStatus.hpp"
#include "NitroReceiptValidationResultIOS.hpp"
#include "NitroReceiptValidationResultAndroid.hpp"
#include "NitroReceiptValidationParams.hpp"
#include "NitroVerifyPurchaseWithProviderResult.hpp"
#include "NitroVerifyPurchaseWithProviderProps.hpp"
#include "NitroDeepLinkOptionsAndroid.hpp"
#include "UserChoiceBillingDetails.hpp"
#include "DeveloperProvidedBillingDetailsAndroid.hpp"
#include "BillingProgramAndroid.hpp"
#include "NitroBillingProgramAvailabilityResultAndroid.hpp"
#include "NitroBillingProgramReportingDetailsAndroid.hpp"
#include "NitroLaunchExternalLinkParamsAndroid.hpp"
#include "ExternalPurchaseNoticeResultIOS.hpp"
#include "ExternalPurchaseLinkResultIOS.hpp"
#include "ExternalPurchaseCustomLinkTokenResultIOS.hpp"
#include "ExternalPurchaseCustomLinkTokenTypeIOS.hpp"
#include "ExternalPurchaseCustomLinkNoticeResultIOS.hpp"
#include "ExternalPurchaseCustomLinkNoticeTypeIOS.hpp"

namespace margelo::nitro::iap {

  using namespace margelo::nitro;

  /**
   * An abstract base class for `RnIap`
   * Inherit this class to create instances of `HybridRnIapSpec` in C++.
   * You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
   * @example
   * ```cpp
   * class HybridRnIap: public HybridRnIapSpec {
   * public:
   *   HybridRnIap(...): HybridObject(TAG) { ... }
   *   // ...
   * };
   * ```
   */
  class HybridRnIapSpec: public virtual HybridObject {
    public:
      // Constructor
      explicit HybridRnIapSpec(): HybridObject(TAG) { }

      // Destructor
      ~HybridRnIapSpec() override = default;

    public:
      // Properties
      

    public:
      // Methods
      virtual std::shared_ptr<Promise<bool>> initConnection(const std::optional<std::variant<nitro::NullType, InitConnectionConfig>>& config) = 0;
      virtual std::shared_ptr<Promise<bool>> endConnection() = 0;
      virtual std::shared_ptr<Promise<std::vector<NitroProduct>>> fetchProducts(const std::vector<std::string>& skus, const std::string& type) = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, PurchaseAndroid, PurchaseIOS, std::vector<std::variant<PurchaseAndroid, PurchaseIOS>>>>> requestPurchase(const NitroPurchaseRequest& request) = 0;
      virtual std::shared_ptr<Promise<std::vector<NitroPurchase>>> getAvailablePurchases(const std::optional<NitroAvailablePurchasesOptions>& options) = 0;
      virtual std::shared_ptr<Promise<std::vector<NitroActiveSubscription>>> getActiveSubscriptions(const std::optional<std::vector<std::string>>& subscriptionIds) = 0;
      virtual std::shared_ptr<Promise<bool>> hasActiveSubscriptions(const std::optional<std::vector<std::string>>& subscriptionIds) = 0;
      virtual std::shared_ptr<Promise<std::variant<bool, NitroPurchaseResult>>> finishTransaction(const NitroFinishTransactionParams& params) = 0;
      virtual void addPurchaseUpdatedListener(const std::function<void(const NitroPurchase& /* purchase */)>& listener) = 0;
      virtual void addPurchaseErrorListener(const std::function<void(const NitroPurchaseResult& /* error */)>& listener) = 0;
      virtual void removePurchaseUpdatedListener(const std::function<void(const NitroPurchase& /* purchase */)>& listener) = 0;
      virtual void removePurchaseErrorListener(const std::function<void(const NitroPurchaseResult& /* error */)>& listener) = 0;
      virtual void addPromotedProductListenerIOS(const std::function<void(const NitroProduct& /* product */)>& listener) = 0;
      virtual void removePromotedProductListenerIOS(const std::function<void(const NitroProduct& /* product */)>& listener) = 0;
      virtual std::shared_ptr<Promise<std::string>> getStorefrontIOS() = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, std::string>>> getAppTransactionIOS() = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, NitroProduct>>> requestPromotedProductIOS() = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, NitroProduct>>> getPromotedProductIOS() = 0;
      virtual std::shared_ptr<Promise<void>> buyPromotedProductIOS() = 0;
      virtual std::shared_ptr<Promise<bool>> presentCodeRedemptionSheetIOS() = 0;
      virtual std::shared_ptr<Promise<void>> clearTransactionIOS() = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, std::string>>> beginRefundRequestIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, std::vector<NitroSubscriptionStatus>>>> subscriptionStatusIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, NitroPurchase>>> currentEntitlementIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, NitroPurchase>>> latestTransactionIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::vector<NitroPurchase>>> getPendingTransactionsIOS() = 0;
      virtual std::shared_ptr<Promise<bool>> syncIOS() = 0;
      virtual std::shared_ptr<Promise<std::vector<NitroPurchase>>> showManageSubscriptionsIOS() = 0;
      virtual std::shared_ptr<Promise<bool>> deepLinkToSubscriptionsIOS() = 0;
      virtual std::shared_ptr<Promise<bool>> isEligibleForIntroOfferIOS(const std::string& groupID) = 0;
      virtual std::shared_ptr<Promise<std::string>> getReceiptDataIOS() = 0;
      virtual std::shared_ptr<Promise<std::string>> getReceiptIOS() = 0;
      virtual std::shared_ptr<Promise<std::string>> requestReceiptRefreshIOS() = 0;
      virtual std::shared_ptr<Promise<bool>> isTransactionVerifiedIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, std::string>>> getTransactionJwsIOS(const std::string& sku) = 0;
      virtual std::shared_ptr<Promise<std::variant<NitroReceiptValidationResultIOS, NitroReceiptValidationResultAndroid>>> validateReceipt(const NitroReceiptValidationParams& params) = 0;
      virtual std::shared_ptr<Promise<NitroVerifyPurchaseWithProviderResult>> verifyPurchaseWithProvider(const NitroVerifyPurchaseWithProviderProps& params) = 0;
      virtual std::shared_ptr<Promise<std::string>> getStorefront() = 0;
      virtual std::shared_ptr<Promise<void>> deepLinkToSubscriptionsAndroid(const NitroDeepLinkOptionsAndroid& options) = 0;
      virtual std::shared_ptr<Promise<bool>> checkAlternativeBillingAvailabilityAndroid() = 0;
      virtual std::shared_ptr<Promise<bool>> showAlternativeBillingDialogAndroid() = 0;
      virtual std::shared_ptr<Promise<std::variant<nitro::NullType, std::string>>> createAlternativeBillingTokenAndroid(const std::optional<std::variant<nitro::NullType, std::string>>& sku) = 0;
      virtual void addUserChoiceBillingListenerAndroid(const std::function<void(const UserChoiceBillingDetails& /* details */)>& listener) = 0;
      virtual void removeUserChoiceBillingListenerAndroid(const std::function<void(const UserChoiceBillingDetails& /* details */)>& listener) = 0;
      virtual void addDeveloperProvidedBillingListenerAndroid(const std::function<void(const DeveloperProvidedBillingDetailsAndroid& /* details */)>& listener) = 0;
      virtual void removeDeveloperProvidedBillingListenerAndroid(const std::function<void(const DeveloperProvidedBillingDetailsAndroid& /* details */)>& listener) = 0;
      virtual void addSubscriptionBillingIssueListener(const std::function<void(const NitroPurchase& /* purchase */)>& listener) = 0;
      virtual void removeSubscriptionBillingIssueListener(const std::function<void(const NitroPurchase& /* purchase */)>& listener) = 0;
      virtual void enableBillingProgramAndroid(BillingProgramAndroid program) = 0;
      virtual std::shared_ptr<Promise<NitroBillingProgramAvailabilityResultAndroid>> isBillingProgramAvailableAndroid(BillingProgramAndroid program) = 0;
      virtual std::shared_ptr<Promise<NitroBillingProgramReportingDetailsAndroid>> createBillingProgramReportingDetailsAndroid(BillingProgramAndroid program) = 0;
      virtual std::shared_ptr<Promise<bool>> launchExternalLinkAndroid(const NitroLaunchExternalLinkParamsAndroid& params) = 0;
      virtual std::shared_ptr<Promise<bool>> canPresentExternalPurchaseNoticeIOS() = 0;
      virtual std::shared_ptr<Promise<ExternalPurchaseNoticeResultIOS>> presentExternalPurchaseNoticeSheetIOS() = 0;
      virtual std::shared_ptr<Promise<ExternalPurchaseLinkResultIOS>> presentExternalPurchaseLinkIOS(const std::string& url) = 0;
      virtual std::shared_ptr<Promise<bool>> isEligibleForExternalPurchaseCustomLinkIOS() = 0;
      virtual std::shared_ptr<Promise<ExternalPurchaseCustomLinkTokenResultIOS>> getExternalPurchaseCustomLinkTokenIOS(ExternalPurchaseCustomLinkTokenTypeIOS tokenType) = 0;
      virtual std::shared_ptr<Promise<ExternalPurchaseCustomLinkNoticeResultIOS>> showExternalPurchaseCustomLinkNoticeIOS(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType) = 0;

    protected:
      // Hybrid Setup
      void loadHybridMethods() override;

    protected:
      // Tag for logging
      static constexpr auto TAG = "RnIap";
  };

} // namespace margelo::nitro::iap
