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

public extension UnifiedRiveEvent {
  private typealias bridge = margelo.nitro.rive.bridge.swift

  /**
   * Create a new instance of `UnifiedRiveEvent`.
   */
  init(name: String, type: RiveEventType, delay: Double?, properties: Dictionary<String, EventPropertiesOutput>?, url: String?, target: String?) {
    self.init(std.string(name), type, { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = delay {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___ in
      if let __unwrappedValue = properties {
        return bridge.create_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___({ () -> bridge.std__unordered_map_std__string__std__variant_bool__std__string__double__ in
          var __map = bridge.create_std__unordered_map_std__string__std__variant_bool__std__string__double__(__unwrappedValue.count)
          for (__k, __v) in __unwrappedValue {
            bridge.emplace_std__unordered_map_std__string__std__variant_bool__std__string__double__(&__map, std.string(__k), { () -> bridge.std__variant_bool__std__string__double_ in
              switch __v {
                case .first(let __value):
                  return bridge.create_std__variant_bool__std__string__double_(__value)
                case .second(let __value):
                  return bridge.create_std__variant_bool__std__string__double_(std.string(__value))
                case .third(let __value):
                  return bridge.create_std__variant_bool__std__string__double_(__value)
              }
            }().variant)
          }
          return __map
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = url {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = target {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var name: String {
    return String(self.__name)
  }
  
  @inline(__always)
  var type: RiveEventType {
    return self.__type
  }
  
  @inline(__always)
  var delay: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__delay) {
        let __unwrapped = bridge.get_std__optional_double_(self.__delay)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var properties: Dictionary<String, EventPropertiesOutput>? {
    return { () -> Dictionary<String, EventPropertiesOutput>? in
      if bridge.has_value_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(self.__properties) {
        let __unwrapped = bridge.get_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(self.__properties)
        return { () -> Dictionary<String, EventPropertiesOutput> in
          var __dictionary = Dictionary<String, EventPropertiesOutput>(minimumCapacity: __unwrapped.size())
          let __keys = bridge.get_std__unordered_map_std__string__std__variant_bool__std__string__double___keys(__unwrapped)
          for __key in __keys {
            let __value = bridge.get_std__unordered_map_std__string__std__variant_bool__std__string__double___value(__unwrapped, __key)
            __dictionary[String(__key)] = { () -> EventPropertiesOutput in
              let __variant = bridge.std__variant_bool__std__string__double_(__value)
              switch __variant.index() {
                case 0:
                  let __actual = __variant.get_0()
                  return .first(__actual)
                case 1:
                  let __actual = __variant.get_1()
                  return .second(String(__actual))
                case 2:
                  let __actual = __variant.get_2()
                  return .third(__actual)
                default:
                  fatalError("Variant can never have index \(__variant.index())!")
              }
            }()
          }
          return __dictionary
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var url: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__url) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__url)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var target: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__target) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__target)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
}
