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

import NitroModules

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

public extension NitroOneTimePurchaseOfferDetail {
  private typealias bridge = margelo.nitro.iap.bridge.swift

  /**
   * Create a new instance of `NitroOneTimePurchaseOfferDetail`.
   */
  init(discountDisplayInfo: NitroDiscountDisplayInfoAndroid?, formattedPrice: String, fullPriceMicros: String?, limitedQuantityInfo: NitroLimitedQuantityInfoAndroid?, offerId: String?, offerTags: [String], offerToken: String, preorderDetailsAndroid: NitroPreorderDetailsAndroid?, priceAmountMicros: String, priceCurrencyCode: String, rentalDetailsAndroid: NitroRentalDetailsAndroid?, validTimeWindow: NitroValidTimeWindowAndroid?) {
    self.init({ () -> bridge.std__optional_NitroDiscountDisplayInfoAndroid_ in
      if let __unwrappedValue = discountDisplayInfo {
        return bridge.create_std__optional_NitroDiscountDisplayInfoAndroid_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), std.string(formattedPrice), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = fullPriceMicros {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_NitroLimitedQuantityInfoAndroid_ in
      if let __unwrappedValue = limitedQuantityInfo {
        return bridge.create_std__optional_NitroLimitedQuantityInfoAndroid_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = offerId {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__vector_std__string_ in
      var __vector = bridge.create_std__vector_std__string_(offerTags.count)
      for __item in offerTags {
        __vector.push_back(std.string(__item))
      }
      return __vector
    }(), std.string(offerToken), { () -> bridge.std__optional_NitroPreorderDetailsAndroid_ in
      if let __unwrappedValue = preorderDetailsAndroid {
        return bridge.create_std__optional_NitroPreorderDetailsAndroid_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), std.string(priceAmountMicros), std.string(priceCurrencyCode), { () -> bridge.std__optional_NitroRentalDetailsAndroid_ in
      if let __unwrappedValue = rentalDetailsAndroid {
        return bridge.create_std__optional_NitroRentalDetailsAndroid_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_NitroValidTimeWindowAndroid_ in
      if let __unwrappedValue = validTimeWindow {
        return bridge.create_std__optional_NitroValidTimeWindowAndroid_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  var discountDisplayInfo: NitroDiscountDisplayInfoAndroid? {
    @inline(__always)
    get {
      return self.__discountDisplayInfo.value
    }
    @inline(__always)
    set {
      self.__discountDisplayInfo = { () -> bridge.std__optional_NitroDiscountDisplayInfoAndroid_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_NitroDiscountDisplayInfoAndroid_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var formattedPrice: String {
    @inline(__always)
    get {
      return String(self.__formattedPrice)
    }
    @inline(__always)
    set {
      self.__formattedPrice = std.string(newValue)
    }
  }
  
  var fullPriceMicros: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if bridge.has_value_std__optional_std__string_(self.__fullPriceMicros) {
          let __unwrapped = bridge.get_std__optional_std__string_(self.__fullPriceMicros)
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__fullPriceMicros = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var limitedQuantityInfo: NitroLimitedQuantityInfoAndroid? {
    @inline(__always)
    get {
      return self.__limitedQuantityInfo.value
    }
    @inline(__always)
    set {
      self.__limitedQuantityInfo = { () -> bridge.std__optional_NitroLimitedQuantityInfoAndroid_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_NitroLimitedQuantityInfoAndroid_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var offerId: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if bridge.has_value_std__optional_std__string_(self.__offerId) {
          let __unwrapped = bridge.get_std__optional_std__string_(self.__offerId)
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__offerId = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var offerTags: [String] {
    @inline(__always)
    get {
      return self.__offerTags.map({ __item in String(__item) })
    }
    @inline(__always)
    set {
      self.__offerTags = { () -> bridge.std__vector_std__string_ in
        var __vector = bridge.create_std__vector_std__string_(newValue.count)
        for __item in newValue {
          __vector.push_back(std.string(__item))
        }
        return __vector
      }()
    }
  }
  
  var offerToken: String {
    @inline(__always)
    get {
      return String(self.__offerToken)
    }
    @inline(__always)
    set {
      self.__offerToken = std.string(newValue)
    }
  }
  
  var preorderDetailsAndroid: NitroPreorderDetailsAndroid? {
    @inline(__always)
    get {
      return self.__preorderDetailsAndroid.value
    }
    @inline(__always)
    set {
      self.__preorderDetailsAndroid = { () -> bridge.std__optional_NitroPreorderDetailsAndroid_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_NitroPreorderDetailsAndroid_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var priceAmountMicros: String {
    @inline(__always)
    get {
      return String(self.__priceAmountMicros)
    }
    @inline(__always)
    set {
      self.__priceAmountMicros = std.string(newValue)
    }
  }
  
  var priceCurrencyCode: String {
    @inline(__always)
    get {
      return String(self.__priceCurrencyCode)
    }
    @inline(__always)
    set {
      self.__priceCurrencyCode = std.string(newValue)
    }
  }
  
  var rentalDetailsAndroid: NitroRentalDetailsAndroid? {
    @inline(__always)
    get {
      return self.__rentalDetailsAndroid.value
    }
    @inline(__always)
    set {
      self.__rentalDetailsAndroid = { () -> bridge.std__optional_NitroRentalDetailsAndroid_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_NitroRentalDetailsAndroid_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var validTimeWindow: NitroValidTimeWindowAndroid? {
    @inline(__always)
    get {
      return self.__validTimeWindow.value
    }
    @inline(__always)
    set {
      self.__validTimeWindow = { () -> bridge.std__optional_NitroValidTimeWindowAndroid_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_NitroValidTimeWindowAndroid_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
}
