import {
  Injectable,
  CanActivate,
  ExecutionContext,
  UnauthorizedException,
} from '@nestjs/common';
import { ApiKeyGuard } from '../api-key/api-key.guard';
import { ClientJwtGuard } from '../../../auth/guards/client-jwt.guard';
import { UserJwtGuard } from '../../../auth/guards/user-jwt.guard';

@Injectable()
export class MultiAuthGuard implements CanActivate {
  constructor(
    private readonly apiKeyGuard: ApiKeyGuard,
    private readonly clientJwtGuard: ClientJwtGuard,
    private readonly userJwtGuard: UserJwtGuard,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const guards = [this.apiKeyGuard, this.clientJwtGuard, this.userJwtGuard];

    const errors: string[] = [];

    for (const guard of guards) {
      try {
        const canActivate = await guard.canActivate(context);
        if (canActivate) {
          return true;
        }
      } catch (error: unknown) {
        // Coleta os erros para debug, mas não falha ainda
        const errorMessage =
          error instanceof Error ? error.message : 'Erro de autenticação';
        errors.push(errorMessage);
      }
    }

    // Se nenhum guard passou, lança uma exceção
    throw new UnauthorizedException(
      'Acesso negado: nenhum método de autenticação válido encontrado. ' +
        'Use API Key (x-api-key header) ou JWT Bearer token (client ou user). ' +
        `Erros: ${errors.join(', ')}`,
    );
  }
}
