/*global $*/

/* eslint-disable */

{{> ../common}}

export function jsonReviver(key:string, value:any) {
    if (typeof value === 'string') {
        if (value.startsWith("20") && /^\d{4}-\d{2}-\d{2}/.test(value)) {
            const d= new Date(value);
            return d;
        }
    }
    return value;
}

function assertRequired(value:unknown){
    if (value === null || value === undefined) {
        throw new Error('field required');
    }
}

// courtesy of https://stackoverflow.com/questions/54122326/use-reviver-function-in-jquery-ajax-requests
$.ajaxSetup({
  converters: {
    // default was jQuery.parseJSON
    "text json": (data: string) => JSON.parse(data, jsonReviver),
  }
});

function pad(n: number) {
  return n < 10 ? "0" + n : n;
}

export function toISOString(d: Date) {
  return (
    d.getUTCFullYear() + "-" +
    pad(d.getUTCMonth() + 1) + "-" +
    pad(d.getUTCDate()) + "T" +
    pad(d.getUTCHours()) + ":" +
    pad(d.getUTCMinutes()) + ":" +
    pad(d.getUTCSeconds()) + "Z"
  );
}

function formatParam(p: unknown) {
  if (Object.prototype.toString.call(p) === "[object Date]") {
    return toISOString(p as Date);
  }
  return p;
}

export interface IApiGlobalConfig {
    basePath: string
    extraAjaxSettings: Partial<JQueryAjaxSettings>
}

export const globalConfig:IApiGlobalConfig = {
    //please use webpack's DefinePlugin to define API_PATH_ROOT
    basePath: BASE_PATH,
    extraAjaxSettings: {}
}

// ===============================================
// This file is autogenerated - Please do not edit
// ===============================================

/* tslint:disable:no-unused-variable */

export const defaultHeaders: {
    Authorization?: string
} = {};

type AjaxMethod = "GET" | "POST" | "PUT" | "DELETE";

export class BaseApi {
    protected basePath = globalConfig.basePath;
    protected defaultHeaders : any = {};
    protected auth = new OAuth() as Authentication;

    protected ajax(
        method: AjaxMethod,
        localVarPath: string,
        queryParameters: any,
        reqDict: any,
    ): Promise<any> {
        let url = this.basePath + localVarPath;
        const queryParams: {[k:string]: any} = {};
        for(const [key, val] of Object.entries(queryParameters)){
            if(typeof val !== "undefined"){
                queryParams[key] = formatParam(val);
            }
        }
        if(Object.keys(queryParams).length){
            url = url + "?" + $.param(queryParams);
        }
        let requestOptions: JQueryAjaxSettings = {
            ...globalConfig.extraAjaxSettings,
            url,
            type: method,
            headers: this.defaultHeaders,
            processData: false,
        };
        if (Object.keys(reqDict).length) {
            requestOptions.data = JSON.stringify(reqDict);
            requestOptions.contentType = "application/json; charset=utf-8";
        }
        this.auth.applyToRequest(requestOptions);
        return new Promise((resolve: any, reject: any) => {
            $.ajax(requestOptions).then(
                (data: any, textStatus: string, jqXHR: JQueryXHR) => resolve(data),
                (xhr: JQueryXHR, textStatus: string, errorThrown: string) => reject(xhr),
            );
        });
    }    
}

{{#models}}
{{#model}}
{{#description}}
    /**
    * {{{description}}}
    */
{{/description}}
{{#isEnum}}
// is an enum
export enum {{classname}}{
    {{#vendorExtensions.x-enum-pairs}} {{Name}} = "{{Name}}", {{/vendorExtensions.x-enum-pairs}}
}
{{/isEnum}}
{{^isEnum}}
// not an enum
export {{#vendorExtensions.x-inputModel}} class {{/vendorExtensions.x-inputModel}} {{^vendorExtensions.x-inputModel}} interface {{/vendorExtensions.x-inputModel}} {{classname}}{{#vendorExtensions.x-inheritsName}} extends {{{vendorExtensions.x-inheritsName}}} {{/vendorExtensions.x-inheritsName}} {
{{> ../validator}}
{{#vars}}
{{#description}}
{{/description}}
{{> ../property}}
{{/vars}}
}
{{/isEnum}}
{{/model}}
{{/models}}

export interface Authentication {
    /**
    * Apply authentication settings to header and query params.
    */
    applyToRequest(requestOptions: JQueryAjaxSettings): void;
}

export class OAuth implements Authentication {
    applyToRequest(requestOptions: JQueryAjaxSettings): void {
        requestOptions.headers = {
            ...requestOptions.headers,
            ...defaultHeaders
        }
    }
}

{{#apiInfo}}
{{#apis}}
{{#operations}}
{{#description}}
/**
* {{&description}}
*/
{{/description}}

export class {{classname}} extends BaseApi {
{{#operation}}
    public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: 
{{#vendorExtensions.x-enumTypeName}}
{{vendorExtensions.x-enumTypeName}}
{{/vendorExtensions.x-enumTypeName}}
{{^vendorExtensions.x-enumTypeName}}
{{{dataType}}}
{{/vendorExtensions.x-enumTypeName}}
{{#hasMore}}, {{/hasMore}}{{/allParams}}) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
        let localVarPath = '{{{path}}}'{{#pathParams}}
            .replace('{' + '{{baseName}}' + '}', String({{paramName}})){{/pathParams}};
{{#allParams}}{{#required}}
        assertRequired({{paramName}});
{{/required}}{{/allParams}}
        const queryParams = {
{{#queryParams}}
            "{{baseName}}": {{paramName}},
{{/queryParams}}
        };
{{^bodyParam}}
        let reqDict = {};
{{#formParams}}
        if ({{paramName}} !== undefined) {
            reqDict['{{baseName}}'] = {{paramName}};
        }

{{/formParams}}
{{/bodyParam}}
{{#bodyParam}}
        let reqDict = {{paramName}};
{{/bodyParam}}
        return this.ajax("{{httpMethod}}", localVarPath, queryParams, reqDict) as any;
    }
{{/operation}}
}
{{/operations}}
{{/apis}}
{{/apiInfo}}
