import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { ControlPlaneModule } from "../control-plane/control-plane.module";
import { Tenant } from "../control-plane/entities/tenant.entity";
import { TenancyMiddleware } from "./tenancy.middleware";
import { TenantConnectionRegistry } from "./tenant-connection-registry.service";
import { TenantContextStorage } from "./tenant-context.storage";
import { TenantGuard } from "./tenant.guard";
import { PublicTenantGuard } from "./public-tenant.guard";
import { TenantReleaseInterceptor } from "./tenant-release.interceptor";
import { TenantRepositoryAccessor } from "./tenant-repository.accessor";

@Module({
  imports: [ControlPlaneModule, TypeOrmModule.forFeature([Tenant], "controlPlane")],
  providers: [
    TenantConnectionRegistry,
    TenantContextStorage,
    TenantRepositoryAccessor,
    TenantGuard,
    PublicTenantGuard,
    TenantReleaseInterceptor,
  ],
  exports: [
    // Re-exportado a proposito: TenantGuard/PublicTenantGuard necesitan
    // IdentityService (verificar membresia activa / tenants activos), y
    // Nest NO propaga los exports de un modulo importado salvo que quien lo
    // importa los re-exporte el mismo — sin esto, CUALQUIER modulo de
    // features que solo importe TenancyModule (todos) falla al arrancar con
    // "Nest can't resolve dependencies of TenantGuard (?, ?, IdentityService)".
    // Encontrado arrancando la app real, no leyendo el grafo de modulos.
    ControlPlaneModule,
    TenantConnectionRegistry,
    TenantContextStorage,
    TenantRepositoryAccessor,
    TenantGuard,
    PublicTenantGuard,
    TenantReleaseInterceptor,
  ],
})
export class TenancyModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(TenancyMiddleware).forRoutes("*");
  }
}
