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

#pragma once

#include "HybridWorkoutProxySpec.hpp"

// Forward declaration of `HybridWorkoutProxySpec_cxx` to properly resolve imports.
namespace ReactNativeHealthkit { class HybridWorkoutProxySpec_cxx; }

// Forward declaration of `WorkoutActivityType` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class WorkoutActivityType; }
// Forward declaration of `Quantity` to properly resolve imports.
namespace margelo::nitro::healthkit { struct Quantity; }
// Forward declaration of `WorkoutEvent` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutEvent; }
// Forward declaration of `WorkoutEventType` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class WorkoutEventType; }
// Forward declaration of `WorkoutActivity` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutActivity; }
// Forward declaration of `SampleType` to properly resolve imports.
namespace margelo::nitro::healthkit { struct SampleType; }
// Forward declaration of `WeatherCondition` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class WeatherCondition; }
// Forward declaration of `InsulinDeliveryReason` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class InsulinDeliveryReason; }
// Forward declaration of `HeartRateMotionContext` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class HeartRateMotionContext; }
// Forward declaration of `SourceRevision` to properly resolve imports.
namespace margelo::nitro::healthkit { struct SourceRevision; }
// Forward declaration of `HybridSourceProxySpec` to properly resolve imports.
namespace margelo::nitro::healthkit { class HybridSourceProxySpec; }
// Forward declaration of `Device` to properly resolve imports.
namespace margelo::nitro::healthkit { struct Device; }
// Forward declaration of `WorkoutSample` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutSample; }
// Forward declaration of `LocationForSaving` to properly resolve imports.
namespace margelo::nitro::healthkit { struct LocationForSaving; }
// Forward declaration of `WorkoutPlan` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutPlan; }
// Forward declaration of `WorkoutRoute` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutRoute; }
// Forward declaration of `WorkoutRouteLocation` to properly resolve imports.
namespace margelo::nitro::healthkit { struct WorkoutRouteLocation; }
// Forward declaration of `QueryStatisticsResponse` to properly resolve imports.
namespace margelo::nitro::healthkit { struct QueryStatisticsResponse; }
// Forward declaration of `QuantityDateInterval` to properly resolve imports.
namespace margelo::nitro::healthkit { struct QuantityDateInterval; }
// Forward declaration of `QuantityTypeIdentifier` to properly resolve imports.
namespace margelo::nitro::healthkit { enum class QuantityTypeIdentifier; }

#include "WorkoutActivityType.hpp"
#include "Quantity.hpp"
#include <string>
#include <optional>
#include "WorkoutEvent.hpp"
#include <vector>
#include "WorkoutEventType.hpp"
#include <chrono>
#include <NitroModules/AnyMap.hpp>
#include "WorkoutActivity.hpp"
#include "SampleType.hpp"
#include "WeatherCondition.hpp"
#include "InsulinDeliveryReason.hpp"
#include "HeartRateMotionContext.hpp"
#include "SourceRevision.hpp"
#include <memory>
#include "HybridSourceProxySpec.hpp"
#include "Device.hpp"
#include "WorkoutSample.hpp"
#include <NitroModules/Promise.hpp>
#include "LocationForSaving.hpp"
#include "WorkoutPlan.hpp"
#include "WorkoutRoute.hpp"
#include "WorkoutRouteLocation.hpp"
#include "QueryStatisticsResponse.hpp"
#include "QuantityDateInterval.hpp"
#include "QuantityTypeIdentifier.hpp"
#include <unordered_map>

#include "ReactNativeHealthkit-Swift-Cxx-Umbrella.hpp"

namespace margelo::nitro::healthkit {

  /**
   * The C++ part of HybridWorkoutProxySpec_cxx.swift.
   *
   * HybridWorkoutProxySpecSwift (C++) accesses HybridWorkoutProxySpec_cxx (Swift), and might
   * contain some additional bridging code for C++ <> Swift interop.
   *
   * Since this obviously introduces an overhead, I hope at some point in
   * the future, HybridWorkoutProxySpec_cxx can directly inherit from the C++ class HybridWorkoutProxySpec
   * to simplify the whole structure and memory management.
   */
  class HybridWorkoutProxySpecSwift: public virtual HybridWorkoutProxySpec {
  public:
    // Constructor from a Swift instance
    explicit HybridWorkoutProxySpecSwift(const ReactNativeHealthkit::HybridWorkoutProxySpec_cxx& swiftPart):
      HybridObject(HybridWorkoutProxySpec::TAG),
      _swiftPart(swiftPart) { }

