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

import NitroModules

/**
 * Represents an instance of `QuantitySample`, backed by a C++ struct.
 */
public typealias QuantitySample = margelo.nitro.healthkit.QuantitySample

public extension QuantitySample {
  private typealias bridge = margelo.nitro.healthkit.bridge.swift

  /**
   * Create a new instance of `QuantitySample`.
   */
  init(quantityType: QuantityTypeIdentifier, quantity: Double, unit: String, sampleType: SampleType, startDate: Date, endDate: Date, hasUndeterminedDuration: Bool, metadataWeatherCondition: WeatherCondition?, metadataWeatherHumidity: Quantity?, metadataWeatherTemperature: Quantity?, metadataInsulinDeliveryReason: InsulinDeliveryReason?, metadataHeartRateMotionContext: HeartRateMotionContext?, uuid: String, sourceRevision: SourceRevision, device: Device?, metadata: AnyMap, metadataExternalUUID: String?, metadataTimeZone: String?, metadataWasUserEntered: Bool?, metadataDeviceSerialNumber: String?, metadataUdiDeviceIdentifier: String?, metadataUdiProductionIdentifier: String?, metadataDigitalSignature: String?, metadataDeviceName: String?, metadataDeviceManufacturerName: String?, metadataSyncIdentifier: String?, metadataSyncVersion: Double?, metadataWasTakenInLab: Bool?, metadataReferenceRangeLowerLimit: Double?, metadataReferenceRangeUpperLimit: Double?, metadataAlgorithmVersion: Double?) {
    self.init(quantityType, quantity, std.string(unit), sampleType, startDate.toCpp(), endDate.toCpp(), hasUndeterminedDuration, { () -> bridge.std__optional_WeatherCondition_ in
      if let __unwrappedValue = metadataWeatherCondition {
        return bridge.create_std__optional_WeatherCondition_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_Quantity_ in
      if let __unwrappedValue = metadataWeatherHumidity {
        return bridge.create_std__optional_Quantity_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_Quantity_ in
      if let __unwrappedValue = metadataWeatherTemperature {
        return bridge.create_std__optional_Quantity_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_InsulinDeliveryReason_ in
      if let __unwrappedValue = metadataInsulinDeliveryReason {
        return bridge.create_std__optional_InsulinDeliveryReason_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_HeartRateMotionContext_ in
      if let __unwrappedValue = metadataHeartRateMotionContext {
        return bridge.create_std__optional_HeartRateMotionContext_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), std.string(uuid), sourceRevision, { () -> bridge.std__optional_Device_ in
      if let __unwrappedValue = device {
        return bridge.create_std__optional_Device_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), metadata.cppPart, { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataExternalUUID {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataTimeZone {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = metadataWasUserEntered {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataDeviceSerialNumber {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataUdiDeviceIdentifier {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataUdiProductionIdentifier {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataDigitalSignature {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataDeviceName {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataDeviceManufacturerName {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = metadataSyncIdentifier {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = metadataSyncVersion {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = metadataWasTakenInLab {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = metadataReferenceRangeLowerLimit {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = metadataReferenceRangeUpperLimit {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = metadataAlgorithmVersion {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var quantityType: QuantityTypeIdentifier {
    return self.__quantityType
  }
  
  @inline(__always)
  var quantity: Double {
    return self.__quantity
  }
  
  @inline(__always)
  var unit: String {
    return String(self.__unit)
  }
  
  @inline(__always)
  var sampleType: SampleType {
    return self.__sampleType
  }
  
  @inline(__always)
  var startDate: Date {
    return Date(fromChrono: self.__startDate)
  }
  
  @inline(__always)
  var endDate: Date {
    return Date(fromChrono: self.__endDate)
  }
  
  @inline(__always)
  var hasUndeterminedDuration: Bool {
    return self.__hasUndeterminedDuration
  }
  
  @inline(__always)
  var metadataWeatherCondition: WeatherCondition? {
    return self.__metadataWeatherCondition.has_value() ? self.__metadataWeatherCondition.pointee : nil
  }
  
  @inline(__always)
  var metadataWeatherHumidity: Quantity? {
    return self.__metadataWeatherHumidity.value
  }
  
  @inline(__always)
  var metadataWeatherTemperature: Quantity? {
    return self.__metadataWeatherTemperature.value
  }
  
  @inline(__always)
  var metadataInsulinDeliveryReason: InsulinDeliveryReason? {
    return self.__metadataInsulinDeliveryReason.has_value() ? self.__metadataInsulinDeliveryReason.pointee : nil
  }
  
  @inline(__always)
  var metadataHeartRateMotionContext: HeartRateMotionContext? {
    return self.__metadataHeartRateMotionContext.has_value() ? self.__metadataHeartRateMotionContext.pointee : nil
  }
  
  @inline(__always)
  var uuid: String {
    return String(self.__uuid)
  }
  
  @inline(__always)
  var sourceRevision: SourceRevision {
    return self.__sourceRevision
  }
  
  @inline(__always)
  var device: Device? {
    return self.__device.value
  }
  
  @inline(__always)
  var metadata: AnyMap {
    return AnyMap(withCppPart: self.__metadata)
  }
  
  @inline(__always)
  var metadataExternalUUID: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataExternalUUID) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataExternalUUID)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataTimeZone: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataTimeZone) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataTimeZone)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataWasUserEntered: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__metadataWasUserEntered) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__metadataWasUserEntered)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataDeviceSerialNumber: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataDeviceSerialNumber) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataDeviceSerialNumber)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataUdiDeviceIdentifier: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataUdiDeviceIdentifier) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataUdiDeviceIdentifier)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataUdiProductionIdentifier: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataUdiProductionIdentifier) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataUdiProductionIdentifier)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataDigitalSignature: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataDigitalSignature) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataDigitalSignature)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataDeviceName: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataDeviceName) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataDeviceName)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataDeviceManufacturerName: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataDeviceManufacturerName) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataDeviceManufacturerName)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataSyncIdentifier: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__metadataSyncIdentifier) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__metadataSyncIdentifier)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataSyncVersion: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__metadataSyncVersion) {
        let __unwrapped = bridge.get_std__optional_double_(self.__metadataSyncVersion)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataWasTakenInLab: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__metadataWasTakenInLab) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__metadataWasTakenInLab)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataReferenceRangeLowerLimit: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__metadataReferenceRangeLowerLimit) {
        let __unwrapped = bridge.get_std__optional_double_(self.__metadataReferenceRangeLowerLimit)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataReferenceRangeUpperLimit: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__metadataReferenceRangeUpperLimit) {
        let __unwrapped = bridge.get_std__optional_double_(self.__metadataReferenceRangeUpperLimit)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var metadataAlgorithmVersion: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__metadataAlgorithmVersion) {
        let __unwrapped = bridge.get_std__optional_double_(self.__metadataAlgorithmVersion)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
}
