import { type ExecutionContext, HttpException, Injectable, Logger } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { UnauthorizedException } from '@modules/shared';

@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {
  private readonly logger = new Logger(LocalAuthGuard.name);

  override handleRequest<T>(err: Error | null, user: T, _info: unknown, _context: ExecutionContext): T {
    if (err) {
      // If the strategy threw a DomainException or HttpException,
      // re-throw it directly so GlobalExceptionFilter produces the structured error format.
      if (err instanceof HttpException) {
        throw err;
      }
      // Unexpected infrastructure errors (e.g. DB failure, bcrypt crash) — log and
      // wrap as 401 to avoid leaking a 500 on the login endpoint.
      this.logger.error(
        `Unexpected auth error: ${err.message}`,
        err.stack,
      );
      throw new UnauthorizedException('Số điện thoại hoặc mật khẩu không đúng');
    }
    if (!user) {
      throw new UnauthorizedException('Số điện thoại hoặc mật khẩu không đúng');
    }
    return user;
  }
}