  public:
    // Get the Swift part
    inline ReactNativeHealthkit::HybridWorkoutProxySpec_cxx& getSwiftPart() noexcept {
      return _swiftPart;
    }

  public:
    inline size_t getExternalMemorySize() noexcept override {
      return _swiftPart.getMemorySize();
    }
    bool equals(const std::shared_ptr<HybridObject>& other) override {
      if (auto otherCast = std::dynamic_pointer_cast<HybridWorkoutProxySpecSwift>(other)) {
        return _swiftPart.equals(otherCast->_swiftPart);
      }
      return false;
    }
    void dispose() noexcept override {
      _swiftPart.dispose();
    }
    std::string toString() override {
      return _swiftPart.toString();
    }

  public:
    // Properties
    inline WorkoutActivityType getWorkoutActivityType() noexcept override {
      auto __result = _swiftPart.getWorkoutActivityType();
      return static_cast<WorkoutActivityType>(__result);
    }
    inline Quantity getDuration() noexcept override {
      return _swiftPart.getDuration();
    }
    inline std::optional<Quantity> getTotalEnergyBurned() noexcept override {
      auto __result = _swiftPart.getTotalEnergyBurned();
      return __result;
    }
    inline std::optional<Quantity> getTotalDistance() noexcept override {
      auto __result = _swiftPart.getTotalDistance();
      return __result;
    }
    inline std::optional<Quantity> getTotalSwimmingStrokeCount() noexcept override {
      auto __result = _swiftPart.getTotalSwimmingStrokeCount();
      return __result;
    }
    inline std::optional<Quantity> getTotalFlightsClimbed() noexcept override {
      auto __result = _swiftPart.getTotalFlightsClimbed();
      return __result;
    }
    inline std::optional<std::vector<WorkoutEvent>> getEvents() noexcept override {
      auto __result = _swiftPart.getEvents();
      return __result;
    }
    inline std::optional<std::vector<WorkoutActivity>> getActivities() noexcept override {
      auto __result = _swiftPart.getActivities();
      return __result;
    }
    inline std::optional<Quantity> getMetadataAverageMETs() noexcept override {
      auto __result = _swiftPart.getMetadataAverageMETs();
      return __result;
    }
    inline std::optional<Quantity> getMetadataElevationAscended() noexcept override {
      auto __result = _swiftPart.getMetadataElevationAscended();
      return __result;
    }
    inline std::optional<Quantity> getMetadataElevationDescended() noexcept override {
      auto __result = _swiftPart.getMetadataElevationDescended();
      return __result;
    }
    inline std::optional<bool> getMetadataIndoorWorkout() noexcept override {
      auto __result = _swiftPart.getMetadataIndoorWorkout();
      return __result;
    }
    inline std::optional<Quantity> getMetadataAverageSpeed() noexcept override {
      auto __result = _swiftPart.getMetadataAverageSpeed();
      return __result;
    }
    inline std::optional<Quantity> getMetadataMaximumSpeed() noexcept override {
      auto __result = _swiftPart.getMetadataMaximumSpeed();
      return __result;
    }
    inline SampleType getSampleType() noexcept override {
      return _swiftPart.getSampleType();
    }
    inline std::chrono::system_clock::time_point getStartDate() noexcept override {
      auto __result = _swiftPart.getStartDate();
      return __result;
    }
    inline std::chrono::system_clock::time_point getEndDate() noexcept override {
      auto __result = _swiftPart.getEndDate();
      return __result;
    }
    inline bool getHasUndeterminedDuration() noexcept override {
      return _swiftPart.hasUndeterminedDuration();
    }
    inline std::optional<WeatherCondition> getMetadataWeatherCondition() noexcept override {
      auto __result = _swiftPart.getMetadataWeatherCondition();
      return __result;
    }
    inline std::optional<Quantity> getMetadataWeatherHumidity() noexcept override {
      auto __result = _swiftPart.getMetadataWeatherHumidity();
      return __result;
    }
    inline std::optional<Quantity> getMetadataWeatherTemperature() noexcept override {
      auto __result = _swiftPart.getMetadataWeatherTemperature();
      return __result;
    }
    inline std::optional<InsulinDeliveryReason> getMetadataInsulinDeliveryReason() noexcept override {
      auto __result = _swiftPart.getMetadataInsulinDeliveryReason();
      return __result;
    }
    inline std::optional<HeartRateMotionContext> getMetadataHeartRateMotionContext() noexcept override {
      auto __result = _swiftPart.getMetadataHeartRateMotionContext();
      return __result;
    }
    inline std::string getUuid() noexcept override {
      auto __result = _swiftPart.getUuid();
      return __result;
    }
    inline SourceRevision getSourceRevision() noexcept override {
      return _swiftPart.getSourceRevision();
    }
    inline std::optional<Device> getDevice() noexcept override {
      auto __result = _swiftPart.getDevice();
      return __result;
    }
    inline std::shared_ptr<AnyMap> getMetadata() noexcept override {
      auto __result = _swiftPart.getMetadata();
      return __result;
    }
    inline std::optional<std::string> getMetadataExternalUUID() noexcept override {
      auto __result = _swiftPart.getMetadataExternalUUID();
      return __result;
    }
    inline std::optional<std::string> getMetadataTimeZone() noexcept override {
      auto __result = _swiftPart.getMetadataTimeZone();
      return __result;
    }
    inline std::optional<bool> getMetadataWasUserEntered() noexcept override {
      auto __result = _swiftPart.getMetadataWasUserEntered();
      return __result;
    }
    inline std::optional<std::string> getMetadataDeviceSerialNumber() noexcept override {
      auto __result = _swiftPart.getMetadataDeviceSerialNumber();
      return __result;
    }
    inline std::optional<std::string> getMetadataUdiDeviceIdentifier() noexcept override {
      auto __result = _swiftPart.getMetadataUdiDeviceIdentifier();
      return __result;
    }
    inline std::optional<std::string> getMetadataUdiProductionIdentifier() noexcept override {
      auto __result = _swiftPart.getMetadataUdiProductionIdentifier();
      return __result;
    }
    inline std::optional<std::string> getMetadataDigitalSignature() noexcept override {
      auto __result = _swiftPart.getMetadataDigitalSignature();
      return __result;
    }
    inline std::optional<std::string> getMetadataDeviceName() noexcept override {
      auto __result = _swiftPart.getMetadataDeviceName();
      return __result;
    }
    inline std::optional<std::string> getMetadataDeviceManufacturerName() noexcept override {
      auto __result = _swiftPart.getMetadataDeviceManufacturerName();
      return __result;
    }
    inline std::optional<std::string> getMetadataSyncIdentifier() noexcept override {
      auto __result = _swiftPart.getMetadataSyncIdentifier();
      return __result;
    }
    inline std::optional<double> getMetadataSyncVersion() noexcept override {
      auto __result = _swiftPart.getMetadataSyncVersion();
      return __result;
    }
    inline std::optional<bool> getMetadataWasTakenInLab() noexcept override {
      auto __result = _swiftPart.getMetadataWasTakenInLab();
      return __result;
    }
    inline std::optional<double> getMetadataReferenceRangeLowerLimit() noexcept override {
      auto __result = _swiftPart.getMetadataReferenceRangeLowerLimit();
      return __result;
    }
    inline std::optional<double> getMetadataReferenceRangeUpperLimit() noexcept override {
      auto __result = _swiftPart.getMetadataReferenceRangeUpperLimit();
      return __result;
    }
    inline std::optional<double> getMetadataAlgorithmVersion() noexcept override {
      auto __result = _swiftPart.getMetadataAlgorithmVersion();
      return __result;
    }

