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

// Vive en verification/ por la MISMA razon que schema-snapshot.ts: el glob
// de migraciones del CLI (typeorm.config.ts, "migrations/*{.ts,.js}") es de
// un solo nivel — cualquier archivo puesto directo en src/migrations/ se
// cargaria como si fuera una migracion real. El nombre de la carpeta no
// implica "solo para pruebas": este archivo tiene DOS consumidores de
// produccion real, no solo schema-divergence.spec.ts —
// control-plane-admin/tenant-schema-check.service.ts lo usa para calcular
// "migraciones pendientes" de un tenant en el panel de administracion.
//
// Nombre de archivo -> nombre de clase de migracion, mismo patron que usa
// TypeORM para el nombre que graba en la tabla `migrations`
// ({ClassName}{timestamp}, verificado en los INSERT reales de corridas
// anteriores — nunca adivinado).
export function migrationFileNameToClassName(fileName: string): string {
  const match = fileName.match(/^(\d+)-(.+)\.ts$/);
  if (!match) {
    throw new Error(
      `Nombre de archivo de migracion inesperado: ${fileName}. ` +
        "Se esperaba '{timestamp}-{ClassName}.ts'.",
    );
  }
  const [, timestamp, className] = match;
  return `${className}${timestamp}`;
}

// Todos los .ts directo en src/migrations/ (fs.readdirSync no entra a
// subcarpetas, asi que verification/ mismo, un nivel mas adentro, no cuenta).
//
// EXCLUYE explicitamente *.d.ts: un archivo de declaracion de TypeScript
// (nunca deberia estar en src/, pero si en algun checkout quedo uno suelto
// -- ej. un `tsc` corrido sin outDir en algun momento) TAMBIEN termina en
// ".ts", y la regex de arriba le corta el nombre justo antes del ULTIMO
// ".ts" -- dejando el ".d" pegado al nombre real de la clase
// ("Nombre.d1234567890" en vez de "Nombre1234567890"). Ese nombre nunca
// aparece en la tabla `migrations` de ningun tenant (no es una migracion
// real, TypeORM nunca la ejecuta), asi que sin este filtro queda "pendiente"
// PARA SIEMPRE — bug real, encontrado viendo TODAS las migraciones de un
// tenant ya reconciliado (0 pendientes de verdad) mostrarse igual como
// pendientes en el panel, con el ".d" delatando el archivo de mas.
export function listSourceMigrationClassNames(): string[] {
  const migrationsDir = path.join(__dirname, "..");
  return fs
    .readdirSync(migrationsDir)
    .filter((f) => f.endsWith(".ts") && !f.endsWith(".d.ts"))
    .map(migrationFileNameToClassName);
}
