import { createParamDecorator, ExecutionContext } from '@nestjs/common';

/**
 * 현재 로그인한 사용자 정보를 가져오는 Decorator
 *
 * @description
 * 인증 미들웨어(JWT, Passport 등)가 req.user에 추가한 사용자 정보를 추출합니다.
 * 인증되지 않은 경우 기본값을 반환합니다.
 *
 * @example
 * // 전체 user 객체 가져오기
 * async method(@CurrentUser() user: any) {
 *   console.log(user.userId, user.email);
 * }
 *
 * @example
 * // 특정 속성만 가져오기
 * async method(@CurrentUser('userId') userId: string) {
 *   console.log(userId);  // 'user123' or 'system'
 * }
 */
export const CurrentUser = createParamDecorator(
  (data: string | undefined, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const user = request.user;

    // 사용자 정보가 없으면 기본값 반환
    if (!user) {
      // userId를 요청한 경우 'system' 반환
      if (data === 'userId') {
        return 'system';
      }
      // 전체 user 객체를 요청한 경우 null 반환
      return null;
    }

    // 특정 속성을 요청한 경우 해당 속성 반환
    // 전체 user 객체를 요청한 경우 user 반환
    return data ? user[data] : user;
  },
);
