///
/// FawryLaunchModel.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 `FawryLaunchModel`, backed by a C++ struct.
 */
public typealias FawryLaunchModel = margelo.nitro.fawrypay_rnfawrypaysdk.FawryLaunchModel

public extension FawryLaunchModel {
  private typealias bridge = margelo.nitro.fawrypay_rnfawrypaysdk.bridge.swift

  /**
   * Create a new instance of `FawryLaunchModel`.
   */
  init(baseUrl: String, lang: FawryLanguages, merchantInfo: MerchantInfo, customerInfo: CustomerInfo, items: [BillItems], allow3DPayment: Bool, skipReceipt: Bool, skipLogin: Bool, skipCustomerInput: Bool?, payWithCardToken: Bool, authCaptureMode: Bool, allowVoucher: Bool, paymentSignature: String?, tokenizationSignature: String?, paymentMethod: String?, launchApplePayModel: LaunchApplePayModel?, launchCheckoutModel: LaunchCheckoutModel?) {
    self.init(std.string(baseUrl), lang, merchantInfo, customerInfo, { () -> bridge.std__vector_BillItems_ in
      var __vector = bridge.create_std__vector_BillItems_(items.count)
      for __item in items {
        __vector.push_back(__item)
      }
      return __vector
    }(), allow3DPayment, skipReceipt, skipLogin, { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = skipCustomerInput {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), payWithCardToken, authCaptureMode, allowVoucher, { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = paymentSignature {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = tokenizationSignature {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = paymentMethod {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_LaunchApplePayModel_ in
      if let __unwrappedValue = launchApplePayModel {
        return bridge.create_std__optional_LaunchApplePayModel_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_LaunchCheckoutModel_ in
      if let __unwrappedValue = launchCheckoutModel {
        return bridge.create_std__optional_LaunchCheckoutModel_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  var baseUrl: String {
    @inline(__always)
    get {
      return String(self.__baseUrl)
    }
    @inline(__always)
    set {
      self.__baseUrl = std.string(newValue)
    }
  }
  
  var lang: FawryLanguages {
    @inline(__always)
    get {
      return self.__lang
    }
    @inline(__always)
    set {
      self.__lang = newValue
    }
  }
  
  var merchantInfo: MerchantInfo {
    @inline(__always)
    get {
      return self.__merchantInfo
    }
    @inline(__always)
    set {
      self.__merchantInfo = newValue
    }
  }
  
  var customerInfo: CustomerInfo {
    @inline(__always)
    get {
      return self.__customerInfo
    }
    @inline(__always)
    set {
      self.__customerInfo = newValue
    }
  }
  
  var items: [BillItems] {
    @inline(__always)
    get {
      return self.__items.map({ __item in __item })
    }
    @inline(__always)
    set {
      self.__items = { () -> bridge.std__vector_BillItems_ in
        var __vector = bridge.create_std__vector_BillItems_(newValue.count)
        for __item in newValue {
          __vector.push_back(__item)
        }
        return __vector
      }()
    }
  }
  
  var allow3DPayment: Bool {
    @inline(__always)
    get {
      return self.__allow3DPayment
    }
    @inline(__always)
    set {
      self.__allow3DPayment = newValue
    }
  }
  
  var skipReceipt: Bool {
    @inline(__always)
    get {
      return self.__skipReceipt
    }
    @inline(__always)
    set {
      self.__skipReceipt = newValue
    }
  }
  
  var skipLogin: Bool {
    @inline(__always)
    get {
      return self.__skipLogin
    }
    @inline(__always)
    set {
      self.__skipLogin = newValue
    }
  }
  
  var skipCustomerInput: Bool? {
    @inline(__always)
    get {
      return self.__skipCustomerInput.value
    }
    @inline(__always)
    set {
      self.__skipCustomerInput = { () -> bridge.std__optional_bool_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_bool_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var payWithCardToken: Bool {
    @inline(__always)
    get {
      return self.__payWithCardToken
    }
    @inline(__always)
    set {
      self.__payWithCardToken = newValue
    }
  }
  
  var authCaptureMode: Bool {
    @inline(__always)
    get {
      return self.__authCaptureMode
    }
    @inline(__always)
    set {
      self.__authCaptureMode = newValue
    }
  }
  
  var allowVoucher: Bool {
    @inline(__always)
    get {
      return self.__allowVoucher
    }
    @inline(__always)
    set {
      self.__allowVoucher = newValue
    }
  }
  
  var paymentSignature: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if let __unwrapped = self.__paymentSignature.value {
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__paymentSignature = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var tokenizationSignature: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if let __unwrapped = self.__tokenizationSignature.value {
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__tokenizationSignature = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var paymentMethod: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if let __unwrapped = self.__paymentMethod.value {
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__paymentMethod = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var launchApplePayModel: LaunchApplePayModel? {
    @inline(__always)
    get {
      return { () -> LaunchApplePayModel? in
        if let __unwrapped = self.__launchApplePayModel.value {
          return __unwrapped
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__launchApplePayModel = { () -> bridge.std__optional_LaunchApplePayModel_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_LaunchApplePayModel_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var launchCheckoutModel: LaunchCheckoutModel? {
    @inline(__always)
    get {
      return { () -> LaunchCheckoutModel? in
        if let __unwrapped = self.__launchCheckoutModel.value {
          return __unwrapped
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__launchCheckoutModel = { () -> bridge.std__optional_LaunchCheckoutModel_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_LaunchCheckoutModel_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
}
