/**
 * 登录业务服务
 * 
 * 功能描述：
 * - 处理登录相关的业务逻辑和流程控制
 * - 整合核心服务，提供完整的业务功能
 * - 处理业务规则、数据格式化和错误处理
 * 
 * 职责分离：
 * - 专注于业务流程和规则实现
 * - 调用核心服务完成具体功能
 * - 为控制器层提供业务接口
 * - JWT技术实现已移至Core层，符合架构分层原则
 * 
 * 最近修改：
 * - 2026-01-07: 代码规范优化 - 文件夹扁平化，移除单文件文件夹结构
 * - 2026-01-07: 架构优化 - 将JWT技术实现移至login_core模块，符合架构分层原则
 * 
 * @author moyin
 * @version 1.0.3
 * @since 2025-12-17
 * @lastModified 2026-01-07
 */

import { Injectable, Logger, Inject } from '@nestjs/common';
import { LoginCoreService, LoginRequest, RegisterRequest, GitHubOAuthRequest, PasswordResetRequest, VerificationCodeLoginRequest, TokenPair } from '../../core/login_core/login_core.service';
import { Users } from '../../core/db/users/users.entity';
import { ZulipAccountService } from '../../core/zulip_core/services/zulip_account.service';
import { ApiKeySecurityService } from '../../core/zulip_core/services/api_key_security.service';

// Import the interface types we need
interface IZulipAccountsService {
  findByGameUserId(gameUserId: string, includeGameUser?: boolean): Promise<any>;
  create(createDto: any): Promise<any>;
  deleteByGameUserId(gameUserId: string): Promise<boolean>;
}

// 常量定义
const ERROR_CODES = {
  LOGIN_FAILED: 'LOGIN_FAILED',
  REGISTER_FAILED: 'REGISTER_FAILED',
  GITHUB_OAUTH_FAILED: 'GITHUB_OAUTH_FAILED',
  SEND_CODE_FAILED: 'SEND_CODE_FAILED',
  RESET_PASSWORD_FAILED: 'RESET_PASSWORD_FAILED',
  CHANGE_PASSWORD_FAILED: 'CHANGE_PASSWORD_FAILED',
  SEND_EMAIL_VERIFICATION_FAILED: 'SEND_EMAIL_VERIFICATION_FAILED',
  EMAIL_VERIFICATION_FAILED: 'EMAIL_VERIFICATION_FAILED',
  RESEND_EMAIL_VERIFICATION_FAILED: 'RESEND_EMAIL_VERIFICATION_FAILED',
  VERIFICATION_CODE_LOGIN_FAILED: 'VERIFICATION_CODE_LOGIN_FAILED',
  SEND_LOGIN_CODE_FAILED: 'SEND_LOGIN_CODE_FAILED',
  TOKEN_REFRESH_FAILED: 'TOKEN_REFRESH_FAILED',
  DEBUG_VERIFICATION_CODE_FAILED: 'DEBUG_VERIFICATION_CODE_FAILED',
  TEST_MODE_ONLY: 'TEST_MODE_ONLY',
  INVALID_VERIFICATION_CODE: 'INVALID_VERIFICATION_CODE',
} as const;

const MESSAGES = {
  LOGIN_SUCCESS: '登录成功',
  REGISTER_SUCCESS: '注册成功',
  REGISTER_SUCCESS_WITH_ZULIP: '注册成功，Zulip账号已同步创建',
  GITHUB_LOGIN_SUCCESS: 'GitHub登录成功',
  GITHUB_BIND_SUCCESS: 'GitHub账户绑定成功',
  PASSWORD_RESET_SUCCESS: '密码重置成功',
  PASSWORD_CHANGE_SUCCESS: '密码修改成功',
  EMAIL_VERIFICATION_SUCCESS: '邮箱验证成功',
  VERIFICATION_CODE_LOGIN_SUCCESS: '验证码登录成功',
  TOKEN_REFRESH_SUCCESS: '令牌刷新成功',
  DEBUG_INFO_SUCCESS: '调试信息获取成功',
  CODE_SENT: '验证码已发送，请查收',
  EMAIL_CODE_SENT: '验证码已发送，请查收邮件',
  EMAIL_CODE_RESENT: '验证码已重新发送，请查收邮件',
  VERIFICATION_CODE_ERROR: '验证码错误',
  TEST_MODE_WARNING: '⚠️ 测试模式：验证码已生成但未真实发送。请在控制台查看验证码，或配置邮件服务以启用真实发送。',
} as const;

