import { Module } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { JwtModule } from "@nestjs/jwt";
import { PassportModule } from "@nestjs/passport";
import { AuthController } from "./auth.controller";
import { AuthService } from "./auth.service";
import { JwtStrategy } from "./jwt.strategy";
import { ControlPlaneModule } from "../control-plane/control-plane.module";
import { TenancyModule } from "../tenancy/tenancy.module";
import { TallerParametrosModule } from "../taller-parametros/taller-parametros.module";

// Ya NO registra un forFeature local para Usuario/Tienda: AuthService no
// inyecta esos repositorios directo (esa era la ofensa) — los alcanza via
// TenancyModule (TenantConnectionRegistry, el bypass explicito) y la
// identidad/membresia/auditoria via ControlPlaneModule (IdentityService).
// Tampoco corre seedUsersIfTableExists() en el arranque: no hay "el tenant
// actual" que sembrar en el boot de Nest — sembrar el primer usuario local
// de un tenant nuevo es responsabilidad del aprovisionamiento (panel), no de
// este modulo. Esto ademas CIERRA la deuda de seguridad de la credencial fija
// "superadmin"/"super123" (creada antes en cada arranque, documentada junto a
// catalogos/seed y el 500 crudo de tipoDanoId/cosaTraeId) — ya no existe
// codigo que la cree. La deuda que queda, anotada para el aprovisionamiento
// (no resuelta aca): un tenant recien dado de alta NO tiene ningun usuario
// local hasta que el panel le cree el primero, con contraseña aleatoria de un
// solo uso — nunca fija en codigo. Mismo agujero que los catalogos vacios de
// un tenant nuevo (ver diagnostico de seedCatalogos()), pero peor: sin
// catalogos no se puede crear una OT, sin usuario local no se puede ni entrar.
@Module({
  imports: [
    ControlPlaneModule,
    TenancyModule,
    TallerParametrosModule,
    PassportModule.register({ defaultStrategy: "jwt" }),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        secret: configService.get("JWT_SECRET"),
        signOptions: {
          expiresIn: configService.get("JWT_EXPIRES_IN", "7d"),
        },
      }),
    }),
  ],
  controllers: [AuthController],
  providers: [AuthService, JwtStrategy],
  exports: [AuthService, JwtStrategy, PassportModule],
})
export class AuthModule {}
