
{{>modelIncludes models=components.schemas options=_options}}
{{>modelIncludes models=components.inlineObjects options=_options}}
{{{import "Configuration" "configuration"}}};
{{{import "request" "request"}}};
{{{import "ParameterBuilder" "parameterBuilder"}}};
{{{import "{deserialize, serialize}" "serializer"}}};

/**
 * {{_info.title}}
 *
{{#if info.description}}{{docComment info.description}}{{/if}}
{{#if info.version}} * @version {{info.version}}{{/if}}
 */
class Api{{_tag.name}} {

  constructor(config) {
    this.config = config;
  }

  {{#each paths}}
  {{setVar "path" @key}}
  {{#each this}}
    {{#ifEquals ../../_tag.name _tag.name}}
    
      /** 
      {{#if summary}}
       * {{summary}}
       * 
      {{/if}}
      {{#if description}}
       * {{description}}
       *
      {{/if}}
      {{#if tags}} * @tags {{tags}}{{/if}}
      {{#each _sortedParameters}}
       * @param { {{~typeConvert schema ../../../_options~}} } {{name}} {{description}}
      {{/each}}
      */
      async {{operationId}}(
        {{#each _sortedParameters}}
          {{name}}
          {{#if schema.default}} = {{{quoteIfString schema.default}}}{{/if}},
        {{/each}}
      ) {

        const builder = new ParameterBuilder();
        {{#each _sortedParameters}}{{#unless _optional}}
        builder.add("{{name}}", {{name}}, "{{typeConvert schema}}", "{{in}}");
        {{/unless}}{{/each}}
        
        {{#each _sortedParameters}}{{#if _optional}}
        if ({{name}}) {
          builder.add("{{name}}", {{name}}, "{{typeConvert schema}}", "{{in}}");
        }
        {{/if}}{{/each}}

        const response = await request(this.config, "{{@root.path}}", "{{@key}}", builder.parameters);
        {{#if _response.schema}}
        return {
          ...response,
          data: deserialize(response.data, "{{typeConvert _response.schema}}")
        }
        {{else}}
        return {
          ...response
        };
        {{/if}}
      };

    {{/ifEquals}}
  {{/each}}  
  {{/each}}
}

{{{export}}} Api{{_tag.name}};
