{{>licenseInfo}}
{{#platforms}}
{{#node}}
import {{^supportsES6}}* as{{/supportsES6}} FormData from "form-data";
import { URLSearchParams } from 'url';
{{/node}}
{{/platforms}}

import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import Client from "../../client";
import { IRequest } from "../../typings/requestOptions";
import Resource from "../resource";

import { ObjectSerializer } from "../../typings/{{serviceName}}/objectSerializer";
{{#imports}}
import { {{classname}} } from "../../typings/{{serviceName}}/models";
{{/imports}}
{{#operations}}

/**
 * API handler for {{classname}}
 */
{{#useInversify}}
@injectable()
{{/useInversify}}
export class {{classname}} extends Service {

    private readonly API_BASEPATH: string = "{{{basePath}}}";
    private baseUrl: string;

    public constructor(client: Client){
        super(client);
        this.baseUrl = this.createBaseUrl(this.API_BASEPATH);
    }

    {{#operation}}
{{>api_summary}}
    public async {{#vendorExtensions.x-methodName}}{{.}}{{/vendorExtensions.x-methodName}}{{^vendorExtensions.x-methodName}}{{nickname}}{{/vendorExtensions.x-methodName}}({{#pathParams}}{{paramName}}: {{{dataType}}}, {{/pathParams}}{{#bodyParams}}{{paramName}}: {{{dataType}}}, {{/bodyParams}}{{#queryParams}}{{#required}}{{paramName}}: {{{dataType}}}, {{/required}}{{/queryParams}}{{#queryParams}}{{^required}}{{paramName}}?: {{{dataType}}}, {{/required}}{{/queryParams}}requestOptions?: IRequest.Options): Promise<{{#returnProperty}}{{openApiType}}{{/returnProperty}}{{^returnProperty}}void{{/returnProperty}}> {
        const endpoint = `${this.baseUrl}{{{path}}}`{{#pathParams}}
            .replace("{" + "{{baseName}}" + "}", encodeURIComponent(String({{paramName}}))){{/pathParams}};
        const resource = new Resource(this, endpoint);
        
{{#bodyParam}}
        const request: {{{dataType}}} = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
{{/bodyParam}}
{{#hasQueryParams}}
        const hasDefinedQueryParams = {{#queryParams}}{{paramName}}{{^-last}} ?? {{/-last}}{{/queryParams}};
        if(hasDefinedQueryParams) {
            if(!requestOptions) requestOptions = {};
            if(!requestOptions.params) requestOptions.params = {};
{{#queryParams}}
            if({{paramName}}) requestOptions.params["{{paramName}}"] = {{paramName}}{{#isDateTime}}.toISOString(){{/isDateTime}};
{{/queryParams}}
        }
{{/hasQueryParams}}
        {{#returnProperty}}const response = {{/returnProperty}}await getJsonResponse<{{#bodyParam}}{{{dataType}}}{{/bodyParam}}{{^bodyParam}}string{{/bodyParam}}, {{#returnProperty}}{{openApiType}}{{/returnProperty}}{{^returnProperty}}void{{/returnProperty}}>(
            resource,
            {{#bodyParam}}request{{/bodyParam}}{{^bodyParam}}""{{/bodyParam}},
            { ...requestOptions, method: "{{httpMethod}}" }
        );
        {{#returnProperty}}

        return ObjectSerializer.deserialize(response, "{{{openApiType}}}");
        {{/returnProperty}}
    }

    {{/operation}}
}
{{/operations}}
