import * as fs from "fs";
import * as mysql from "mysql2/promise";
import * as path from "path";

// Extraido de schema-divergence.spec.ts para reusar la misma maquinaria en
// reconciliation-round-trip.spec.ts — misma normalizacion, misma conexion,
// sin duplicar la logica de comparacion de esquemas en dos archivos.

export function normalize(sql: string): string {
  return sql
    .replace(/AUTO_INCREMENT=\d+\s*/i, "")
    .replace(/CHARACTER SET \w+\s*/gi, "")
    .replace(/COLLATE[ =]\w+\s*/gi, "")
    .replace(/DEFAULT CHARSET=\w+\s*/gi, "")
    .replace(/\s+/g, " ")
    .replace(/\s+([,)])/g, "$1")
    .trim();
}

export function loadRootEnv(): void {
  const envPath = path.join(__dirname, "..", "..", "..", "..", ".env");
  for (const line of fs.readFileSync(envPath, "utf8").split(/\r?\n/)) {
    const m = line.match(/^([A-Z0-9_]+)=(.*)$/);
    if (m && !process.env[m[1]]) process.env[m[1]] = m[2];
  }
}

export async function getTallerSchemas(
  database: string,
): Promise<Record<string, string>> {
  const conn = await mysql.createConnection({
    host: process.env.TENANT_CLI_DB_HOST,
    port: Number(process.env.TENANT_CLI_DB_PORT),
    user: process.env.TENANT_CLI_DB_USERNAME,
    password: process.env.TENANT_CLI_DB_PASSWORD,
    database,
  });
  try {
    const [tables] = await conn.query<mysql.RowDataPacket[]>(
      "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE 'taller_%' ORDER BY table_name",
    );
    const schemas: Record<string, string> = {};
    for (const t of tables) {
      const name = (t as any).table_name || (t as any).TABLE_NAME;
      const [rows] = await conn.query<mysql.RowDataPacket[]>(
        `SHOW CREATE TABLE \`${name}\``,
      );
      schemas[name] = normalize((rows[0] as any)["Create Table"]);
    }
    return schemas;
  } finally {
    await conn.end();
  }
}
