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

public extension NitroRequest {
  private typealias bridge = margelo.nitro.nitrofetch.bridge.swift

  /**
   * Create a new instance of `NitroRequest`.
   */
  init(url: String, method: NitroRequestMethod?, headers: [NitroHeader]?, bodyString: String?, bodyBytes: String?, bodyFormData: [NitroFormDataPart]?, timeoutMs: Double?, followRedirects: Bool?, prefetchCacheTtlMs: Double?, requestId: String?) {
    self.init(std.string(url), { () -> bridge.std__optional_NitroRequestMethod_ in
      if let __unwrappedValue = method {
        return bridge.create_std__optional_NitroRequestMethod_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_NitroHeader__ in
      if let __unwrappedValue = headers {
        return bridge.create_std__optional_std__vector_NitroHeader__({ () -> bridge.std__vector_NitroHeader_ in
          var __vector = bridge.create_std__vector_NitroHeader_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = bodyString {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = bodyBytes {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_NitroFormDataPart__ in
      if let __unwrappedValue = bodyFormData {
        return bridge.create_std__optional_std__vector_NitroFormDataPart__({ () -> bridge.std__vector_NitroFormDataPart_ in
          var __vector = bridge.create_std__vector_NitroFormDataPart_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = timeoutMs {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = followRedirects {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = prefetchCacheTtlMs {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = requestId {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var url: String {
    return String(self.__url)
  }
  
  @inline(__always)
  var method: NitroRequestMethod? {
    return self.__method.value
  }
  
  @inline(__always)
  var headers: [NitroHeader]? {
    return { () -> [NitroHeader]? in
      if bridge.has_value_std__optional_std__vector_NitroHeader__(self.__headers) {
        let __unwrapped = bridge.get_std__optional_std__vector_NitroHeader__(self.__headers)
        return { () -> [NitroHeader] in
                      var __array = [NitroHeader]()
                      let __count = __unwrapped.size()
                      __array.reserveCapacity(Int(__count))
                      for __i in 0..<__count {
                        let __item = bridge.get_std__vector_NitroHeader_(__unwrapped, __i)
                        __array.append(__item)
                      }
                      return __array
                    }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var bodyString: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__bodyString) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__bodyString)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var bodyBytes: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__bodyBytes) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__bodyBytes)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var bodyFormData: [NitroFormDataPart]? {
    return { () -> [NitroFormDataPart]? in
      if bridge.has_value_std__optional_std__vector_NitroFormDataPart__(self.__bodyFormData) {
        let __unwrapped = bridge.get_std__optional_std__vector_NitroFormDataPart__(self.__bodyFormData)
        return { () -> [NitroFormDataPart] in
                      var __array = [NitroFormDataPart]()
                      let __count = __unwrapped.size()
                      __array.reserveCapacity(Int(__count))
                      for __i in 0..<__count {
                        let __item = bridge.get_std__vector_NitroFormDataPart_(__unwrapped, __i)
                        __array.append(__item)
                      }
                      return __array
                    }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var timeoutMs: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__timeoutMs) {
        let __unwrapped = bridge.get_std__optional_double_(self.__timeoutMs)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var followRedirects: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__followRedirects) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__followRedirects)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var prefetchCacheTtlMs: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__prefetchCacheTtlMs) {
        let __unwrapped = bridge.get_std__optional_double_(self.__prefetchCacheTtlMs)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var requestId: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__requestId) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__requestId)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
}
