import { ApiResult, CacheProvider, request } from "./declare";
import GptBase from "./gptbase"
const TOKEN_CACHE_KEY = "key:_doomisoft:baiduwenxin:"
export default class BaiduWenXinAI extends GptBase {
    
    protected credential: ApiCredential;
    private Cacher: CacheProvider|undefined;
    /**
     * 
     * @param credential 调用OpenAI 的key
     * @param cacher  用作accesstoken的缓存 
     * @param apiOption  用作accesstoken的缓存 
     */
    constructor(credential: ApiCredential, cacher?:CacheProvider) {
        super();
        this.credential = credential;
        this.Cacher = cacher;
    }
    /**
     * 获取调用Api的Token
     */
    async getAccessToken():Promise<AccessTokenResult>{
        ////如果当前应用是一个委托到第三方的
        ///公众号或小程序，则需要用关联的第三方平台来获取api调用的accesstoken
        ////如果是需要缓存token,则首先看缓存中是否有AccessToken
        const accesstoken = this.Cacher ? (await this.Cacher.get(TOKEN_CACHE_KEY+this.credential.apikey)):null;
        if (accesstoken) return { successed: true, access_token: accesstoken };
        const option = {
            url: `https://wenxin.baidu.com/moduleApi/portal/api/oauth/token?grant_type=client_credentials&client_id=${this.credential.apikey}&client_secret=${this.credential.securitykey}`,
            method:"post",
        };
        const tokenData = await request(option);
        if (tokenData.successed == true && !tokenData.data.code) {
            ///把api accesstoken缓存起来
            if (this.Cacher){
                this.Cacher.set(TOKEN_CACHE_KEY + this.credential.apikey, tokenData.data.data,3600*20);
            }
            return { successed: true, access_token: tokenData.data.data };
        }
        return { successed: false, error: tokenData.data.msg }
    }
   
    /**
     * 请求GPT接口
     */
    public async chatRequest(chatText: string | Array<any>, _paramOption: any, axiosOption: any = {}): Promise<ApiResult> {
        console.log('call baidu')
        if (!chatText) return { successed: false, error: { errcode: 2, errmsg: '缺失聊天的内容' } };
        const accessToken = await this.getAccessToken();
        if (!accessToken.successed || !accessToken.access_token) return {successed:false,error:'accesstoken get failed'}
        try {
            let param = {
                ...axiosOption,
                method: "post",
                data: {
                    text: `问题：${chatText}\n回答：`,
                    seq_len: 512,
                    topp: 0.5,
                    penalty_score: 1.2,
                    min_dec_len: 12,
                    min_dec_penalty_text: "。?：！[<S>]",
                    task_prompt: "qa",
                    mask_type: "paragraph"
                },
                url:`https://wenxin.baidu.com/moduleApi/portal/api/rest/1.0/ernie/3.0.25/zeus?access_token=${accessToken.access_token}`
            };
            console.log('param', param)
            const response = await request(param)
            if (response.successed && !response.data.code) {
                return { successed: true, ...response.data };
            }
            return { successed: false, ...response.data };
        } catch (error) {
            console.log('result is error ', error)
            return { successed: false, error };
        }

    }
}
export interface AccessTokenResult extends ApiResult {
    'access_token'?: string
}
export interface ApiCredential{
    'apikey':string,
    'securitykey': string
}