import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";

// SOLO firma — cero acceso a datos. Decision explicita, revertida despues de
// medir mal su costo: la primera version de esta conversion llamaba a
// AuthService.validateUser() aca, que necesitaba ADQUIRIR la conexion del
// tenant (bypass) en CADA request autenticado, solo para confirmar que el
// usuario local siguiera activo. Eso:
//   - duplicaba conexiones por request en un servidor con 100+ bases,
//   - hacia que un tenant con la base lenta volviera lento CADA request
//     (hasta los que no tocan datos),
//   - ponia el acquireTimeout de 5s (TenantConnectionRegistry) en el camino
//     de AUTENTICACION — un pool lleno bloqueaba el login de sus propios
//     usuarios,
//   - contradecia la decision ya tomada de TTL corto en vez de re-chequeo
//     por request (el token ya lleva usuario local y rol; revalidarlos
//     contra la base en cada request es justo el costo que se elige no
//     pagar),
//   - abria un SEGUNDO punto de escape del contexto ambiental (el bypass
//     iba a estar aprobado solo para AuthService, no para JwtStrategy).
// Consecuencia aceptada: un usuario desactivado sigue autenticando hasta que
// su access token expire o se intente un refresh (TTL corto, no revocacion
// instantanea) — el mismo trade-off ya elegido, no uno nuevo.
// La verificacion de membresia (¿esta identidad puede entrar a este tenant?)
// no vive aca tampoco — es trabajo del futuro TenantGuard, UNA vez por
// request, no de Passport en cada validate().
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private configService: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: configService.getOrThrow<string>("JWT_SECRET"),
    });
  }

  async validate(payload: any) {
    return {
      id: payload.sub,
      username: payload.username,
      rol: payload.rol,
      tiendaId: payload.tiendaId ?? null,
      permissions: payload.permissions || {},
      facturacionPosTiendaIds: payload.facturacionPosTiendaIds ?? null,
      estadosVisibles: payload.estadosVisibles ?? null,
      tenantId: payload.tenantId,
      identidadId: payload.identidadId,
      usuarioLocalId: payload.usuarioLocalId,
      rolPlataforma: payload.rolPlataforma,
      via: payload.via,
    };
  }
}