// JWT相关接口已移至Core层，通过import导入

/**
 * 登录响应数据接口
 */
export interface LoginResponse {
  /** 用户信息 */
  user: {
    id: string;
    username: string;
    nickname: string;
    email?: string;
    phone?: string;
    avatar_url?: string;
    role: number;
    created_at: Date;
  };
  /** 访问令牌 */
  access_token: string;
  /** 刷新令牌 */
  refresh_token: string;
  /** 访问令牌过期时间（秒） */
  expires_in: number;
  /** 令牌类型 */
  token_type: string;
  /** 是否为新用户 */
  is_new_user?: boolean;
  /** 消息 */
  message: string;
}

/**
 * 通用响应接口
 */
export interface ApiResponse<T = any> {
  /** 是否成功 */
  success: boolean;
  /** 响应数据 */
  data?: T;
  /** 消息 */
  message: string;
  /** 错误代码 */
  error_code?: string;
}

@Injectable()
export class LoginService {
  private readonly logger = new Logger(LoginService.name);

  constructor(
    private readonly loginCoreService: LoginCoreService,
    private readonly zulipAccountService: ZulipAccountService,
    @Inject('ZulipAccountsService') private readonly zulipAccountsService: IZulipAccountsService,
    private readonly apiKeySecurityService: ApiKeySecurityService,
  ) {}

  /**
   * 用户登录
   * 
   * 功能描述：
   * 处理用户登录请求，验证用户凭据并生成JWT令牌
   * 
   * 业务逻辑：
   * 1. 调用核心服务进行用户认证
   * 2. 生成JWT访问令牌和刷新令牌
   * 3. 记录登录日志和安全审计
   * 4. 返回用户信息和令牌
   * 
   * @param loginRequest 登录请求数据
   * @returns Promise<ApiResponse<LoginResponse>> 登录响应
   * 
   * @throws BadRequestException 当登录参数无效时
   * @throws UnauthorizedException 当用户凭据错误时
   * @throws InternalServerErrorException 当系统错误时
   */
  async login(loginRequest: LoginRequest): Promise<ApiResponse<LoginResponse>> {
    const startTime = Date.now();
    
    try {
      this.logger.log('用户登录尝试', {
        operation: 'login',
        identifier: loginRequest.identifier,
        timestamp: new Date().toISOString(),
      });

      // 1. 调用核心服务进行认证
      const authResult = await this.loginCoreService.login(loginRequest);

      // 2. 生成JWT令牌对（通过Core层）
      const tokenPair = await this.loginCoreService.generateTokenPair(authResult.user);

      // 3. 格式化响应数据
      const response: LoginResponse = {
        user: this.formatUserInfo(authResult.user),
        access_token: tokenPair.access_token,
        refresh_token: tokenPair.refresh_token,
        expires_in: tokenPair.expires_in,
        token_type: tokenPair.token_type,
        is_new_user: authResult.isNewUser,
        message: MESSAGES.LOGIN_SUCCESS
      };

      const duration = Date.now() - startTime;

      this.logger.log('用户登录成功', {
        operation: 'login',
        userId: authResult.user.id.toString(),
        username: authResult.user.username,
        isNewUser: authResult.isNewUser,
        duration,
        timestamp: new Date().toISOString(),
      });

      return {
        success: true,
        data: response,
        message: MESSAGES.LOGIN_SUCCESS
      };
    } catch (error) {
      const duration = Date.now() - startTime;
      const err = error as Error;
      
      this.logger.error('用户登录失败', {
        operation: 'login',
        identifier: loginRequest.identifier,
        error: err.message,
        duration,
        timestamp: new Date().toISOString(),
      }, err.stack);
      
      return {
        success: false,
        message: err.message || '登录失败',
        error_code: ERROR_CODES.LOGIN_FAILED
      };
    }
  }

