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

import NitroModules

/// See ``HybridWorkoutProxySpec``
public protocol HybridWorkoutProxySpec_protocol: HybridObject {
  // Properties
  var workoutActivityType: WorkoutActivityType { get }
  var duration: Quantity { get }
  var totalEnergyBurned: Quantity? { get }
  var totalDistance: Quantity? { get }
  var totalSwimmingStrokeCount: Quantity? { get }
  var totalFlightsClimbed: Quantity? { get }
  var events: [WorkoutEvent]? { get }
  var activities: [WorkoutActivity]? { get }
  var metadataAverageMETs: Quantity? { get }
  var metadataElevationAscended: Quantity? { get }
  var metadataElevationDescended: Quantity? { get }
  var metadataIndoorWorkout: Bool? { get }
  var metadataAverageSpeed: Quantity? { get }
  var metadataMaximumSpeed: Quantity? { get }
  var sampleType: SampleType { get }
  var startDate: Date { get }
  var endDate: Date { get }
  var hasUndeterminedDuration: Bool { get }
  var metadataWeatherCondition: WeatherCondition? { get }
  var metadataWeatherHumidity: Quantity? { get }
  var metadataWeatherTemperature: Quantity? { get }
  var metadataInsulinDeliveryReason: InsulinDeliveryReason? { get }
  var metadataHeartRateMotionContext: HeartRateMotionContext? { get }
  var uuid: String { get }
  var sourceRevision: SourceRevision { get }
  var device: Device? { get }
  var metadata: AnyMap { get }
  var metadataExternalUUID: String? { get }
  var metadataTimeZone: String? { get }
  var metadataWasUserEntered: Bool? { get }
  var metadataDeviceSerialNumber: String? { get }
  var metadataUdiDeviceIdentifier: String? { get }
  var metadataUdiProductionIdentifier: String? { get }
  var metadataDigitalSignature: String? { get }
  var metadataDeviceName: String? { get }
  var metadataDeviceManufacturerName: String? { get }
  var metadataSyncIdentifier: String? { get }
  var metadataSyncVersion: Double? { get }
  var metadataWasTakenInLab: Bool? { get }
  var metadataReferenceRangeLowerLimit: Double? { get }
  var metadataReferenceRangeUpperLimit: Double? { get }
  var metadataAlgorithmVersion: Double? { get }

  // Methods
  func toJSON(key: String?) throws -> WorkoutSample
  func saveWorkoutRoute(locations: [LocationForSaving]) throws -> Promise<Bool>
  func getWorkoutPlan() throws -> Promise<WorkoutPlan?>
  func getWorkoutRoutes() throws -> Promise<[WorkoutRoute]>
  func getStatistic(quantityType: QuantityTypeIdentifier, unitOverride: String?) throws -> Promise<QueryStatisticsResponse?>
  func getAllStatistics() throws -> Promise<Dictionary<String, QueryStatisticsResponse>>
}

public extension HybridWorkoutProxySpec_protocol {
  /// Default implementation of ``HybridObject.toString``
  func toString() -> String {
    return "[HybridObject WorkoutProxy]"
  }
}

/// See ``HybridWorkoutProxySpec``
open class HybridWorkoutProxySpec_base {
  private weak var cxxWrapper: HybridWorkoutProxySpec_cxx? = nil
  public init() { }
  public func getCxxWrapper() -> HybridWorkoutProxySpec_cxx {
  #if DEBUG
    guard self is any HybridWorkoutProxySpec else {
      fatalError("`self` is not a `HybridWorkoutProxySpec`! Did you accidentally inherit from `HybridWorkoutProxySpec_base` instead of `HybridWorkoutProxySpec`?")
    }
  #endif
    if let cxxWrapper = self.cxxWrapper {
      return cxxWrapper
    } else {
      let cxxWrapper = HybridWorkoutProxySpec_cxx(self as! any HybridWorkoutProxySpec)
      self.cxxWrapper = cxxWrapper
      return cxxWrapper
    }
  }
}

/**
 * A Swift base-protocol representing the WorkoutProxy HybridObject.
 * Implement this protocol to create Swift-based instances of WorkoutProxy.
 * ```swift
 * class HybridWorkoutProxy : HybridWorkoutProxySpec {
 *   // ...
 * }
 * ```
 */
public typealias HybridWorkoutProxySpec = HybridWorkoutProxySpec_protocol & HybridWorkoutProxySpec_base
