///
/// NitroOneTimePurchaseOfferDetail.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 `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: Variant_NullType_NitroDiscountDisplayInfoAndroid?, formattedPrice: String, fullPriceMicros: Variant_NullType_String?, limitedQuantityInfo: Variant_NullType_NitroLimitedQuantityInfoAndroid?, offerId: Variant_NullType_String?, offerTags: [String], offerToken: String, preorderDetailsAndroid: Variant_NullType_NitroPreorderDetailsAndroid?, priceAmountMicros: String, priceCurrencyCode: String, rentalDetailsAndroid: Variant_NullType_NitroRentalDetailsAndroid?, validTimeWindow: Variant_NullType_NitroValidTimeWindowAndroid?) {
    self.init({ () -> bridge.std__optional_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid__ in
      if let __unwrappedValue = discountDisplayInfo {
        return bridge.create_std__optional_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid__({ () -> bridge.std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid_(__value)
          }
        }().variant)
      } else {
        return .init()
      }
    }(), std.string(formattedPrice), { () -> bridge.std__optional_std__variant_nitro__NullType__std__string__ in
      if let __unwrappedValue = fullPriceMicros {
        return bridge.create_std__optional_std__variant_nitro__NullType__std__string__({ () -> bridge.std__variant_nitro__NullType__std__string_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__std__string_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__std__string_(std.string(__value))
          }
        }().variant)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid__ in
      if let __unwrappedValue = limitedQuantityInfo {
        return bridge.create_std__optional_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid__({ () -> bridge.std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid_(__value)
          }
        }().variant)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__variant_nitro__NullType__std__string__ in
      if let __unwrappedValue = offerId {
        return bridge.create_std__optional_std__variant_nitro__NullType__std__string__({ () -> bridge.std__variant_nitro__NullType__std__string_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__std__string_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__std__string_(std.string(__value))
          }
        }().variant)
      } 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_std__variant_nitro__NullType__NitroPreorderDetailsAndroid__ in
      if let __unwrappedValue = preorderDetailsAndroid {
        return bridge.create_std__optional_std__variant_nitro__NullType__NitroPreorderDetailsAndroid__({ () -> bridge.std__variant_nitro__NullType__NitroPreorderDetailsAndroid_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroPreorderDetailsAndroid_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroPreorderDetailsAndroid_(__value)
          }
        }().variant)
      } else {
        return .init()
      }
    }(), std.string(priceAmountMicros), std.string(priceCurrencyCode), { () -> bridge.std__optional_std__variant_nitro__NullType__NitroRentalDetailsAndroid__ in
      if let __unwrappedValue = rentalDetailsAndroid {
        return bridge.create_std__optional_std__variant_nitro__NullType__NitroRentalDetailsAndroid__({ () -> bridge.std__variant_nitro__NullType__NitroRentalDetailsAndroid_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroRentalDetailsAndroid_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroRentalDetailsAndroid_(__value)
          }
        }().variant)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__variant_nitro__NullType__NitroValidTimeWindowAndroid__ in
      if let __unwrappedValue = validTimeWindow {
        return bridge.create_std__optional_std__variant_nitro__NullType__NitroValidTimeWindowAndroid__({ () -> bridge.std__variant_nitro__NullType__NitroValidTimeWindowAndroid_ in
          switch __unwrappedValue {
            case .first(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroValidTimeWindowAndroid_(margelo.nitro.NullType.null)
            case .second(let __value):
              return bridge.create_std__variant_nitro__NullType__NitroValidTimeWindowAndroid_(__value)
          }
        }().variant)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var discountDisplayInfo: Variant_NullType_NitroDiscountDisplayInfoAndroid? {
    return { () -> Variant_NullType_NitroDiscountDisplayInfoAndroid? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid__(self.__discountDisplayInfo) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid__(self.__discountDisplayInfo)
        return { () -> Variant_NullType_NitroDiscountDisplayInfoAndroid in
          let __variant = bridge.std__variant_nitro__NullType__NitroDiscountDisplayInfoAndroid_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(__actual)
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var formattedPrice: String {
    return String(self.__formattedPrice)
  }
  
  @inline(__always)
  var fullPriceMicros: Variant_NullType_String? {
    return { () -> Variant_NullType_String? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__std__string__(self.__fullPriceMicros) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__std__string__(self.__fullPriceMicros)
        return { () -> Variant_NullType_String in
          let __variant = bridge.std__variant_nitro__NullType__std__string_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(String(__actual))
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var limitedQuantityInfo: Variant_NullType_NitroLimitedQuantityInfoAndroid? {
    return { () -> Variant_NullType_NitroLimitedQuantityInfoAndroid? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid__(self.__limitedQuantityInfo) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid__(self.__limitedQuantityInfo)
        return { () -> Variant_NullType_NitroLimitedQuantityInfoAndroid in
          let __variant = bridge.std__variant_nitro__NullType__NitroLimitedQuantityInfoAndroid_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(__actual)
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var offerId: Variant_NullType_String? {
    return { () -> Variant_NullType_String? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__std__string__(self.__offerId) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__std__string__(self.__offerId)
        return { () -> Variant_NullType_String in
          let __variant = bridge.std__variant_nitro__NullType__std__string_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(String(__actual))
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var offerTags: [String] {
    return self.__offerTags.map({ __item in String(__item) })
  }
  
  @inline(__always)
  var offerToken: String {
    return String(self.__offerToken)
  }
  
  @inline(__always)
  var preorderDetailsAndroid: Variant_NullType_NitroPreorderDetailsAndroid? {
    return { () -> Variant_NullType_NitroPreorderDetailsAndroid? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__NitroPreorderDetailsAndroid__(self.__preorderDetailsAndroid) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__NitroPreorderDetailsAndroid__(self.__preorderDetailsAndroid)
        return { () -> Variant_NullType_NitroPreorderDetailsAndroid in
          let __variant = bridge.std__variant_nitro__NullType__NitroPreorderDetailsAndroid_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(__actual)
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var priceAmountMicros: String {
    return String(self.__priceAmountMicros)
  }
  
  @inline(__always)
  var priceCurrencyCode: String {
    return String(self.__priceCurrencyCode)
  }
  
  @inline(__always)
  var rentalDetailsAndroid: Variant_NullType_NitroRentalDetailsAndroid? {
    return { () -> Variant_NullType_NitroRentalDetailsAndroid? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__NitroRentalDetailsAndroid__(self.__rentalDetailsAndroid) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__NitroRentalDetailsAndroid__(self.__rentalDetailsAndroid)
        return { () -> Variant_NullType_NitroRentalDetailsAndroid in
          let __variant = bridge.std__variant_nitro__NullType__NitroRentalDetailsAndroid_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(__actual)
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var validTimeWindow: Variant_NullType_NitroValidTimeWindowAndroid? {
    return { () -> Variant_NullType_NitroValidTimeWindowAndroid? in
      if bridge.has_value_std__optional_std__variant_nitro__NullType__NitroValidTimeWindowAndroid__(self.__validTimeWindow) {
        let __unwrapped = bridge.get_std__optional_std__variant_nitro__NullType__NitroValidTimeWindowAndroid__(self.__validTimeWindow)
        return { () -> Variant_NullType_NitroValidTimeWindowAndroid in
          let __variant = bridge.std__variant_nitro__NullType__NitroValidTimeWindowAndroid_(__unwrapped)
          switch __variant.index() {
            case 0:
              let __actual = __variant.get_0()
              return .first(NullType.null)
            case 1:
              let __actual = __variant.get_1()
              return .second(__actual)
            default:
              fatalError("Variant can never have index \(__variant.index())!")
          }
        }()
      } else {
        return nil
      }
    }()
  }
}
