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

public extension LDP_PresentParams {
  private typealias bridge = margelo.nitro.lunardatepicker.bridge.swift

  /**
   * Create a new instance of `LDP_PresentParams`.
   */
  init(theme: String, language: String, title: String, textCancel: String, mode: LDP_PickerMode, onDone: @escaping (_ result: LDP_Range) -> Void, minimumDate: String?, maximumDate: String?, initialValue: LDP_Range?, prices: [LDP_PriceData]?, onMonthVisible: ((_ month: String) -> Void)?, onSelectFromDate: ((_ date: String, _ currentlyVisibleMonths: [String]) -> Void)?) {
    self.init(std.string(theme), std.string(language), std.string(title), std.string(textCancel), mode, { () -> bridge.Func_void_LDP_Range in
      let __closureWrapper = Func_void_LDP_Range(onDone)
      return bridge.create_Func_void_LDP_Range(__closureWrapper.toUnsafe())
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = minimumDate {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = maximumDate {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_LDP_Range_ in
      if let __unwrappedValue = initialValue {
        return bridge.create_std__optional_LDP_Range_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_LDP_PriceData__ in
      if let __unwrappedValue = prices {
        return bridge.create_std__optional_std__vector_LDP_PriceData__({ () -> bridge.std__vector_LDP_PriceData_ in
          var __vector = bridge.create_std__vector_LDP_PriceData_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void_const_std__string_____month______ in
      if let __unwrappedValue = onMonthVisible {
        return bridge.create_std__optional_std__function_void_const_std__string_____month______({ () -> bridge.Func_void_std__string in
          let __closureWrapper = Func_void_std__string(__unwrappedValue)
          return bridge.create_Func_void_std__string(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void_const_std__string_____date_____const_std__vector_std__string______currentlyVisibleMonths______ in
      if let __unwrappedValue = onSelectFromDate {
        return bridge.create_std__optional_std__function_void_const_std__string_____date_____const_std__vector_std__string______currentlyVisibleMonths______({ () -> bridge.Func_void_std__string_std__vector_std__string_ in
          let __closureWrapper = Func_void_std__string_std__vector_std__string_(__unwrappedValue)
          return bridge.create_Func_void_std__string_std__vector_std__string_(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }())
  }

  var theme: String {
    @inline(__always)
    get {
      return String(self.__theme)
    }
    @inline(__always)
    set {
      self.__theme = std.string(newValue)
    }
  }
  
  var language: String {
    @inline(__always)
    get {
      return String(self.__language)
    }
    @inline(__always)
    set {
      self.__language = std.string(newValue)
    }
  }
  
  var title: String {
    @inline(__always)
    get {
      return String(self.__title)
    }
    @inline(__always)
    set {
      self.__title = std.string(newValue)
    }
  }
  
  var textCancel: String {
    @inline(__always)
    get {
      return String(self.__textCancel)
    }
    @inline(__always)
    set {
      self.__textCancel = std.string(newValue)
    }
  }
  
  var mode: LDP_PickerMode {
    @inline(__always)
    get {
      return self.__mode
    }
    @inline(__always)
    set {
      self.__mode = newValue
    }
  }
  
  var onDone: (_ result: LDP_Range) -> Void {
    @inline(__always)
    get {
      return { () -> (LDP_Range) -> Void in
        let __wrappedFunction = bridge.wrap_Func_void_LDP_Range(self.__onDone)
        return { (__result: LDP_Range) -> Void in
          __wrappedFunction.call(__result)
        }
      }()
    }
    @inline(__always)
    set {
      self.__onDone = { () -> bridge.Func_void_LDP_Range in
        let __closureWrapper = Func_void_LDP_Range(newValue)
        return bridge.create_Func_void_LDP_Range(__closureWrapper.toUnsafe())
      }()
    }
  }
  
  var minimumDate: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if let __unwrapped = self.__minimumDate.value {
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__minimumDate = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var maximumDate: String? {
    @inline(__always)
    get {
      return { () -> String? in
        if let __unwrapped = self.__maximumDate.value {
          return String(__unwrapped)
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__maximumDate = { () -> bridge.std__optional_std__string_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
        } else {
          return .init()
        }
      }()
    }
  }
  
  var initialValue: LDP_Range? {
    @inline(__always)
    get {
      return { () -> LDP_Range? in
        if let __unwrapped = self.__initialValue.value {
          return __unwrapped
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__initialValue = { () -> bridge.std__optional_LDP_Range_ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_LDP_Range_(__unwrappedValue)
        } else {
          return .init()
        }
      }()
    }
  }
  
  var prices: [LDP_PriceData]? {
    @inline(__always)
    get {
      return { () -> [LDP_PriceData]? in
        if let __unwrapped = self.__prices.value {
          return __unwrapped.map({ __item in __item })
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__prices = { () -> bridge.std__optional_std__vector_LDP_PriceData__ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__vector_LDP_PriceData__({ () -> bridge.std__vector_LDP_PriceData_ in
            var __vector = bridge.create_std__vector_LDP_PriceData_(__unwrappedValue.count)
            for __item in __unwrappedValue {
              __vector.push_back(__item)
            }
            return __vector
          }())
        } else {
          return .init()
        }
      }()
    }
  }
  
  var onMonthVisible: ((_ month: String) -> Void)? {
    @inline(__always)
    get {
      return { () -> ((_ month: String) -> Void)? in
        if let __unwrapped = self.__onMonthVisible.value {
          return { () -> (String) -> Void in
            let __wrappedFunction = bridge.wrap_Func_void_std__string(__unwrapped)
            return { (__month: String) -> Void in
              __wrappedFunction.call(std.string(__month))
            }
          }()
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__onMonthVisible = { () -> bridge.std__optional_std__function_void_const_std__string_____month______ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__function_void_const_std__string_____month______({ () -> bridge.Func_void_std__string in
            let __closureWrapper = Func_void_std__string(__unwrappedValue)
            return bridge.create_Func_void_std__string(__closureWrapper.toUnsafe())
          }())
        } else {
          return .init()
        }
      }()
    }
  }
  
  var onSelectFromDate: ((_ date: String, _ currentlyVisibleMonths: [String]) -> Void)? {
    @inline(__always)
    get {
      return { () -> ((_ date: String, _ currentlyVisibleMonths: [String]) -> Void)? in
        if let __unwrapped = self.__onSelectFromDate.value {
          return { () -> (String, [String]) -> Void in
            let __wrappedFunction = bridge.wrap_Func_void_std__string_std__vector_std__string_(__unwrapped)
            return { (__date: String, __currentlyVisibleMonths: [String]) -> Void in
              __wrappedFunction.call(std.string(__date), { () -> bridge.std__vector_std__string_ in
                var __vector = bridge.create_std__vector_std__string_(__currentlyVisibleMonths.count)
                for __item in __currentlyVisibleMonths {
                  __vector.push_back(std.string(__item))
                }
                return __vector
              }())
            }
          }()
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__onSelectFromDate = { () -> bridge.std__optional_std__function_void_const_std__string_____date_____const_std__vector_std__string______currentlyVisibleMonths______ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__function_void_const_std__string_____date_____const_std__vector_std__string______currentlyVisibleMonths______({ () -> bridge.Func_void_std__string_std__vector_std__string_ in
            let __closureWrapper = Func_void_std__string_std__vector_std__string_(__unwrappedValue)
            return bridge.create_Func_void_std__string_std__vector_std__string_(__closureWrapper.toUnsafe())
          }())
        } else {
          return .init()
        }
      }()
    }
  }
}
