/**
 * 同步状态管理类型定义
 * 
 * 提供连接状态相关的类型、接口和枚举
 * 用于统一管理 SSE 连接状态
 */

/**
 * 连接状态枚举
 * 表示连接生命周期的各个阶段
 */
export enum ConnectionState {
  /** 初始状态，未开始连接 */
  IDLE = 'IDLE',
  /** 正在建立连接 */
  CONNECTING = 'CONNECTING',
  /** 连接已建立 */
  CONNECTED = 'CONNECTED',
  /** 连接断开，正在重连 */
  RECONNECTING = 'RECONNECTING',
  /** 连接已断开 */
  DISCONNECTED = 'DISCONNECTED',
  /** 发生连接错误 */
  ERROR = 'ERROR',
}

/**
 * 连接状态信息
 * 包含完整的状态信息
 */
export interface ConnectionStateInfo {
  /** 当前连接状态 */
  state: ConnectionState;
  /** 状态变更时间戳 */
  timestamp: number;
  /** 错误信息（仅在 ERROR 状态下有效） */
  error?: Error;
  /** 当前重连次数（仅在 RECONNECTING 状态下有效） */
  reconnectAttempts?: number;
  /** 上次成功连接时间 */
  lastConnectedAt?: number | null;
  /** 状态描述（供显示用） */
  description: string;
}

/**
 * 连接状态监听器类型
 */
export type ConnectionStateListener = (
  state: ConnectionStateInfo,
  previousState: ConnectionStateInfo | null
) => void;

/**
 * 重连配置接口
 */
export interface ReconnectConfig {
  /** 最大重连次数 */
  maxReconnectAttempts: number;
  /** 初始重连延迟（毫秒） */
  initialDelay: number;
  /** 最大重连延迟（毫秒） */
  maxDelay: number;
  /** 延迟倍数（指数退避） */
  backoffMultiplier: number;
}

/**
 * 状态转换规则
 * 定义哪些状态可以转换到哪些状态
 */
export type StateTransitions = {
  [key in ConnectionState]?: ConnectionState[];
};

/**
 * 默认状态转换规则
 */
export const DEFAULT_STATE_TRANSITIONS: StateTransitions = {
  [ConnectionState.IDLE]: [ConnectionState.CONNECTING],
  [ConnectionState.CONNECTING]: [
    ConnectionState.CONNECTED,
    ConnectionState.ERROR,
    ConnectionState.DISCONNECTED,
  ],
  [ConnectionState.CONNECTED]: [
    ConnectionState.DISCONNECTED,
    ConnectionState.ERROR,
    ConnectionState.RECONNECTING,
  ],
  [ConnectionState.RECONNECTING]: [
    ConnectionState.CONNECTED,
    ConnectionState.ERROR,
    ConnectionState.DISCONNECTED,
  ],
  [ConnectionState.DISCONNECTED]: [
    ConnectionState.CONNECTING,
    ConnectionState.RECONNECTING,
  ],
  [ConnectionState.ERROR]: [
    ConnectionState.CONNECTING,
    ConnectionState.RECONNECTING,
    ConnectionState.DISCONNECTED,
  ],
};

/**
 * 默认重连配置
 */
export const DEFAULT_RECONNECT_CONFIG: ReconnectConfig = {
  maxReconnectAttempts: 20,
  initialDelay: 1000,
  maxDelay: 30000,
  backoffMultiplier: 2,
};

/**
 * 获取状态的中文描述
 * @param state 连接状态
 * @param reconnectAttempts 当前重连次数
 * @param maxReconnectAttempts 最大重连次数
 * @returns 状态描述字符串
 */
export function getStateDescription(
  state: ConnectionState,
  reconnectAttempts?: number,
  maxReconnectAttempts?: number
): string {
  switch (state) {
    case ConnectionState.IDLE:
      return '未连接';
    case ConnectionState.CONNECTING:
      return '正在连接...';
    case ConnectionState.CONNECTED:
      return '已连接';
    case ConnectionState.RECONNECTING:
      return reconnectAttempts !== undefined && maxReconnectAttempts !== undefined
        ? `正在重连 (${reconnectAttempts}/${maxReconnectAttempts})`
        : '正在重连...';
    case ConnectionState.DISCONNECTED:
      return '已断开连接';
    case ConnectionState.ERROR:
      return '连接错误';
    default:
      return '未知状态';
  }
}
