{{>licenseInfo}}

import ApiClient from '../ApiClient';
{{#imports}}import {{import}} from '../{{#modelPackage}}{{&modelPackage}}/{{/modelPackage}}{{import}}';
{{/imports}}

{{#emitJSDoc}}/**
* {{baseName}} service.
* @module {{#invokerPackage}}{{&invokerPackage}}/{{/invokerPackage}}{{#apiPackage}}{{&apiPackage}}/{{/apiPackage}}{{classname}}
* @version {{projectVersion}}
*/

/**
* Constructs a new {{&classname}}. {{#description}}
    * {{&description}}{{/description}}
* @alias module:{{#invokerPackage}}{{&invokerPackage}}/{{/invokerPackage}}{{#apiPackage}}{{apiPackage}}/{{/apiPackage}}{{classname}}
* @class
* @param {module:{{#invokerPackage}}{{&invokerPackage}}/{{/invokerPackage}}ApiClient} apiClient Optional API client implementation to use,
* default to {@link module:{{#invokerPackage}}{{&invokerPackage}}/{{/invokerPackage}}ApiClient#instance} if unspecified.
*/
{{/emitJSDoc}}

export default class {{&classname}}  {
    constructor(apiClient){
        this.apiClient = apiClient || ApiClient.instance;
    }
{{#operations}}{{#operation}}
    {{#emitJSDoc}}

    /**{{#summary}}
    * {{&summary}}{{/summary}}{{#notes}}
    * {{&notes}}{{/notes}}{{#allParams}}{{#required}}
    * @param {{{&_jsDocType}}} {{paramName}} {{&description}}{{/required}}{{/allParams}}{{#hasOptionalParams}}
    * @param {Object} opts Optional parameters{{#allParams}}{{^required}}
        * @param {{{&_jsDocType}}} opts.{{paramName}} {{&description}}{{#defaultValue}} (default to {{.}}){{/defaultValue}}{{/required}}{{/allParams}}{{/hasOptionalParams}}
    * @return {Promise} a {@link https://www.promisejs.org/|Promise}{{#returnType}}, with data of type {@link {{&_jsDocType}} }{{/returnType}}
    */
{{/emitJSDoc}}
    {{operationId}}({{_argList}}) { {{#hasOptionalParams}}
        opts = opts || {};
        {{/hasOptionalParams}}
        const postBody =  {{#bodyParam}}{{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}};
        {{#allParams}}{{#required}}
        // verify the required parameter '{{paramName}}' is set
        if ({{paramName}}  == null) {
            throw "Missing the required parameter '{{paramName}}' when calling {{operationId}}";
        }
{{/required}}{{/allParams}}

        const pathParams = {
            {{#pathParams}}
                '{{baseName}}': {{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}{{#hasMore}},{{/hasMore}}
            {{/pathParams}}
        };
        const queryParams = {
            {{#queryParams}}
                '{{baseName}}': {{#collectionFormat}}this.apiClient.buildCollectionParam({{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}, '{{collectionFormat}}'){{/collectionFormat}}{{^collectionFormat}}{{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}{{/collectionFormat}}{{#hasMore}},{{/hasMore}}
            {{/queryParams}}
        };
        const headerParams = {
            {{#headerParams}}
                '{{baseName}}': {{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}{{#hasMore}},{{/hasMore}}{{/headerParams}}
        };
        const formParams = {
            {{#formParams}}
                '{{baseName}}': {{#collectionFormat}}this.apiClient.buildCollectionParam({{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}, '{{collectionFormat}}'){{/collectionFormat}}{{^collectionFormat}}{{#required}}{{paramName}}{{/required}}{{^required}}opts['{{paramName}}']{{/required}}{{/collectionFormat}}{{#hasMore}},{{/hasMore}}{{/formParams}}
        };

        const authNames = [{{#authMethods}}'{{name}}'{{#hasMore}}, {{/hasMore}}{{/authMethods}}];
        const contentTypes = [{{#consumes}}'{{& mediaType}}'{{#hasMore}}, {{/hasMore}}{{/consumes}}];
        const accepts = [{{#produces}}'{{& mediaType}}'{{#hasMore}}, {{/hasMore}}{{/produces}}];
        const returnType = {{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}null{{/returnType}};

        return this.apiClient.callApi('{{&path}}', '{{httpMethod}}', pathParams, queryParams, headerParams, formParams, postBody, authNames, contentTypes, accepts, returnType);
    }
{{/operation}}{{/operations}}
}