  /**
   * 用户注册
   * 
   * @param registerRequest 注册请求
   * @returns 注册响应
   */
  async register(registerRequest: RegisterRequest): Promise<ApiResponse<LoginResponse>> {
    const startTime = Date.now();
    const operationId = `register_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
    
    try {
      this.logger.log(`[${operationId}] 步骤1: 开始用户注册流程`, {
        operation: 'register',
        operationId,
        username: registerRequest.username,
        email: registerRequest.email,
        hasPassword: !!registerRequest.password,
        timestamp: new Date().toISOString(),
      });

      // 1. 初始化Zulip管理员客户端
      this.logger.log(`[${operationId}] 步骤2: 开始初始化Zulip管理员客户端`, {
        operation: 'register',
        operationId,
        step: 'initializeZulipAdminClient',
      });
      
      await this.initializeZulipAdminClient();
      
      this.logger.log(`[${operationId}] 步骤2: Zulip管理员客户端初始化成功`, {
        operation: 'register',
        operationId,
        step: 'initializeZulipAdminClient',
        result: 'success',
      });

      // 2. 调用核心服务进行注册
      this.logger.log(`[${operationId}] 步骤3: 开始创建游戏用户账号`, {
        operation: 'register',
        operationId,
        step: 'createGameUser',
        username: registerRequest.username,
      });
      
      const authResult = await this.loginCoreService.register(registerRequest);
      
      this.logger.log(`[${operationId}] 步骤3: 游戏用户账号创建成功`, {
        operation: 'register',
        operationId,
        step: 'createGameUser',
        result: 'success',
        gameUserId: authResult.user.id.toString(),
        username: authResult.user.username,
        email: authResult.user.email,
      });

      // 3. 创建Zulip账号（使用相同的邮箱和密码）
      let zulipAccountCreated = false;
      
      if (registerRequest.email && registerRequest.password) {
        this.logger.log(`[${operationId}] 步骤4: 开始创建/绑定Zulip账号`, {
          operation: 'register',
          operationId,
          step: 'createZulipAccount',
          gameUserId: authResult.user.id.toString(),
          email: registerRequest.email,
        });
      } else {
        this.logger.warn(`[${operationId}] 步骤4: 跳过Zulip账号创建（缺少邮箱或密码）`, {
          operation: 'register',
          operationId,
          step: 'createZulipAccount',
          result: 'skipped',
          username: registerRequest.username,
          gameUserId: authResult.user.id.toString(),
          hasEmail: !!registerRequest.email,
          hasPassword: !!registerRequest.password,
        });
      }
      
      try {
        if (registerRequest.email && registerRequest.password) {
          await this.createZulipAccountForUser(authResult.user, registerRequest.password);
          zulipAccountCreated = true;
          
          this.logger.log(`[${operationId}] 步骤4: Zulip账号创建成功`, {
            operation: 'register',
            operationId,
            step: 'createZulipAccount',
            result: 'success',
            gameUserId: authResult.user.id.toString(),
            email: registerRequest.email,
          });
        } else {
          this.logger.warn(`跳过Zulip账号创建：缺少邮箱或密码`, {
            operation: 'register',
            username: registerRequest.username,
            hasEmail: !!registerRequest.email,
            hasPassword: !!registerRequest.password,
          });
        }
      } catch (zulipError) {
        const err = zulipError as Error;
        this.logger.error(`[${operationId}] 步骤4: Zulip账号创建失败，开始回滚`, {
          operation: 'register',
          operationId,
          step: 'createZulipAccount',
          result: 'failed',
          username: registerRequest.username,
          gameUserId: authResult.user.id.toString(),
          zulipError: err.message,
        }, err.stack);

        // 回滚游戏用户注册
        this.logger.log(`[${operationId}] 步骤4.1: 开始回滚游戏用户注册`, {
          operation: 'register',
          operationId,
          step: 'rollbackGameUser',
          gameUserId: authResult.user.id.toString(),
        });
        
        try {
          await this.loginCoreService.deleteUser(authResult.user.id);
          this.logger.log(`[${operationId}] 步骤4.1: 游戏用户注册回滚成功`, {
            operation: 'register',
            operationId,
            step: 'rollbackGameUser',
            result: 'success',
            username: registerRequest.username,
            gameUserId: authResult.user.id.toString(),
          });
        } catch (rollbackError) {
          const rollbackErr = rollbackError as Error;
          this.logger.error(`[${operationId}] 步骤4.1: 游戏用户注册回滚失败`, {
            operation: 'register',
            operationId,
            step: 'rollbackGameUser',
            result: 'failed',
            username: registerRequest.username,
            gameUserId: authResult.user.id.toString(),
            rollbackError: rollbackErr.message,
          }, rollbackErr.stack);
        }

        // 抛出原始错误
        throw new Error(`注册失败：Zulip账号创建失败 - ${err.message}`);
      }

      // 4. 生成JWT令牌对（通过Core层）
      this.logger.log(`[${operationId}] 步骤5: 开始生成JWT令牌`, {
        operation: 'register',
        operationId,
        step: 'generateTokens',
        gameUserId: authResult.user.id.toString(),
      });
      
      const tokenPair = await this.loginCoreService.generateTokenPair(authResult.user);
      
      this.logger.log(`[${operationId}] 步骤5: JWT令牌生成成功`, {
        operation: 'register',
        operationId,
        step: 'generateTokens',
        result: 'success',
        gameUserId: authResult.user.id.toString(),
        tokenType: tokenPair.token_type,
        expiresIn: tokenPair.expires_in,
      });

      // 5. 格式化响应数据
      this.logger.log(`[${operationId}] 步骤6: 格式化响应数据`, {
        operation: 'register',
        operationId,
        step: 'formatResponse',
        gameUserId: authResult.user.id.toString(),
        zulipAccountCreated,
      });
      
      const response: LoginResponse = {
        user: this.formatUserInfo(authResult.user),
        access_token: tokenPair.access_token,
        refresh_token: tokenPair.refresh_token,
        expires_in: tokenPair.expires_in,
        token_type: tokenPair.token_type,
        is_new_user: true,
        message: zulipAccountCreated ? MESSAGES.REGISTER_SUCCESS_WITH_ZULIP : MESSAGES.REGISTER_SUCCESS
      };

      const duration = Date.now() - startTime;
      
      this.logger.log(`[${operationId}] 注册流程完成: 用户注册成功`, {
        operation: 'register',
        operationId,
        result: 'success',
        gameUserId: authResult.user.id.toString(),
        username: authResult.user.username,
        email: authResult.user.email,
        zulipAccountCreated,
        duration,
        timestamp: new Date().toISOString(),
      });

      return {
        success: true,
        data: response,
        message: response.message
      };
    } catch (error) {
      const duration = Date.now() - startTime;
      const err = error as Error;
      
      this.logger.error(`[${operationId}] 注册流程失败: 用户注册失败`, {
        operation: 'register',
        operationId,
        result: 'failed',
        username: registerRequest.username,
        email: registerRequest.email,
        error: err.message,
        duration,
        timestamp: new Date().toISOString(),
      }, err.stack);
      
      return {
        success: false,
        message: err.message || '注册失败',
        error_code: ERROR_CODES.REGISTER_FAILED
      };
    }
  }

  /**
   * GitHub OAuth登录
   * 
   * @param oauthRequest OAuth请求
   * @returns 登录响应
   */
  async githubOAuth(oauthRequest: GitHubOAuthRequest): Promise<ApiResponse<LoginResponse>> {
    try {
      this.logger.log(`GitHub OAuth登录尝试: ${oauthRequest.github_id}`);

      // 调用核心服务进行OAuth认证
      const authResult = await this.loginCoreService.githubOAuth(oauthRequest);

      // 生成JWT令牌对（通过Core层）
      const tokenPair = await this.loginCoreService.generateTokenPair(authResult.user);

      // 格式化响应数据
      const response: LoginResponse = {
        user: this.formatUserInfo(authResult.user),
        access_token: tokenPair.access_token,
        refresh_token: tokenPair.refresh_token,
        expires_in: tokenPair.expires_in,
        token_type: tokenPair.token_type,
        is_new_user: authResult.isNewUser,
        message: authResult.isNewUser ? MESSAGES.GITHUB_BIND_SUCCESS : MESSAGES.GITHUB_LOGIN_SUCCESS
      };

      this.logger.log(`GitHub OAuth成功: ${authResult.user.username} (ID: ${authResult.user.id})`);

      return {
        success: true,
        data: response,
        message: response.message
      };
    } catch (error) {
      this.logger.error(`GitHub OAuth失败: ${oauthRequest.github_id}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : 'GitHub登录失败',
        error_code: ERROR_CODES.GITHUB_OAUTH_FAILED
      };
    }
  }

  /**
   * 发送密码重置验证码
   * 
   * @param identifier 邮箱或手机号
   * @returns 响应结果
   */
  async sendPasswordResetCode(identifier: string): Promise<ApiResponse<{ verification_code?: string; is_test_mode?: boolean }>> {
    try {
      this.logger.log(`发送密码重置验证码: ${identifier}`);

      // 调用核心服务发送验证码
      const result = await this.loginCoreService.sendPasswordResetCode(identifier);

      this.logger.log(`密码重置验证码已发送: ${identifier}`);

      return this.handleTestModeResponse(result, MESSAGES.CODE_SENT);
    } catch (error) {
      this.logger.error(`发送密码重置验证码失败: ${identifier}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '发送验证码失败',
        error_code: ERROR_CODES.SEND_CODE_FAILED
      };
    }
  }

  /**
   * 重置密码
   * 
   * @param resetRequest 重置请求
   * @returns 响应结果
   */
  async resetPassword(resetRequest: PasswordResetRequest): Promise<ApiResponse> {
    try {
      this.logger.log(`密码重置尝试: ${resetRequest.identifier}`);

      // 调用核心服务重置密码
      await this.loginCoreService.resetPassword(resetRequest);

      this.logger.log(`密码重置成功: ${resetRequest.identifier}`);

      return {
        success: true,
        message: MESSAGES.PASSWORD_RESET_SUCCESS
      };
    } catch (error) {
      this.logger.error(`密码重置失败: ${resetRequest.identifier}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '密码重置失败',
        error_code: ERROR_CODES.RESET_PASSWORD_FAILED
      };
    }
  }

  /**
   * 修改密码
   * 
   * @param userId 用户ID
   * @param oldPassword 旧密码
   * @param newPassword 新密码
   * @returns 响应结果
   */
  async changePassword(userId: bigint, oldPassword: string, newPassword: string): Promise<ApiResponse> {
    try {
      this.logger.log(`修改密码尝试: 用户ID ${userId}`);

      // 调用核心服务修改密码
      await this.loginCoreService.changePassword(userId, oldPassword, newPassword);

      this.logger.log(`修改密码成功: 用户ID ${userId}`);

      return {
        success: true,
        message: MESSAGES.PASSWORD_CHANGE_SUCCESS
      };
    } catch (error) {
      this.logger.error(`修改密码失败: 用户ID ${userId}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '密码修改失败',
        error_code: ERROR_CODES.CHANGE_PASSWORD_FAILED
      };
    }
  }

  /**
   * 发送邮箱验证码
   * 
   * @param email 邮箱地址
   * @returns 响应结果
   */
  async sendEmailVerification(email: string): Promise<ApiResponse<{ verification_code?: string; is_test_mode?: boolean }>> {
    try {
      this.logger.log(`发送邮箱验证码: ${email}`);

      // 调用核心服务发送验证码
      const result = await this.loginCoreService.sendEmailVerification(email);

      this.logger.log(`邮箱验证码已发送: ${email}`);

      return this.handleTestModeResponse(result, MESSAGES.CODE_SENT, MESSAGES.EMAIL_CODE_SENT);
    } catch (error) {
      this.logger.error(`发送邮箱验证码失败: ${email}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '发送验证码失败',
        error_code: ERROR_CODES.SEND_EMAIL_VERIFICATION_FAILED
      };
    }
  }

  /**
   * 验证邮箱验证码
   * 
   * @param email 邮箱地址
   * @param code 验证码
   * @returns 响应结果
   */
  async verifyEmailCode(email: string, code: string): Promise<ApiResponse> {
    try {
      this.logger.log(`验证邮箱验证码: ${email}`);

      // 调用核心服务验证验证码
      const isValid = await this.loginCoreService.verifyEmailCode(email, code);

      if (isValid) {
        this.logger.log(`邮箱验证成功: ${email}`);
        return {
          success: true,
          message: MESSAGES.EMAIL_VERIFICATION_SUCCESS
        };
      } else {
        return {
          success: false,
          message: MESSAGES.VERIFICATION_CODE_ERROR,
          error_code: ERROR_CODES.INVALID_VERIFICATION_CODE
        };
      }
    } catch (error) {
      this.logger.error(`邮箱验证失败: ${email}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '邮箱验证失败',
        error_code: ERROR_CODES.EMAIL_VERIFICATION_FAILED
      };
    }
  }

  /**
   * 重新发送邮箱验证码
   * 
   * @param email 邮箱地址
   * @returns 响应结果
   */
  async resendEmailVerification(email: string): Promise<ApiResponse<{ verification_code?: string; is_test_mode?: boolean }>> {
    try {
      this.logger.log(`重新发送邮箱验证码: ${email}`);

      // 调用核心服务重新发送验证码
      const result = await this.loginCoreService.resendEmailVerification(email);

      this.logger.log(`邮箱验证码已重新发送: ${email}`);

      return this.handleTestModeResponse(result, MESSAGES.CODE_SENT, MESSAGES.EMAIL_CODE_RESENT);
    } catch (error) {
      this.logger.error(`重新发送邮箱验证码失败: ${email}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '重新发送验证码失败',
        error_code: ERROR_CODES.RESEND_EMAIL_VERIFICATION_FAILED
      };
    }
  }

  /**
   * 格式化用户信息
   * 
   * @param user 用户实体
   * @returns 格式化的用户信息
   */
  private formatUserInfo(user: Users) {
    return {
      id: user.id.toString(), // 将bigint转换为字符串
      username: user.username,
      nickname: user.nickname,
      email: user.email,
      phone: user.phone,
      avatar_url: user.avatar_url,
      role: user.role,
      created_at: user.created_at
    };
  }

  /**
   * 处理测试模式响应
   * 
   * @param result 核心服务返回的结果
   * @param successMessage 成功时的消息
   * @param emailMessage 邮件发送成功时的消息
   * @returns 格式化的响应
   * @private
   */
  private handleTestModeResponse(
    result: { code: string; isTestMode: boolean },
    successMessage: string,
    emailMessage?: string
  ): ApiResponse<{ verification_code?: string; is_test_mode?: boolean }> {
    if (result.isTestMode) {
      return {
        success: false,
        data: { 
          verification_code: result.code,
          is_test_mode: true
        },
        message: MESSAGES.TEST_MODE_WARNING,
        error_code: ERROR_CODES.TEST_MODE_ONLY
      };
    } else {
      return {
        success: true,
        data: { 
          is_test_mode: false
        },
        message: emailMessage || successMessage
      };
    }
  }

  /**
   * 验证码登录
   * 
   * @param loginRequest 验证码登录请求
   * @returns 登录响应
   */
  async verificationCodeLogin(loginRequest: VerificationCodeLoginRequest): Promise<ApiResponse<LoginResponse>> {
    try {
      this.logger.log(`验证码登录尝试: ${loginRequest.identifier}`);

      // 调用核心服务进行验证码认证
      const authResult = await this.loginCoreService.verificationCodeLogin(loginRequest);

      // 生成JWT令牌对（通过Core层）
      const tokenPair = await this.loginCoreService.generateTokenPair(authResult.user);

      // 格式化响应数据
      const response: LoginResponse = {
        user: this.formatUserInfo(authResult.user),
        access_token: tokenPair.access_token,
        refresh_token: tokenPair.refresh_token,
        expires_in: tokenPair.expires_in,
        token_type: tokenPair.token_type,
        is_new_user: authResult.isNewUser,
        message: MESSAGES.VERIFICATION_CODE_LOGIN_SUCCESS
      };

      this.logger.log(`验证码登录成功: ${authResult.user.username} (ID: ${authResult.user.id})`);

      return {
        success: true,
        data: response,
        message: MESSAGES.VERIFICATION_CODE_LOGIN_SUCCESS
      };
    } catch (error) {
      this.logger.error(`验证码登录失败: ${loginRequest.identifier}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '验证码登录失败',
        error_code: ERROR_CODES.VERIFICATION_CODE_LOGIN_FAILED
      };
    }
  }

  /**
   * 发送登录验证码
   * 
   * @param identifier 邮箱或手机号
   * @returns 响应结果
   */
  async sendLoginVerificationCode(identifier: string): Promise<ApiResponse<{ verification_code?: string; is_test_mode?: boolean }>> {
    try {
      this.logger.log(`发送登录验证码: ${identifier}`);

      // 调用核心服务发送验证码
      const result = await this.loginCoreService.sendLoginVerificationCode(identifier);

      this.logger.log(`登录验证码已发送: ${identifier}`);

      return this.handleTestModeResponse(result, MESSAGES.CODE_SENT);
    } catch (error) {
      this.logger.error(`发送登录验证码失败: ${identifier}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '发送验证码失败',
        error_code: ERROR_CODES.SEND_LOGIN_CODE_FAILED
      };
    }
  }

  /**
   * 刷新访问令牌
   * 
   * 功能描述：
   * 使用有效的刷新令牌生成新的访问令牌，实现无感知的令牌续期
   * 
   * 业务逻辑：
   * 1. 验证刷新令牌的有效性和格式
   * 2. 检查用户状态是否正常
   * 3. 生成新的JWT令牌对
   * 4. 返回新的访问令牌和刷新令牌
   * 
   * @param refreshToken 刷新令牌字符串
   * @returns Promise<ApiResponse<TokenPair>> 新的令牌对
   * 
   * @throws UnauthorizedException 当刷新令牌无效或已过期时
   * @throws NotFoundException 当用户不存在或已被禁用时
   * 
   * @example
   * ```typescript
   * const result = await loginService.refreshAccessToken('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
   * ```
   */
  async refreshAccessToken(refreshToken: string): Promise<ApiResponse<TokenPair>> {
    try {
      this.logger.log(`刷新访问令牌尝试`);

      // 调用核心服务刷新令牌
      const tokenPair = await this.loginCoreService.refreshAccessToken(refreshToken);

      this.logger.log(`访问令牌刷新成功`);

      return {
        success: true,
        data: tokenPair,
        message: MESSAGES.TOKEN_REFRESH_SUCCESS
      };
    } catch (error) {
      this.logger.error(`访问令牌刷新失败`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '令牌刷新失败',
        error_code: ERROR_CODES.TOKEN_REFRESH_FAILED
      };
    }
  }
  async debugVerificationCode(email: string): Promise<any> {
    try {
      this.logger.log(`调试验证码信息: ${email}`);

      const debugInfo = await this.loginCoreService.debugVerificationCode(email);

      return {
        success: true,
        data: debugInfo,
        message: MESSAGES.DEBUG_INFO_SUCCESS
      };
    } catch (error) {
      this.logger.error(`获取验证码调试信息失败: ${email}`, error instanceof Error ? error.stack : String(error));
      
      return {
        success: false,
        message: error instanceof Error ? error.message : '获取调试信息失败',
        error_code: ERROR_CODES.DEBUG_VERIFICATION_CODE_FAILED
      };
    }
  }

  /**
   * 初始化Zulip管理员客户端
   * 
   * 功能描述：
   * 使用环境变量中的管理员凭证初始化Zulip客户端
   * 
   * 业务逻辑：
   * 1. 从环境变量获取管理员配置
   * 2. 验证配置完整性
   * 3. 初始化ZulipAccountService的管理员客户端
   * 
   * @throws Error 当配置缺失或初始化失败时
   * @private
   */
  private async initializeZulipAdminClient(): Promise<void> {
    try {
      // 从环境变量获取管理员配置
      const adminConfig = {
        realm: process.env.ZULIP_SERVER_URL || '',
        username: process.env.ZULIP_BOT_EMAIL || '',
        apiKey: process.env.ZULIP_BOT_API_KEY || '',
      };

      // 验证配置完整性
      if (!adminConfig.realm || !adminConfig.username || !adminConfig.apiKey) {
        throw new Error('Zulip管理员配置不完整，请检查环境变量 ZULIP_SERVER_URL, ZULIP_BOT_EMAIL, ZULIP_BOT_API_KEY');
      }

      // 初始化管理员客户端
      const initialized = await this.zulipAccountService.initializeAdminClient(adminConfig);
      
      if (!initialized) {
        throw new Error('Zulip管理员客户端初始化失败');
      }

      this.logger.log('Zulip管理员客户端初始化成功', {
        operation: 'initializeZulipAdminClient',
        realm: adminConfig.realm,
        adminEmail: adminConfig.username,
      });

    } catch (error) {
      const err = error as Error;
      this.logger.error('Zulip管理员客户端初始化失败', {
        operation: 'initializeZulipAdminClient',
        error: err.message,
      }, err.stack);
      throw error;
    }
  }

  /**
   * 为用户创建Zulip账号
   * 
   * 功能描述：
   * 为新注册的游戏用户创建对应的Zulip账号并建立关联
   * 
   * 业务逻辑：
   * 1. 使用相同的邮箱和密码创建Zulip账号
   * 2. 加密存储API Key
   * 3. 在数据库中建立关联关系
   * 4. 处理创建失败的情况
   * 
   * @param gameUser 游戏用户信息
   * @param password 用户密码（明文）
   * @throws Error 当Zulip账号创建失败时
   * @private
   */
  private async createZulipAccountForUser(gameUser: Users, password: string): Promise<void> {
    const startTime = Date.now();
    
    this.logger.log('开始为用户创建Zulip账号', {
      operation: 'createZulipAccountForUser',
      gameUserId: gameUser.id.toString(),
      email: gameUser.email,
      nickname: gameUser.nickname,
    });

    try {
      // 1. 检查是否已存在Zulip账号关联
      const existingAccount = await this.zulipAccountsService.findByGameUserId(gameUser.id.toString());
      if (existingAccount) {
        this.logger.warn('用户已存在Zulip账号关联，跳过创建', {
          operation: 'createZulipAccountForUser',
          gameUserId: gameUser.id.toString(),
          existingZulipUserId: existingAccount.zulipUserId,
        });
        return;
      }

      // 2. 创建Zulip账号
      const createResult = await this.zulipAccountService.createZulipAccount({
        email: gameUser.email,
        fullName: gameUser.nickname,
        password: password,
      });

      if (!createResult.success) {
        throw new Error(createResult.error || 'Zulip账号创建失败');
      }

      // 3. 存储API Key
      if (createResult.apiKey) {
        await this.apiKeySecurityService.storeApiKey(
          gameUser.id.toString(),
          createResult.apiKey
        );
      }

      // 4. 在数据库中创建关联记录
      await this.zulipAccountsService.create({
        gameUserId: gameUser.id.toString(),
        zulipUserId: createResult.userId!,
        zulipEmail: createResult.email!,
        zulipFullName: gameUser.nickname,
        zulipApiKeyEncrypted: createResult.apiKey ? 'stored_in_redis' : '', // 标记API Key已存储在Redis中
        status: 'active',
      });

      // 5. 建立游戏账号与Zulip账号的内存关联（用于当前会话）
      if (createResult.apiKey) {
        await this.zulipAccountService.linkGameAccount(
          gameUser.id.toString(),
          createResult.userId!,
          createResult.email!,
          createResult.apiKey
        );
      }

      const duration = Date.now() - startTime;
      
      this.logger.log('Zulip账号创建和关联成功', {
        operation: 'createZulipAccountForUser',
        gameUserId: gameUser.id.toString(),
        zulipUserId: createResult.userId,
        zulipEmail: createResult.email,
        hasApiKey: !!createResult.apiKey,
        duration,
      });

    } catch (error) {
      const err = error as Error;
      const duration = Date.now() - startTime;
      
      this.logger.error('为用户创建Zulip账号失败', {
        operation: 'createZulipAccountForUser',
        gameUserId: gameUser.id.toString(),
        email: gameUser.email,
        error: err.message,
        duration,
      }, err.stack);

      // 清理可能创建的部分数据
      try {
        await this.zulipAccountsService.deleteByGameUserId(gameUser.id.toString());
      } catch (cleanupError) {
        this.logger.warn('清理Zulip账号关联数据失败', {
          operation: 'createZulipAccountForUser',
          gameUserId: gameUser.id.toString(),
          cleanupError: (cleanupError as Error).message,
        });
      }

      throw error;
    }
  }
}