/**
 * Gateway 服务相关类型定义
 */

import { Message, TTSParams, ChatFile } from './api';

/**
 * Gateway 配置
 */
export type IOSAudioMode = 'baseline' | 'aec' | 'aec_full';

export interface GatewayConfig {
  /** Gateway WebSocket 地址 */
  url: string;
  /** 授权 Token */
  token: string;
  /** 麦克风采集档位：standard 保守，asr_priority 更偏 ASR 识别 */
  audioProfile?: 'standard' | 'asr_priority';
  /** iOS 音频实验模式：baseline 保持现状，aec/aec_full 用于验证浏览器 AEC */
  iosAudioMode?: IOSAudioMode;
  /** 自动重连 */
  autoReconnect?: boolean;
  /** 重连间隔（毫秒） */
  reconnectInterval?: number;
  /** 最大重连次数 */
  maxReconnectAttempts?: number;
  /** 心跳间隔（毫秒） */
  heartbeatInterval?: number;
}

/**
 * Gateway 消息类型
 */
export type GatewayMessageType = 'chat' | 'tts' | 'asr' | 'heartbeat' | 'error';

/**
 * Gateway 请求基类
 */
export interface GatewayRequestBase {
  /** 消息类型 */
  type: GatewayMessageType;
  /** 请求 ID */
  requestId: string;
  /** 时间戳 */
  timestamp?: number;
}

/**
 * Gateway 响应基类
 */
export interface GatewayResponseBase {
  /** 消息类型 */
  type: GatewayMessageType;
  /** 事件名称 */
  event: string;
  /** 请求 ID */
  requestId?: string;
  /** 时间戳 */
  timestamp?: number;
}

/**
 * LLM 对话请求数据
 */
export interface ChatRequestData {
  /** 消息列表 */
  message: Message[];
  /** 会话 ID */
  conversationId?: string;
  /** 模型 */
  model?: string;
  /** 文件列表 */
  files?: ChatFile[];
  /** 输入参数 */
  inputs?: Record<string, any>;
  /** 是否流式 */
  stream?: boolean;
}

/**
 * LLM 对话请求
 */
export interface ChatRequest extends GatewayRequestBase {
  type: 'chat';
  data: ChatRequestData;
}

/**
 * LLM 对话响应数据
 */
export interface ChatResponseData {
  /** 事件类型 */
  event: 'message' | 'message_end' | 'error';
  /** 会话 ID */
  conversationId: string;
  /** 消息 ID */
  messageId: string;
  /** 回答内容 */
  answer: string;
  /** 错误消息 */
  errorMessage?: string;
}

/**
 * LLM 对话响应
 */
export interface ChatResponse extends GatewayResponseBase {
  type: 'chat';
  data: ChatResponseData;
}

/**
 * TTS 请求数据
 */
export interface TTSRequestData extends TTSParams {
  /** 文本内容 */
  content: string;
}

/**
 * TTS 请求
 */
export interface TTSRequest extends GatewayRequestBase {
  type: 'tts';
  data: TTSRequestData;
}

/**
 * TTS 响应数据
 */
export interface TTSResponseData {
  /** 事件类型 */
  event: 'audio' | 'audio_end' | 'error';
  /** 音频数据（Base64 或 ArrayBuffer） */
  audio?: ArrayBuffer | string;
  /** BlendShapes 数据 */
  blendShapes?: number[][];
  /** 音频时长（秒） */
  duration?: number;
  /** 采样率 */
  sampleRate?: number;
  /** 错误消息 */
  errorMessage?: string;
}

/**
 * TTS 响应
 */
export interface TTSResponse extends GatewayResponseBase {
  type: 'tts';
  data: TTSResponseData;
}

/**
 * ASR 请求数据
 */
export interface ASRRequestData {
  /** 音频数据 */
  audio: ArrayBuffer;
  /** 采样率 */
  sampleRate: number;
  /** 语言 */
  language?: string;
  /** 是否为最后一帧 */
  isLast?: boolean;
}

/**
 * ASR 请求
 */
export interface ASRRequest extends GatewayRequestBase {
  type: 'asr';
  data: ASRRequestData;
}

/**
 * ASR 响应数据
 */
export interface ASRResponseData {
  /** 事件类型 */
  event: 'text' | 'text_end' | 'error';
  /** 识别文本 */
  text: string;
  /** 是否为最终结果 */
  isFinal: boolean;
  /** 置信度 */
  confidence?: number;
  /** 错误消息 */
  errorMessage?: string;
}

/**
 * ASR 响应
 */
export interface ASRResponse extends GatewayResponseBase {
  type: 'asr';
  data: ASRResponseData;
}

/**
 * 心跳请求
 */
export interface HeartbeatRequest extends GatewayRequestBase {
  type: 'heartbeat';
  data: {
    ping: string;
  };
}

/**
 * 心跳响应
 */
export interface HeartbeatResponse extends GatewayResponseBase {
  type: 'heartbeat';
  data: {
    pong: string;
  };
}

/**
 * 错误响应
 */
export interface ErrorResponse extends GatewayResponseBase {
  type: 'error';
  data: {
    code: string | number;
    message: string;
    details?: any;
  };
}

/**
 * Gateway 请求联合类型
 */
export type GatewayRequest =
  | ChatRequest
  | TTSRequest
  | ASRRequest
  | HeartbeatRequest;

/**
 * Gateway 响应联合类型
 */
export type GatewayResponse =
  | ChatResponse
  | TTSResponse
  | ASRResponse
  | HeartbeatResponse
  | ErrorResponse;

/**
 * WebSocket 连接状态
 */
export enum WebSocketState {
  CONNECTING = 0,
  OPEN = 1,
  CLOSING = 2,
  CLOSED = 3,
}

/**
 * Gateway 服务状态
 */
export enum GatewayState {
  /** 未连接 */
  DISCONNECTED = 'disconnected',
  /** 连接中 */
  CONNECTING = 'connecting',
  /** 已连接 */
  CONNECTED = 'connected',
  /** 重连中 */
  RECONNECTING = 'reconnecting',
  /** 已关闭 */
  CLOSED = 'closed',
}
