///
/// HybridCameraControllerSpec.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 `HybridCameraDeviceSpec` to properly resolve imports.
namespace margelo::nitro::camera { class HybridCameraDeviceSpec; }
// Forward declaration of `TorchMode` to properly resolve imports.
namespace margelo::nitro::camera { enum class TorchMode; }
// Forward declaration of `FocusMode` to properly resolve imports.
namespace margelo::nitro::camera { enum class FocusMode; }
// Forward declaration of `ExposureMode` to properly resolve imports.
namespace margelo::nitro::camera { enum class ExposureMode; }
// Forward declaration of `WhiteBalanceMode` to properly resolve imports.
namespace margelo::nitro::camera { enum class WhiteBalanceMode; }
// Forward declaration of `WhiteBalanceGains` to properly resolve imports.
namespace margelo::nitro::camera { struct WhiteBalanceGains; }
// Forward declaration of `CameraControllerConfiguration` to properly resolve imports.
namespace margelo::nitro::camera { struct CameraControllerConfiguration; }
// Forward declaration of `HybridMeteringPointSpec` to properly resolve imports.
namespace margelo::nitro::camera { class HybridMeteringPointSpec; }
// Forward declaration of `FocusOptions` to properly resolve imports.
namespace margelo::nitro::camera { struct FocusOptions; }
// Forward declaration of `ListenerSubscription` to properly resolve imports.
namespace margelo::nitro::camera { struct ListenerSubscription; }
// Forward declaration of `WhiteBalanceTemperatureAndTint` to properly resolve imports.
namespace margelo::nitro::camera { struct WhiteBalanceTemperatureAndTint; }

#include <memory>
#include "HybridCameraDeviceSpec.hpp"
#include "TorchMode.hpp"
#include "FocusMode.hpp"
#include "ExposureMode.hpp"
#include "WhiteBalanceMode.hpp"
#include "WhiteBalanceGains.hpp"
#include <NitroModules/Promise.hpp>
#include "CameraControllerConfiguration.hpp"
#include "HybridMeteringPointSpec.hpp"
#include "FocusOptions.hpp"
#include "ListenerSubscription.hpp"
#include <functional>
#include "WhiteBalanceTemperatureAndTint.hpp"

namespace margelo::nitro::camera {

  using namespace margelo::nitro;

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

      // Destructor
      ~HybridCameraControllerSpec() override = default;

    public:
      // Properties
      virtual std::shared_ptr<HybridCameraDeviceSpec> getDevice() = 0;
      virtual bool getIsConnected() = 0;
      virtual bool getIsSuspended() = 0;
      virtual bool getIsUsedByAnotherApp() = 0;
      virtual bool getIsLowLightBoostEnabled() = 0;
      virtual bool getIsSmoothAutoFocusEnabled() = 0;
      virtual bool getIsDistortionCorrectionEnabled() = 0;
      virtual double getZoom() = 0;
      virtual double getMinZoom() = 0;
      virtual double getMaxZoom() = 0;
      virtual double getDisplayableZoomFactor() = 0;
      virtual double getTorchStrength() = 0;
      virtual TorchMode getTorchMode() = 0;
      virtual double getExposureBias() = 0;
      virtual FocusMode getFocusMode() = 0;
      virtual double getLensPosition() = 0;
      virtual ExposureMode getExposureMode() = 0;
      virtual double getMinExposureDuration() = 0;
      virtual double getMaxExposureDuration() = 0;
      virtual double getMinISO() = 0;
      virtual double getMaxISO() = 0;
      virtual double getExposureDuration() = 0;
      virtual double getIso() = 0;
      virtual WhiteBalanceMode getWhiteBalanceMode() = 0;
      virtual WhiteBalanceGains getWhiteBalanceGains() = 0;

    public:
      // Methods
      virtual std::shared_ptr<Promise<void>> configure(const CameraControllerConfiguration& config) = 0;
      virtual std::shared_ptr<Promise<void>> focusTo(const std::shared_ptr<HybridMeteringPointSpec>& point, const FocusOptions& options) = 0;
      virtual std::shared_ptr<Promise<void>> resetFocus() = 0;
      virtual ListenerSubscription addSubjectAreaChangedListener(const std::function<void()>& onSubjectAreaChanged) = 0;
      virtual std::shared_ptr<Promise<void>> setZoom(double zoom) = 0;
      virtual std::shared_ptr<Promise<void>> startZoomAnimation(double zoom, double rate) = 0;
      virtual std::shared_ptr<Promise<void>> cancelZoomAnimation() = 0;
      virtual std::shared_ptr<Promise<void>> setTorchMode(TorchMode mode) = 0;
      virtual std::shared_ptr<Promise<void>> enableTorchWithStrength(double strength) = 0;
      virtual std::shared_ptr<Promise<void>> setExposureBias(double exposure) = 0;
      virtual std::shared_ptr<Promise<void>> setFocusLocked(double lensPosition) = 0;
      virtual std::shared_ptr<Promise<void>> lockCurrentFocus() = 0;
      virtual std::shared_ptr<Promise<void>> setExposureLocked(double duration, double iso) = 0;
      virtual std::shared_ptr<Promise<void>> lockCurrentExposure() = 0;
      virtual WhiteBalanceGains convertWhiteBalanceTemperatureAndTintValues(const WhiteBalanceTemperatureAndTint& whiteBalanceTemperatureAndTint) = 0;
      virtual std::shared_ptr<Promise<void>> setWhiteBalanceLocked(const WhiteBalanceGains& whiteBalanceGains) = 0;
      virtual std::shared_ptr<Promise<void>> lockCurrentWhiteBalance() = 0;

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

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

} // namespace margelo::nitro::camera
