/**
 * Copyright 2025 Beijing Volcano Engine Technology Co., Ltd. All Rights Reserved.
 * SPDX-license-identifier: BSD-3-Clause
 */

import {
  TTS_CLUSTER,
  ARK_V3_MODEL_ID,
  ModelSourceType,
  SCENE,
  Prompt,
  Welcome,
  Model,
  Voice,
  LLM_BOT_ID,
  AI_MODEL,
  AI_MODE_MAP,
  AI_MODEL_MODE,
} from '.';

export const CONVERSATION_SIGNATURE = 'conversation';

/**
 * @brief RTC & AIGC 配置。
 * @notes 更多参数请参考
 *        https://www.volcengine.com/docs/6348/1404673?s=g
 */
export class ConfigFactory {
  BaseConfig = {
    /**
     * @note 必填, RTC AppId 可于 https://console.volcengine.com/rtc/listRTC?s=g 中获取。
     */
    AppId: '67e11a296ff39301ed7429aa',
    /**
     * @brief 非必填, 按需填充。
     */
    BusinessId: undefined,
    /**
     * @brief 必填, 房间 ID, 自定义即可，例如 "Room123"。
     */
    // RoomId: 'demo01',
    // /**
    //  * @brief 必填, 当前和 AI 对话的用户的 ID, 自定义即可，例如 "User123"。
    //  */
    // UserId: 'demo01',
    // /**
    //  * @brief 必填, RTC Token, 由 AppId、RoomId、UserId、时间戳等等信息计算得出。
    //  *        测试跑通时，可于 https://console.volcengine.com/rtc/listRTC?s=g 列表中，
    //  *        找到对应 AppId 行中 "操作" 列的 "临时Token" 按钮点击进行生成, 用于本地 RTC 通信进房鉴权校验。
    //  *        正式使用时可参考 https://www.volcengine.com/docs/6348/70121?s=g 通过代码生成 Token。
    //  *        建议先使用临时 Token 尝试跑通。
    //  * @note 生成临时 Token 时, 页面上的 RoomId / UserId 填的与此处的 RoomId / UserId 保持一致。
    //  */
    // Token: '00167e11a296ff39301ed7429aaQgCBehoDv2DnZz+b8GcGAGRlbW8wMQYAZGVtbzAxBgAAAD+b8GcBAD+b8GcCAD+b8GcDAD+b8GcEAD+b8GcFAD+b8GcgANQXUJb6Yt/biLcxDjYTT6Y/jJR3QRGoF3lUAfBn0ltq',
    /**
     * @brief 必填, TTS(语音合成) AppId, 可于 https://console.volcengine.com/speech/app?s=g 中获取, 若无可先创建应用。
     * @note 创建应用时, 需要选择 "语音合成" 服务, 并选择对应的 App 进行绑定。
     */
    TTSAppId: '6735945315',
    /**
     * @brief 已开通需要的语音合成服务的token。
     *        使用火山引擎双向流式语音合成服务时必填。  
     */
    TTSToken: undefined,
    /**
     * @brief 必填, ASR(语音识别) AppId, 可于 https://console.volcengine.com/speech/app?s=g 中获取, 若无可先创建应用。
     * @note 创建应用时, 需要按需根据语言选择 "流式语音识别" 服务, 并选择对应的 App 进行绑定。
     */
    ASRAppId: '1322261305',
    /**
     * @brief 已开通流式语音识别大模型服务 AppId 对应的 Access Token。
     *        使用流式语音识别大模型服务时该参数为必填。  
     */
    ASRToken: undefined,
  };

  Model: AI_MODEL = Model[SCENE.CUSTOM];

  /**
   * @note 必填, 音色 ID, 可具体看定义。
   *       音色 ID 获取方式可查看 VOICE_TYPE 定义
   *       此处已有默认值, 不影响跑通, 可按需修改。
   */
  VoiceType = Voice[SCENE.CUSTOM];

