///
/// HybridRNCandleSpec.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 2025 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 `Service` to properly resolve imports.
namespace margelo::nitro::rncandle { enum class Service; }
// Forward declaration of `PresentationBackground` to properly resolve imports.
namespace margelo::nitro::rncandle { enum class PresentationBackground; }
// Forward declaration of `PresentationStyle` to properly resolve imports.
namespace margelo::nitro::rncandle { enum class PresentationStyle; }
// Forward declaration of `LinkedAccount` to properly resolve imports.
namespace margelo::nitro::rncandle { struct LinkedAccount; }
// Forward declaration of `TradeQuote` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradeQuote; }
// Forward declaration of `TradeExecutionResult` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradeExecutionResult; }
// Forward declaration of `LinkedAccountRef` to properly resolve imports.
namespace margelo::nitro::rncandle { struct LinkedAccountRef; }
// Forward declaration of `AssetAccountsResponse` to properly resolve imports.
namespace margelo::nitro::rncandle { struct AssetAccountsResponse; }
// Forward declaration of `AssetAccountsQuery` to properly resolve imports.
namespace margelo::nitro::rncandle { struct AssetAccountsQuery; }
// Forward declaration of `AssetAccount` to properly resolve imports.
namespace margelo::nitro::rncandle { struct AssetAccount; }
// Forward declaration of `AssetAccountRef` to properly resolve imports.
namespace margelo::nitro::rncandle { struct AssetAccountRef; }
// Forward declaration of `TradesResponse` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradesResponse; }
// Forward declaration of `TradesQuery` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradesQuery; }
// Forward declaration of `Trade` to properly resolve imports.
namespace margelo::nitro::rncandle { struct Trade; }
// Forward declaration of `TradeRef` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradeRef; }
// Forward declaration of `TradeQuotesResponse` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradeQuotesResponse; }
// Forward declaration of `TradeQuotesRequest` to properly resolve imports.
namespace margelo::nitro::rncandle { struct TradeQuotesRequest; }

#include "Service.hpp"
#include <vector>
#include <optional>
#include <string>
#include "PresentationBackground.hpp"
#include "PresentationStyle.hpp"
#include "LinkedAccount.hpp"
#include <functional>
#include "TradeQuote.hpp"
#include "TradeExecutionResult.hpp"
#include <NitroModules/Promise.hpp>
#include "LinkedAccountRef.hpp"
#include "AssetAccountsResponse.hpp"
#include "AssetAccountsQuery.hpp"
#include "AssetAccount.hpp"
#include "AssetAccountRef.hpp"
#include "TradesResponse.hpp"
#include "TradesQuery.hpp"
#include "Trade.hpp"
#include "TradeRef.hpp"
#include "TradeQuotesResponse.hpp"
#include "TradeQuotesRequest.hpp"

namespace margelo::nitro::rncandle {

  using namespace margelo::nitro;

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

      // Destructor
      ~HybridRNCandleSpec() override = default;

    public:
      // Properties
      

    public:
      // Methods
      virtual void candleLinkSheet(bool isPresented, const std::optional<std::vector<Service>>& services, double cornerRadius, const std::optional<std::string>& customerName, bool showDynamicLoading, PresentationBackground presentationBackground, PresentationStyle presentationStyle, const std::function<void(const LinkedAccount& /* account */)>& onSuccess) = 0;
      virtual void candleTradeExecutionSheet(const TradeQuote& tradeQuote, PresentationBackground presentationBackground, const std::function<void(const TradeExecutionResult& /* result */)>& completion) = 0;
      virtual void initialize(const std::string& appKey, const std::string& appSecret, const std::optional<std::string>& accessGroup) = 0;
      virtual std::shared_ptr<Promise<std::vector<LinkedAccount>>> getLinkedAccounts() = 0;
      virtual std::shared_ptr<Promise<LinkedAccount>> getLinkedAccount(const LinkedAccountRef& ref) = 0;
      virtual std::shared_ptr<Promise<void>> unlinkAccount(const LinkedAccountRef& ref) = 0;
      virtual std::shared_ptr<Promise<AssetAccountsResponse>> getAssetAccounts(const AssetAccountsQuery& query) = 0;
      virtual std::shared_ptr<Promise<AssetAccount>> getAssetAccount(const AssetAccountRef& ref) = 0;
      virtual std::shared_ptr<Promise<TradesResponse>> getTrades(const TradesQuery& query) = 0;
      virtual std::shared_ptr<Promise<Trade>> getTrade(const TradeRef& ref) = 0;
      virtual std::shared_ptr<Promise<TradeQuotesResponse>> getTradeQuotes(const TradeQuotesRequest& request) = 0;
      virtual std::shared_ptr<Promise<Trade>> executeTrade(const TradeQuote& quote) = 0;
      virtual std::shared_ptr<Promise<void>> createUser(const std::string& appUserID) = 0;
      virtual std::shared_ptr<Promise<void>> deleteUser() = 0;

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

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

} // namespace margelo::nitro::rncandle
