import { getDomain, request, applyQueryParameters } from './request'

/**
 * {{summary}}
 * request: {{ operationId }}
 * url: {{ path }}
 {% for parameter in parameters|default([]) %}
* @param {{ parameter.camelCaseName }} { {{ parameter.type }} } {{ parameter.description }}
 {% endfor %}
*/
export default function (parameters = {}) {
  const domain = parameters.$domain ? parameters.$domain : getDomain()
  const config = parameters.$config || {}
  let path = '{{ path }}'
  let body
  let queryParameters = {}
  let form = {}
{{ '' }}
{{ '' }}
{% set headerDetected = false %}
{%- for param in parameters|default([]) %}
  {%- if param.in == 'header' and headerDetected == false  %}
    {% set headerDetected = true %}
      if (!config.headers) {
        config.headers = {}
      }
  {% endif %}
{% endfor %}

{% for param in parameters|default([]) %}
  {%- if param.isRequired == true and param.hasDefault == false %}
  if(parameters['{{ param.camelCaseName }}'] === undefined) {
    return Promise.reject(new Error('Missing required {{ param.type }} parameter: {{ param.camelCaseName }}'))
  }
  {% endif %}

  {%- if param.in == 'header' %}
config.headers[`x-{{ param.name }}`] = parameters['{{- param.camelCaseName }}']
  {% endif %}

  {%- if param.in == 'query' %}
if(parameters['{{ param.camelCaseName }}'] !== undefined) {
    queryParameters['{{ param.name }}'] = parameters['{{ param.camelCaseName }}']
  } {% if param.hasDefault == true %} else if (parameters['{{ param.camelCaseName }}'] === undefined) {
    queryParameters['{{ param.name }}'] = {{ param.defaultValue }}
  }
    {% endif %}
  {% endif %}

  {%- if param.in == 'path' %}
path = path.replace('{{'{'}}{{- param.name }}{{ '}' }}', `${parameters['{{- param.camelCaseName }}']}`)
  {% endif %}

  {%- if param.isForm == true %}
if(parameters['{{param.camelCaseName}}'] !== undefined) {
  form['{{param.name}}'] = parameters['{{param.camelCaseName}}']
}
  {% endif %}
{% endfor %}

{% if hasRequestBody %}

  body = parameters.body || parameters.requestBody

  if (body === undefined) {
    return Promise.reject(new Error('Missing required parameter: body or requestBody'))
  }
  {% if noUselessPayloads == true %}

  if (typeof body === 'object') {
{% for param in parameters|default([]) %}
{% if param.in == 'path' %}
   delete body['{{- param.name }}']
{% endif %}
{% endfor %}
  }
  {% endif %}

{% if bodyPayloadType != false %}
  (config.headers !== undefined) ? (config.headers['Content-Type'] = '{{ bodyPayloadType }}') : (config['headers'] = {'Content-Type': '{{ bodyPayloadType }}' })
{% endif %}
{% endif %}

  applyQueryParameters(queryParameters, parameters.$queryParameters)

  return request('{{ method }}', domain + path, body, queryParameters, form, config)
}