  /**
   * @note 大模型 System 角色预设指令, 可用于控制模型输出, 类似 Prompt 的概念。
   */
  Prompt = Prompt[SCENE.CUSTOM];

  /**
   * @note 智能体启动后的欢迎词。
   */
  WelcomeSpeech = Welcome[SCENE.CUSTOM];

  ModeSourceType = ModelSourceType.Available;

  /**
   * @note 非必填, 第三方模型才需要使用, 用火山方舟模型时无需关注。
   */
  Url? = '';

  /**
   * @note 非必填, 第三方模型才需要使用, 用火山方舟模型时无需关注。
   */
  APIKey? = '';

  /**
   * @brief AI Robot 名
   * @default RobotMan_
   */
  BotName = 'RobotMan_';

  /**
   * @brief 是否为打断模式
   */
  InterruptMode = false;

  get LLMConfig() {    
    const params: Record<string, unknown> = {
      Mode: AI_MODE_MAP[this.Model || ''] || AI_MODEL_MODE.CUSTOM,
      EndPointId: ARK_V3_MODEL_ID[this.Model],
      BotId: LLM_BOT_ID[this.Model],
      MaxTokens: 1024,
      Temperature: 0.5,
      TopP: 0.3,
      SystemMessages: [this.Prompt as string],
      UserMessages:[],
      Prefill: true,
      ModelName: this.Model,
      ModelVersion: '1.0',
      WelcomeSpeech: this.WelcomeSpeech,
      ModeSourceType: this.ModeSourceType,
      APIKey: this.APIKey,
      Url: this.Url,
      Feature: JSON.stringify({ Http: true }),
    };
    if (this.Model === AI_MODEL.VISION) {
      params.VisionConfig = {
        Enable: true,
      };
    }
    return params;
  }

  get ASRConfig() {
    return {
      Provider: 'volcano',
      ProviderParams: {
        /**
         * @note 本示例代码使用的是小模型语音识别, 如感觉 ASR 效果不佳，可尝试使用大模型进行语音识别。
         *       大模型的使用详情可参考 https://www.volcengine.com/docs/6348/1404673#volcanolmasrconfig?s=g
         */
        Mode: 'smallmodel',
        AppId: this.BaseConfig.ASRAppId,
        ...(this.BaseConfig.ASRToken ? { AccessToken: this.BaseConfig.ASRToken } : {}),
        /**
         * @note 具体流式语音识别服务对应的 Cluster ID，可在流式语音服务控制台开通对应服务后查询。
         *       具体链接为: https://console.volcengine.com/speech/service/16?s=g
         */
        Cluster: 'volcengine_streaming_common',
      },
      VADConfig: {
        SilenceTime: 600,
        SilenceThreshold: 200,
      },
      VolumeGain: 0.3,
    };
  }

  get TTSConfig() {
    return {
      Provider: 'volcano',
      ProviderParams: {
        app: {
          AppId: this.BaseConfig.TTSAppId,
          ...(this.BaseConfig.TTSToken ? { Token: this.BaseConfig.TTSToken } : {}),
          Cluster: TTS_CLUSTER.TTS,
        },
        audio: {
          voice_type: this.VoiceType,
          speed_ratio: 1.0,
        },
      },
      IgnoreBracketText: [1, 2, 3, 4, 5],
      BidirectionAdditions:{
        disable_markdown_filter:false, 
      }
    };
  }

  get aigcConfig() {
    return {
      Config: {
        LLMConfig: this.LLMConfig,
        TTSConfig: this.TTSConfig,
        ASRConfig: this.ASRConfig,
        InterruptMode: this.InterruptMode ? 0 : 1,
        SubtitleConfig: {
          SubtitleMode: 0,
        },
      },
      AgentConfig: {
        UserId: this.BotName,
        WelcomeMessage: this.WelcomeSpeech,
        EnableConversationStateCallback: true,
        ServerMessageSignatureForRTS: CONVERSATION_SIGNATURE,
      },
    };
  }
}
