import * as fs from "fs";
import * as path from "path";

// Un juego completo de variables DB_HOST/DB_PORT/DB_DATABASE/DB_USERNAME/
// DB_PASSWORD apuntando a un tenant demo es la municion exacta del fallback
// a "base por defecto" que el diseño multi-tenant prohibe (el bug de
// TenantDatabaseResolver.php:148 en cxp). Esta prueba escanea el codigo
// fuente del backend y falla si aparece cualquiera de esos nombres sueltos
// — deben ser TENANT_CLI_DB_* (CLI manual) o CONTROL_PLANE_DB_* (mbinvtaller),
// nunca el generico "DB_*".
describe("nombres de variables de entorno de base de datos", () => {
  const FORBIDDEN = [
    /\bDB_HOST\b/,
    /\bDB_PORT\b/,
    /\bDB_DATABASE\b/,
    /\bDB_USERNAME\b/,
    /\bDB_PASSWORD\b/,
  ];

  function listTsFiles(dir: string): string[] {
    const entries = fs.readdirSync(dir, { withFileTypes: true });
    let files: string[] = [];
    for (const entry of entries) {
      const full = path.join(dir, entry.name);
      if (entry.isDirectory()) {
        if (entry.name === "node_modules" || entry.name === "dist") continue;
        files = files.concat(listTsFiles(full));
      } else if (entry.name.endsWith(".ts") && !entry.name.endsWith(".spec.ts")) {
        files.push(full);
      }
    }
    return files;
  }

  it("ningun archivo de src/ construye un DataSource con DB_HOST/DB_PORT/DB_DATABASE/DB_USERNAME/DB_PASSWORD sueltos", () => {
    const srcDir = path.join(__dirname);
    const offenders: string[] = [];

    for (const file of listTsFiles(srcDir)) {
      const content = fs.readFileSync(file, "utf8");
      for (const pattern of FORBIDDEN) {
        if (pattern.test(content)) {
          offenders.push(`${path.relative(srcDir, file)} — ${pattern}`);
        }
      }
    }

    expect(offenders).toEqual([]);
  });
});
