import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
  Logger,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { AuthenticatedUser } from '../../auth/interfaces/jwt-payload.interface';

/**
 * Interceptor que automaticamente adiciona informações do token JWT
 * às requisições que precisam se comunicar com a API Laravel
 */
@Injectable()
export class LaravelTokenInterceptor implements NestInterceptor {
  private readonly logger = new Logger(LaravelTokenInterceptor.name);

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest();
    const user: AuthenticatedUser = request.user;

    if (user && user.rawToken) {
      // Adiciona o token e dados do usuário ao request para uso po sterior
      request.laravelToken = user.rawToken;
      request.laravelUserData = {
        id: user.id,
        type: user.type,
        tokenData: user.tokenData,
        payload: user.payload,
      };

      this.logger.debug(
        `🔑 Token disponível para requisições Laravel: ${user.type} ${user.id}`,
      );
    }

    return next.handle().pipe(
      tap((response) => {
        if (user) {
          this.logger.debug(
            `✅ Requisição processada para usuário: ${user.type} ${user.id}`,
          );
        }
      }),
    );
  }
}

/**
 * Decorator para aplicar o interceptor de token Laravel
 */
export const UseLaravelToken = () => {
  return (
    target: any,
    propertyKey?: string,
    descriptor?: PropertyDescriptor,
  ) => {
    // Este decorator pode ser usado em controllers que precisam integrar com Laravel
    // Por enquanto é apenas documentativo, mas pode ser expandido
    return descriptor;
  };
};
