/* eslint-disable */

import Taro from "@tarojs/taro";

const Fetch = Taro.request;
export type FetchAPI = typeof Taro.request;
export type FetchInit = Omit<Taro.request.Option, "url" | "method">;
export type FecthHeader = FetchInit["header"];
export type FecthData = FetchInit["data"];
export type FetchMethod = keyof Taro.request.method;
export const DEFAULT_HEADER: FetchInit = {};
export interface FetchArgs {
    path: string;
    method: FetchMethod;
    options: FetchInit;
}

{{> ../common}}

export class BaseAPI {
    constructor(
        protected fetch: FetchAPI = Fetch,
        protected basePath: string = BASE_PATH) {}

    protected async callApi(fetchArgs: FetchArgs) {
        const { path, method, options } = fetchArgs;
        const { data, statusCode, errMsg } = await this.fetch({
            url: this.basePath + path,
            method,
            ...options,
        });

        if (statusCode >= 200 && statusCode < 300) {
            return data;
        } else {
            throw errMsg;
        }
    }
}

{{#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
{{#vendorExtensions.x-inheritsName}} 
// x-inputModel: {{vendorExtensions.x-inputModel}} 
export {{#vendorExtensions.x-inputModel}} class {{/vendorExtensions.x-inputModel}} {{^vendorExtensions.x-inputModel}} interface {{/vendorExtensions.x-inputModel}} {{classname}} extends {{{vendorExtensions.x-inheritsName}}} 
{{/vendorExtensions.x-inheritsName}} 
{{^vendorExtensions.x-inheritsName}} 
export {{#vendorExtensions.x-inputModel}} class {{/vendorExtensions.x-inputModel}} {{^vendorExtensions.x-inputModel}} interface {{/vendorExtensions.x-inputModel}} {{classname}}
{{/vendorExtensions.x-inheritsName}} 

{
{{> ../validator}}
{{#vars}}
{{#description}}
    /**
    * {{{description}}}
    */
{{/description}}

{{> ../property}}
{{/vars}}
}
{{/isEnum}}

{{#hasEnums}}
{{/hasEnums}}
{{/model}}
{{/models}}

{{#apiInfo}}
{{#apis}}
{{#operations}}

/**
 * {{classname}} - object-oriented interface{{#description}}
 * {{&description}}{{/description}}
 */
export class {{classname}} extends BaseAPI {
{{#operation}}
    /** {{#summary}}
     * {{summary}}{{/summary}}{{#notes}}
     * {{notes}}{{/notes}}{{#allParams}}
     * @param {{paramName}} {{description}}{{/allParams}}
     */
    {{nickname}}({{#hasParams}}params: { 
{{#allParams}} 
"{{paramName}}"{{^required}}?{{/required}}: 
//mark first
{{#vendorExtensions.x-enumTypeName}}
{{vendorExtensions.x-enumTypeName}}{{^required}} | null{{/required}}
{{/vendorExtensions.x-enumTypeName}}
{{^vendorExtensions.x-enumTypeName}}
{{{dataType}}}{{^required}} | null{{/required}}
{{/vendorExtensions.x-enumTypeName}}
;{{/allParams}} }, {{/hasParams}}options?: FetchInit): Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>  {
    {{#allParams}}
{{#required}}
        // verify required parameter "{{paramName}}" is set
        //if (!("{{paramName}}" in params)) {
        //    throw new Error("{{paramName}} required");
        //}
{{/required}}
{{/allParams}}
        const _path = "{{path}}"{{#pathParams}}.replace("{" + "{{baseName}}" + "}", `${ params["{{paramName}}"] }`){{/pathParams}};
        const { header, ...rest } = options || {};
        let _header: FecthHeader = {};
        let _extraHeader: FecthHeader = {};
        let _data: FecthData = {};

{{#hasQueryParams}}
        _data = {
            {{#queryParams}}
            "{{baseName}}": params["{{paramName}}"],
            {{/queryParams}}
        };
{{/hasQueryParams}}

{{#hasFormParams}}
        _header = { "Content-Type": "application/x-www-form-urlencoded" };
        _data = {
            {{#formParams}}
                "{{baseName}}": params["{{paramName}}"],
            {{/formParams}}
        };
{{/hasFormParams}}
{{#hasBodyParam}}
        _header = { "Content-Type": "application/json" };
        {{#bodyParam}}
        if (params["{{paramName}}"]) {
            _data = params["{{paramName}}"];
        }
        {{/bodyParam}}
{{/hasBodyParam}}
{{#hasHeaderParams}}
        _extraheader = {
            {{#headerParams}}"{{baseName}}": params["{{paramName}}"],{{/headerParams}}
        };
{{/hasHeaderParams}}

        const _options: FetchInit = {
            header: { ...DEFAULT_HEADER, ..._header, ..._extraHeader, ...header },
            data: _data,
            ...rest
        };

        return this.callApi({
            path: _path,
            method: "{{httpMethod}}"
            options: _options,
        });
    }
{{/operation}}
};
{{/operations}}
{{/apis}}
{{/apiInfo}}
