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

public extension MailOutgoingMessage {
  private typealias bridge = margelo.nitro.mailengine.bridge.swift

  /**
   * Create a new instance of `MailOutgoingMessage`.
   */
  init(from: MailAddressStruct?, to: [MailAddressStruct], cc: [MailAddressStruct]?, bcc: [MailAddressStruct]?, replyTo: [MailAddressStruct]?, subject: String, text: String?, html: String?, attachments: [MailOutgoingAttachment]?, headers: Dictionary<String, String>?, inReplyTo: String?, references: [String]?) {
    self.init({ () -> bridge.std__optional_MailAddressStruct_ in
      if let __unwrappedValue = from {
        return bridge.create_std__optional_MailAddressStruct_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__vector_MailAddressStruct_ in
      var __vector = bridge.create_std__vector_MailAddressStruct_(to.count)
      for __item in to {
        __vector.push_back(__item)
      }
      return __vector
    }(), { () -> bridge.std__optional_std__vector_MailAddressStruct__ in
      if let __unwrappedValue = cc {
        return bridge.create_std__optional_std__vector_MailAddressStruct__({ () -> bridge.std__vector_MailAddressStruct_ in
          var __vector = bridge.create_std__vector_MailAddressStruct_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_MailAddressStruct__ in
      if let __unwrappedValue = bcc {
        return bridge.create_std__optional_std__vector_MailAddressStruct__({ () -> bridge.std__vector_MailAddressStruct_ in
          var __vector = bridge.create_std__vector_MailAddressStruct_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_MailAddressStruct__ in
      if let __unwrappedValue = replyTo {
        return bridge.create_std__optional_std__vector_MailAddressStruct__({ () -> bridge.std__vector_MailAddressStruct_ in
          var __vector = bridge.create_std__vector_MailAddressStruct_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), std.string(subject), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = text {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = html {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_MailOutgoingAttachment__ in
      if let __unwrappedValue = attachments {
        return bridge.create_std__optional_std__vector_MailOutgoingAttachment__({ () -> bridge.std__vector_MailOutgoingAttachment_ in
          var __vector = bridge.create_std__vector_MailOutgoingAttachment_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__unordered_map_std__string__std__string__ in
      if let __unwrappedValue = headers {
        return bridge.create_std__optional_std__unordered_map_std__string__std__string__({ () -> bridge.std__unordered_map_std__string__std__string_ in
          var __map = bridge.create_std__unordered_map_std__string__std__string_(__unwrappedValue.count)
          for (__k, __v) in __unwrappedValue {
            bridge.emplace_std__unordered_map_std__string__std__string_(&__map, std.string(__k), std.string(__v))
          }
          return __map
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = inReplyTo {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_std__string__ in
      if let __unwrappedValue = references {
        return bridge.create_std__optional_std__vector_std__string__({ () -> bridge.std__vector_std__string_ in
          var __vector = bridge.create_std__vector_std__string_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(std.string(__item))
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var from: MailAddressStruct? {
    return self.__from.value
  }
  
  @inline(__always)
  var to: [MailAddressStruct] {
    return self.__to.map({ __item in __item })
  }
  
  @inline(__always)
  var cc: [MailAddressStruct]? {
    return { () -> [MailAddressStruct]? in
      if bridge.has_value_std__optional_std__vector_MailAddressStruct__(self.__cc) {
        let __unwrapped = bridge.get_std__optional_std__vector_MailAddressStruct__(self.__cc)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var bcc: [MailAddressStruct]? {
    return { () -> [MailAddressStruct]? in
      if bridge.has_value_std__optional_std__vector_MailAddressStruct__(self.__bcc) {
        let __unwrapped = bridge.get_std__optional_std__vector_MailAddressStruct__(self.__bcc)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var replyTo: [MailAddressStruct]? {
    return { () -> [MailAddressStruct]? in
      if bridge.has_value_std__optional_std__vector_MailAddressStruct__(self.__replyTo) {
        let __unwrapped = bridge.get_std__optional_std__vector_MailAddressStruct__(self.__replyTo)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var subject: String {
    return String(self.__subject)
  }
  
  @inline(__always)
  var text: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__text) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__text)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var html: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__html) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__html)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var attachments: [MailOutgoingAttachment]? {
    return { () -> [MailOutgoingAttachment]? in
      if bridge.has_value_std__optional_std__vector_MailOutgoingAttachment__(self.__attachments) {
        let __unwrapped = bridge.get_std__optional_std__vector_MailOutgoingAttachment__(self.__attachments)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var headers: Dictionary<String, String>? {
    return { () -> Dictionary<String, String>? in
      if bridge.has_value_std__optional_std__unordered_map_std__string__std__string__(self.__headers) {
        let __unwrapped = bridge.get_std__optional_std__unordered_map_std__string__std__string__(self.__headers)
        return { () -> Dictionary<String, String> in
          var __dictionary = Dictionary<String, String>(minimumCapacity: __unwrapped.size())
          let __keys = bridge.get_std__unordered_map_std__string__std__string__keys(__unwrapped)
          for __key in __keys {
            let __value = bridge.get_std__unordered_map_std__string__std__string__value(__unwrapped, __key)
            __dictionary[String(__key)] = String(__value)
          }
          return __dictionary
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var inReplyTo: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__inReplyTo) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__inReplyTo)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var references: [String]? {
    return { () -> [String]? in
      if bridge.has_value_std__optional_std__vector_std__string__(self.__references) {
        let __unwrapped = bridge.get_std__optional_std__vector_std__string__(self.__references)
        return __unwrapped.map({ __item in String(__item) })
      } else {
        return nil
      }
    }()
  }
}
