{{>licenseInfo}}
import ajax, { AjaxPromise } from '@ajax';
{{^models.isEmpty}}
import * as models from '../model/models';
{{/models.isEmpty}}

/* tslint:disable:no-unused-variable member-ordering object-literal-shorthand */

{{#operations}}
{{#operation}}
{{#allParams.0}}
{{^hasOnlyBodyParams}}
export interface Params{{nickname}} {
{{#headerParams.0}}
  // headerParams
  {{#headerParams}}
  {{#description}}
  /**
    * **`{{paramName}}`** {{&description}}
    */
  {{/description}}
  {{paramName}}{{^required}}?{{/required}}: {{&dataType}};{{#description}} // {{&description}}{{/description}}
  {{/headerParams}}
{{/headerParams.0}}
{{#pathParams.0}}
  // pathParams
  {{#pathParams}}
  {{#description}}
  /**
    * **`{{paramName}}`** {{&description}}
    */
  {{/description}}
  {{paramName}}{{^required}}?{{/required}}: {{&dataType}};{{#description}} // {{&description}}{{/description}}
  {{/pathParams}}
{{/pathParams.0}}
{{#queryParams.0}}
  // queryParams
  {{#queryParams}}
  {{#description}}
  /**
    * **`{{paramName}}`** {{&description}}
    */
  {{/description}}
  {{paramName}}{{^required}}?{{/required}}: {{{dataType}}};{{#description}} // {{&description}}{{/description}}
  {{/queryParams}}
{{/queryParams.0}}
{{#formParams.0}}
  // formParams
  {{#formParams}}
  {{paramName}}{{^required}}?{{/required}}: {{&dataType}};{{#description}} // {{&description}}{{/description}}
  {{/formParams}}
{{/formParams.0}}
}
{{/hasOnlyBodyParams}}
{{#bodyParam}}
export type ParamsBody{{nickname}} = {{&dataType}};{{#description}} // {{&description}}{{/description}}
{{/bodyParam}}
{{/allParams.0}}
{{/operation}}
{{#description}}
/**
 * {{&description}}
 */
{{/description}}
export class {{classname}} {
  protected $basePath = '{{{contextPath}}}'.replace(/\/$/, '');

  public constructor(basePath?: string) {
    if (basePath !== undefined) {
      this.$basePath = basePath.replace(/\/$/, '');
    }
  }

{{#operation}}
  /**
   * {{&notes}}
   {{#summary}}
   * @summary {{&summary}}
   {{/summary}}
   {{#allParams.0}}{{^hasOnlyBodyParams}}* @param params Params{{nickname}}{{/hasOnlyBodyParams}}{{/allParams.0}}
   {{#bodyParam}}* @param body: ParamsBody{{nickname}}{{#description}}// {{&description}}{{/description}}{{/bodyParam}}
   */
  public {{nickname}} = (
    {{#allParams.0}}{{^hasOnlyBodyParams}}params: Params{{nickname}},{{/hasOnlyBodyParams}}{{/allParams.0}}
    {{#bodyParam}}data: ParamsBody{{nickname}}{{/bodyParam}}
  ) : AjaxPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}>  => {
    const path = '{{{path}}}';
    const url = this.$basePath + path{{#pathParams.0}}
      .replace(/\{([^}]+)\}/g, (all, param) => (param in params ? params[param] : param)){{/pathParams.0}};
    const p: any = {};
{{#queryParams.0}}
    p.query = {};
{{#queryParams}}
    if ('{{paramName}}' in params) p.query.{{paramName}} = params.{{paramName}};
    {{#required}}
    ajax.check(params.{{paramName}}, '{{paramName}}');
    {{/required}}
{{/queryParams}}
{{/queryParams.0}}
{{#pathParams}}
    {{#required}}
    ajax.check(params.{{paramName}}, '{{paramName}}');
    {{/required}}
{{/pathParams}}
{{#formParams.0}}
    p.form = {};
{{#formParams}}
    if ('{{paramName}}' in params) p.form.{{paramName}} = params.{{paramName}};
    {{#required}}
    ajax.check(params.{{paramName}}, '{{paramName}}');
    {{/required}}
{{/formParams}}
{{/formParams.0}}
{{#bodyParam}}
    p.data = data;
    {{#required}}
    ajax.check(data, 'body.{{paramName}}');
    {{/required}}
{{/bodyParam}}
    return ajax.ajax({
      method: '{{httpMethod}}',
      url,
      ...p
    }, path, this.$basePath);
  }
{{/operation}}
}
{{/operations}}

export default new {{classname}}();