//ts check
/**
* 语音转文字服务商工厂
*/
import OpenAIGpt from './openai';
import DeepSeek from './deepseek';
import CorzBot from './corzbot'
import OpenAIProxt from './openaiproxy';
import AzureAI from './azureai'
import StabilityAI from './stabilityai'
import StabilityPlusAI from './stabilityplusai'
import BaiduWenXinAI, { ApiCredential } from './baiduai'
import AIMiddlePlatform  from './aimp';
import DouBaoAI from './doubaoai'
import GptBase from './gptbase';
import { CorzAuthorization } from './corzauthorization'
// 扣子的身份认证应用
const corzAuth: Map<string, CorzAuthorization> = new Map();
/**
 * OpenAI/NLP 的服务提供商 OpenAI,微软，百度文心(待接入)，google(待接入)
 */
export const GptProviderEnum = {
    OPENAI: 'openai',
    OPENAIPROXY:'openaiproxy',
    MICROSOFT: 'microsoft',
    AIMP: 'aimp',   ///AI 中台业务
    COZE:'coze',
    BAIDU: 'baidu',
    DOUBAO:'doubao',
    DEEPSEEK:'deepseek',
    GOOGLE:'google',
    STABILITY:'stability',
    STABILITY2: 'stability2',
} as const;
export type GptProviderEnum = typeof GptProviderEnum[keyof typeof GptProviderEnum];
/**
 * 根据类型创建不同的TTS引擎对象
 * @param {*} provider 
 * @param {*} apikey 
 * @param {*} setting 
 * @returns 
 */
export function createGpt(provider: GptProviderEnum, apikey: string|ApiCredential, setting: any): GptBase | null {
    let { model,agentid, maxtoken, temperature, serviceurl,endpoint, engine, version, embedding, top_p, presence_penalty, frequency_penalty } = setting || {};
    switch (provider) {
        case GptProviderEnum.OPENAI: 
            return new OpenAIGpt(apikey + '', { model, maxtoken, temperature, embedding, top_p, presence_penalty, frequency_penalty });
        case GptProviderEnum.DEEPSEEK:
            return new DeepSeek(apikey + '', { model, maxtoken, temperature, embedding, top_p, presence_penalty, frequency_penalty });
        case GptProviderEnum.OPENAIPROXY:
            return new OpenAIProxt(apikey + '', { serviceurl}, { model, maxtoken, temperature, embedding, top_p, presence_penalty, frequency_penalty });
        case GptProviderEnum.MICROSOFT: 
            return new AzureAI(apikey + '', { endpoint, engine, version }, { model, maxtoken, temperature, embedding, top_p, presence_penalty, frequency_penalty }, );
        case GptProviderEnum.BAIDU:
            let cred: ApiCredential = typeof (apikey) === 'string' ? { apikey, securitykey: apikey } : apikey;
            return new BaiduWenXinAI(cred);
        case GptProviderEnum.AIMP:
            return new AIMiddlePlatform(apikey+'',{ endpoint,agentid });
        case GptProviderEnum.COZE:
            let authorizationProvider  = corzAuth.get(apikey + '');  
            if (!authorizationProvider) {
                authorizationProvider = new CorzAuthorization(apikey + '',setting);
                corzAuth.set(apikey + '', authorizationProvider);
            }
            return new CorzBot(authorizationProvider!, setting);
        case GptProviderEnum.DOUBAO:
            return new DouBaoAI(apikey + '', { model, maxtoken, temperature, top_p, presence_penalty, frequency_penalty })
        case GptProviderEnum.STABILITY:
            return new StabilityAI(apikey + '', { endpoint, engine }, setting);
        case GptProviderEnum.STABILITY2:
            return new StabilityPlusAI(apikey + '', { endpoint, engine }, setting);
        default: return null;
    }
};