import {AuthType} from './enums/AuthType'
import {RequestBodyType} from './enums/RequestBodyType'
import {IHttpResponse} from './utils/http/IHttpResponse'
import {MsFile} from './model/MsFile'
import {HttpMethodType} from "./enums/HttpMethodType";

/**
 * 微服务客户端使用接口
 * 微服务主地址、appId、appKey -> 配置文件中设置
 * traceId -> 客户端内部处理，从当前request的header获取，不可为空，如果当前request无值，那么客户端生成一个uuid填入本次调用的header
 * @author WuFenglin
 **/
export interface ServiceClient {

    /**
     * 微服务调用
     * @param sid 微服务id
     * @param version 版本
     * @param tags 调用者可传入的一个标签参数，用于业务层面的追踪。
     *             例如：通过车牌可以追溯一位车主在一次停车缴费过程中，查询车费、支付、下发车场通知等过程的相关日志。多个标签之间用逗号隔开。
     * @param bodyObj post提交到微服务的可系列和为json格式的body对象
     * @return 成功调用微服务后，返回json转换后业务对象
     * @throws Exception 调用失败后抛出异常
     */
    call<T = any, R = IHttpResponse<T>>(httpMethod: HttpMethodType, sid: string, version: string, tags: string, header: object, params: object, bodyObj: object, authType: AuthType, bodyType: RequestBodyType): Promise<R>;

    get<T = any, R = IHttpResponse<T>>(sid: string, version: string, tags: string, header: object, params: object, authType: AuthType): Promise<R>;

    postFiles<T = any, R = IHttpResponse<T>>(sid: string, version: string, tags: string, header: object, formParams: object, files: Array<MsFile>, authType: AuthType): Promise<R>;


}