  public:
    // Methods
    inline WorkoutSample toJSON(const std::optional<std::string>& key) override {
      auto __result = _swiftPart.toJSON(key);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }
    inline std::shared_ptr<Promise<bool>> saveWorkoutRoute(const std::vector<LocationForSaving>& locations) override {
      auto __result = _swiftPart.saveWorkoutRoute(locations);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }
    inline std::shared_ptr<Promise<std::optional<WorkoutPlan>>> getWorkoutPlan() override {
      auto __result = _swiftPart.getWorkoutPlan();
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }
    inline std::shared_ptr<Promise<std::vector<WorkoutRoute>>> getWorkoutRoutes() override {
      auto __result = _swiftPart.getWorkoutRoutes();
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }
    inline std::shared_ptr<Promise<std::optional<QueryStatisticsResponse>>> getStatistic(QuantityTypeIdentifier quantityType, const std::optional<std::string>& unitOverride) override {
      auto __result = _swiftPart.getStatistic(static_cast<int>(quantityType), unitOverride);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }
    inline std::shared_ptr<Promise<std::unordered_map<std::string, QueryStatisticsResponse>>> getAllStatistics() override {
      auto __result = _swiftPart.getAllStatistics();
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
      auto __value = std::move(__result.value());
      return __value;
    }

  private:
    ReactNativeHealthkit::HybridWorkoutProxySpec_cxx _swiftPart;
  };

} // namespace margelo::nitro::healthkit
