/**
 * 当前用户装饰器
 *
 * 功能描述：
 * - 从请求上下文中提取当前认证用户信息
 * - 简化控制器中获取用户信息的操作
 * - 支持获取用户对象的特定属性
 *
 * 职责分离：
 * - 专注于用户信息提取和参数装饰
 * - 提供类型安全的用户信息访问
 * - 简化控制器方法的参数处理
 *
 * 使用示例：
 * ```typescript
 * @Get('profile')
 * @UseGuards(JwtAuthGuard)
 * getProfile(@CurrentUser() user: JwtPayload) {
 *   return { user };
 * }
 * ```
 *
 * 最近修改：
 * - 2026-01-07: 代码规范优化 - 文件夹扁平化，移除单文件文件夹结构
 * - 2026-01-07: 代码规范优化 - 文件重命名为snake_case格式，更新注释规范
 *
 * @author moyin
 * @version 1.0.2
 * @since 2025-01-05
 * @lastModified 2026-01-07
 */

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { JwtPayload } from '../../core/login_core/login_core.service';
import { AuthenticatedRequest } from './jwt_auth.guard';

/**
 * 当前用户装饰器实现
 *
 * 业务逻辑：
 * 1. 从执行上下文获取HTTP请求对象
 * 2. 提取请求中的用户信息（由JwtAuthGuard注入）
 * 3. 根据data参数返回完整用户对象或特定属性
 * 4. 提供类型安全的用户信息访问
 *
 * @param data 可选的属性名，用于获取用户对象的特定属性
 * @param ctx 执行上下文，包含HTTP请求信息
 * @returns JwtPayload | any 用户信息或用户的特定属性
 * @throws 无异常抛出，依赖JwtAuthGuard确保用户信息存在
 *
 * @example
 * ```typescript
 * // 获取完整用户对象
 * @Get('profile')
 * getProfile(@CurrentUser() user: JwtPayload) { }
 *
 * // 获取特定属性
 * @Get('username')
 * getUsername(@CurrentUser('username') username: string) { }
 * ```
 */
export const CurrentUser = createParamDecorator(
  (data: keyof JwtPayload | undefined, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest<AuthenticatedRequest>();
    const user = request.user;

    return data ? user?.[data] : user;
  },
);