/**
 * 认证工具模块
 * 作者: 阿瑞
 * 功能: 提供JWT令牌生成、验证和用户信息处理等函数
 * 版本: 1.3
 */

import jwt from 'jsonwebtoken';
import { ISystemUser, WorkspaceStatus } from '@/models/system/types';

/**
 * 解码后的JWT令牌类型
 */
interface DecodedToken {
  sub: number;
  id: number;
  username: string;
  email: string;
  role_type: string;
  workspace_id: number;
  iat: number;
  exp: number;
}

/**
 * 安全的用户信息类型
 */
interface SafeUserInfo {
  id: number;
  username: string;
  email: string;
  phone: string | null;
  roleType: string;
  roleName: string | null;
  isCustomRole: boolean;
  status: number;
  lastLoginAt?: string;
  createdAt?: string;
  updatedAt?: string;
  workspace: {
    id: number;
    name: string;
    status: WorkspaceStatus;
  };
}

/**
 * JWT配置
 */
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
const JWT_EXPIRES_IN = '24h';

/**
 * 认证工具类
 */
export class AuthUtils {
  /**
   * 创建JWT令牌
   * @param user 用户对象
   * @returns JWT令牌
   */
  static async createToken(user: ISystemUser): Promise<string> {
    const payload = {
      sub: user.id,
      id: user.id,
      username: user.username,
      email: user.email,
      role_type: user.role_type,
      workspace_id: user.workspace_id
    };

    return jwt.sign(payload, JWT_SECRET, {
      expiresIn: JWT_EXPIRES_IN
    });
  }

  /**
   * 验证JWT令牌
   * @param token JWT令牌
   * @returns 解码后的令牌负载或null
   */
  static async verifyToken(token: string): Promise<DecodedToken | null> {
    try {
      // 使用as unknown先转为未知类型，再转为我们定义的类型
      return jwt.verify(token, JWT_SECRET) as unknown as DecodedToken;
    } catch {
      // 空catch块，有意忽略错误
      return null;
    }
  }

  /**
   * 清理用户信息，移除敏感字段
   * @param user 用户对象
   * @returns 清理后的用户信息
   */
  static sanitizeUser(user: ISystemUser): SafeUserInfo {
    // 移除敏感字段
    const { /* 不使用的敏感字段不需要解构 */ ...safeUser } = user;

    // 按照前端模型需要的格式转换字段
    return {
      id: safeUser.id,
      username: safeUser.username,
      email: safeUser.email,
      phone: safeUser.phone,
      roleType: safeUser.role_type,
      roleName: safeUser.role_name,
      isCustomRole: safeUser.is_custom_role,
      status: safeUser.status,
      lastLoginAt: safeUser.last_login_at ? new Date(safeUser.last_login_at).toISOString() : undefined,
      createdAt: safeUser.created_at ? new Date(safeUser.created_at).toISOString() : undefined,
      updatedAt: safeUser.updated_at ? new Date(safeUser.updated_at).toISOString() : undefined,
      workspace: {
        id: safeUser.workspace_id,
        name: '', // 稍后由调用方填充
        status: WorkspaceStatus.ACTIVE // 默认值，稍后由调用方覆盖
      }
    };
  }
} 