/**
 * Zulip核心服务接口定义
 * 
 * 功能描述：
 * - 定义Zulip核心服务的抽象接口
 * - 分离技术实现与上层调用
 * - 支持依赖注入和接口切换
 * 
 * 职责分离：
 * - 服务接口层：定义核心服务的抽象接口
 * - 数据传输层：定义请求和响应的数据结构
 * - 配置接口层：定义各类配置的接口规范
 * 
 * 最近修改：
 * - 2026-01-12: 代码规范优化 - 修正Core层注释措辞，将"业务逻辑"改为"技术实现" (修改者: moyin)
 * - 2026-01-12: 代码规范优化 - 修正注释规范和修改记录格式 (修改者: moyin)
 * - 2026-01-08: 文件夹扁平化 - 从interfaces/子文件夹移动到上级目录 (修改者: moyin)
 * - 2026-01-07: 代码规范优化 - 更新import路径和注释规范 (修改者: moyin)
 * 
 * @author moyin
 * @version 1.0.4
 * @since 2025-12-31
 * @lastModified 2026-01-12
 */

/**
 * Zulip客户端配置接口
 */
export interface ZulipClientConfig {
  username: string;
  apiKey: string;
  realm: string;
}

/**
 * Zulip客户端实例接口
 */
export interface ZulipClientInstance {
  userId: string;
  config: ZulipClientConfig;
  client: any;
  queueId?: string;
  lastEventId: number;
  createdAt: Date;
  lastActivity: Date;
  isValid: boolean;
}

/**
 * 发送消息结果接口
 */
export interface SendMessageResult {
  success: boolean;
  messageId?: number;
  error?: string;
}

/**
 * 事件队列注册结果接口
 */
export interface RegisterQueueResult {
  success: boolean;
  queueId?: string;
  lastEventId?: number;
  error?: string;
}

/**
 * 获取事件结果接口
 */
export interface GetEventsResult {
  success: boolean;
  events?: any[];
  error?: string;
}

/**
 * 客户端池统计信息接口
 */
export interface PoolStats {
  totalClients: number;
  activeClients: number;
  clientsWithQueues: number;
  clientIds: string[];
}

/**
 * Zulip客户端核心服务接口
 * 
 * 职责：
 * - 封装Zulip REST API调用
 * - 处理API Key验证和错误处理
 * - 提供消息发送、事件队列管理等核心功能
 */
export interface IZulipClientService {
  /**
   * 创建并初始化Zulip客户端
   */
  createClient(userId: string, config: ZulipClientConfig): Promise<ZulipClientInstance>;

  /**
   * 验证API Key有效性
   */
  validateApiKey(clientInstance: ZulipClientInstance): Promise<boolean>;

  /**
   * 发送消息到指定Stream/Topic
   */
  sendMessage(
    clientInstance: ZulipClientInstance,
    stream: string,
    topic: string,
    content: string,
  ): Promise<SendMessageResult>;

  /**
   * 注册事件队列
   */
  registerQueue(
    clientInstance: ZulipClientInstance,
    eventTypes?: string[],
  ): Promise<RegisterQueueResult>;

  /**
   * 注销事件队列
   */
  deregisterQueue(clientInstance: ZulipClientInstance): Promise<boolean>;

  /**
   * 获取事件队列中的事件
   */
  getEvents(
    clientInstance: ZulipClientInstance,
    dontBlock?: boolean,
  ): Promise<GetEventsResult>;

  /**
   * 销毁客户端实例
   */
  destroyClient(clientInstance: ZulipClientInstance): Promise<void>;
}

/**
 * Zulip客户端池服务接口
 * 
 * 职责：
 * - 管理用户专用的Zulip客户端实例
 * - 维护客户端连接池和生命周期
 * - 处理客户端的创建、销毁和状态管理
 */
export interface IZulipClientPoolService {
  /**
   * 为用户创建专用Zulip客户端
   */
  createUserClient(userId: string, config: ZulipClientConfig): Promise<ZulipClientInstance>;

  /**
   * 获取用户的Zulip客户端
   */
  getUserClient(userId: string): Promise<ZulipClientInstance | null>;

  /**
   * 检查用户客户端是否存在
   */
  hasUserClient(userId: string): boolean;

