import {ApiHandler} from "./ApiHandler";
import {IApi} from "./IApi";
import {
    ExpectFunction,
    FailFunction,
    ResolveParams,
    ResponseHandlerDefineFunction,
    SuccessFunction
} from "./TypeDefine";
import {AxiosInstance, AxiosRequestConfig} from "axios";
import {ISendResponse} from "./ISendResponse";

class ApiHandlerAxios<T extends IApi> extends ApiHandler<T> {

    axiosInstance: AxiosInstance


    constructor(api: T, responseHandlerDefineFunction: ResponseHandlerDefineFunction, axiosInstance: AxiosInstance) {
        super(api, responseHandlerDefineFunction);
        this.axiosInstance = axiosInstance;
    }

    send(args: ResolveParams<T["params"]>): Promise<ISendResponse<any>> {
        if (!this.api.path) return Promise.reject(`request path is undefined`)
        let path = this.api.path
        const config: AxiosRequestConfig<any> = {
            method: this.api.method,
        }
        if (Array.isArray(this.api.params)) {
            const params = ApiHandler.assemblyParameters(this.api.params, args, this.api);
            if (typeof params === 'string')
                path += params
            else
                config.data = params;
        } else if (typeof this.api.params !== 'undefined') {
            const params = ApiHandler.assemblyParametersToUnion(this.api.params, args, this.api);
            path += params.path + params.query
            config.data = params.body;
        }
        return this.axiosInstance(path, config)
            .then(res => {
                const response: ISendResponse<T> = {
                    code: res.data?.code ?? res.data?.status ?? res.status,
                    message: res.data?.message ?? res.data?.msg ?? res.statusText,
                    data: res.data?.data
                }
                return response
            });
    }

}

export {ApiHandlerAxios}