/* ============================================================
 * Copyright (c) 2026 RAVAPI Soluções. www.ravapi.com
 * Interceptor de tenant
 *
 * Sem app.tenant_id definido, as políticas de RLS não casam com nada e
 * a consulta volta vazia. Isso é falha fechada — segura — mas silenciosa:
 * pareceria "não tem dados" em vez de erro. Por isso o interceptor exige
 * o claim e estoura antes de qualquer consulta.
 *
 * ATENÇÃO: código de ligação, ainda não coberto por teste automatizado.
 * Os serviços de domínio que ele embrulha são, esses sim, testados.
 * ============================================================ */

import {
  Injectable, NestInterceptor, ExecutionContext, CallHandler, UnauthorizedException,
} from '@nestjs/common';
import type { Observable } from 'rxjs';
import { comContexto } from '../db/client.ts';

@Injectable()
export class TenantInterceptor implements NestInterceptor {
  intercept(contexto: ExecutionContext, proximo: CallHandler): Observable<unknown> {
    const req = contexto.switchToHttp().getRequest();
    const tenantId: string | undefined = req.user?.tenantId ?? req.user?.tenant_id;

    if (!tenantId) {
      throw new UnauthorizedException(
        'Requisição sem tenant. O token precisa carregar o claim de empresa.',
      );
    }
    return comContexto({ tenantId }, () => proximo.handle());
  }
}