  /**
   * 发送消息到指定Stream/Topic
   */
  sendMessage(
    userId: string,
    stream: string,
    topic: string,
    content: string,
  ): Promise<SendMessageResult>;

  /**
   * 注册事件队列
   */
  registerEventQueue(userId: string): Promise<RegisterQueueResult>;

  /**
   * 注销事件队列
   */
  deregisterEventQueue(userId: string): Promise<boolean>;

  /**
   * 销毁用户客户端
   */
  destroyUserClient(userId: string): Promise<void>;

  /**
   * 获取客户端池统计信息
   */
  getPoolStats(): PoolStats;

  /**
   * 清理过期客户端
   */
  cleanupIdleClients(maxIdleMinutes?: number): Promise<number>;
}

/**
 * Zulip配置管理服务接口
 * 
 * 职责：
 * - 管理地图到Zulip Stream的映射配置
 * - 提供Zulip服务器连接配置
 * - 支持配置文件的热重载
 */
export interface IZulipConfigService {
  /**
   * 根据地图获取对应的Stream
   */
  getStreamByMap(mapId: string): string | null;

  /**
   * 根据Stream名称获取地图ID
   */
  getMapIdByStream(streamName: string): string | null;

  /**
   * 根据交互对象获取Topic
   */
  getTopicByObject(mapId: string, objectId: string): string | null;

  /**
   * 查找附近的交互对象
   */
  findNearbyObject(mapId: string, x: number, y: number, radius?: number): any | null;

  /**
   * 获取Zulip配置
   */
  getZulipConfig(): any;

  /**
   * 检查地图是否存在
   */
  hasMap(mapId: string): boolean;

  /**
   * 检查Stream是否存在
   */
  hasStream(streamName: string): boolean;

  /**
   * 获取所有地图ID列表
   */
  getAllMapIds(): string[];

  /**
   * 获取所有Stream名称列表
   */
  getAllStreams(): string[];

  /**
   * 热重载配置
   */
  reloadConfig(): Promise<void>;

  /**
   * 验证配置有效性
   */
  validateConfig(): Promise<{ valid: boolean; errors: string[] }>;
}

/**
 * Zulip事件处理服务接口
 * 
 * 职责：
 * - 处理从Zulip接收的事件队列消息
 * - 将Zulip消息转换为游戏协议格式
 * - 管理事件队列的生命周期
 */
export interface IZulipEventProcessorService {
  /**
   * 启动事件处理循环
   */
  startEventProcessing(): Promise<void>;

  /**
   * 停止事件处理循环
   */
  stopEventProcessing(): Promise<void>;

  /**
   * 注册事件队列
   */
  registerEventQueue(queueId: string, userId: string, lastEventId?: number): Promise<void>;

  /**
   * 注销事件队列
   */
  unregisterEventQueue(queueId: string): Promise<void>;

  /**
   * 处理Zulip消息事件
   */
  processMessageEvent(event: any, senderUserId: string): Promise<void>;

  /**
   * 设置消息分发器
   */
  setMessageDistributor(distributor: any): void;

  /**
   * 获取事件处理统计信息
   */
  getProcessingStats(): any;
}

/**
 * API Key安全服务接口
 * 
 * 职责：
 * - 提供API Key的安全存储和获取
 * - 管理API Key的生命周期
 * - 记录安全相关事件
 */
export interface IApiKeySecurityService {
  /**
   * 存储API Key
   */
  storeApiKey(
    userId: string,
    apiKey: string,
    metadata?: { ipAddress?: string; userAgent?: string }
  ): Promise<any>;

  /**
   * 获取API Key
   */
  getApiKey(
    userId: string,
    metadata?: { ipAddress?: string; userAgent?: string }
  ): Promise<any>;

  /**
   * 删除API Key
   */
  deleteApiKey(
    userId: string,
    metadata?: { ipAddress?: string; userAgent?: string }
  ): Promise<boolean>;

  /**
   * 检查API Key是否存在
   */
  hasApiKey(userId: string): Promise<boolean>;

  /**
   * 记录安全事件
   */
  logSecurityEvent(event: any): Promise<void>;

  /**
   * 获取安全事件历史
   */
  getSecurityEventHistory(userId: string, limit?: number): Promise<any[]>;

  /**
   * 获取API Key统计信息
   */
  getApiKeyStats(userId: string): Promise<any>;
}