import { MigrationInterface, QueryRunner } from "typeorm";

// RECONCILIACION. CreateTallerTables1738852000000 dejo
// nombre_firma_cliente/nombre_firma_recepcion en varchar(200); la entidad
// (OtFirma) y la demo real coinciden en varchar(255). Ensanchar nunca pierde
// datos — seguro de aplicar siempre, incluida la demo (no-op si ya es 255).
export class ReconcileOtFirmasNombreLength1770300000000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_ot_firmas");
    if (!table) return;

    for (const columnName of ["nombre_firma_cliente", "nombre_firma_recepcion"]) {
      const column = table.findColumnByName(columnName);
      if (column && column.length !== "255") {
        await queryRunner.query(
          `ALTER TABLE taller_ot_firmas MODIFY COLUMN ${columnName} varchar(255) NULL`,
        );
      }
    }
  }

  // Angostar 255->200 SI puede perder datos (un nombre de 201-255
  // caracteres). Se verifica columna por columna antes de tocar nada —
  // ABORTA en la primera que tenga un valor demasiado largo, en vez de
  // truncar o fallar con un error de MySQL poco claro.
  public async down(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_ot_firmas");
    if (!table) return;

    for (const columnName of ["nombre_firma_cliente", "nombre_firma_recepcion"]) {
      const column = table.findColumnByName(columnName);
      if (!column || column.length !== "255") continue;

      const tooLong = await queryRunner.query(
        `SELECT id, CHAR_LENGTH(${columnName}) as len
         FROM taller_ot_firmas
         WHERE ${columnName} IS NOT NULL AND CHAR_LENGTH(${columnName}) > 200
         LIMIT 1`,
      );
      if (tooLong.length > 0) {
        throw new Error(
          `No se puede revertir ReconcileOtFirmasNombreLength1770300000000: ${columnName} ` +
            `en la fila id=${tooLong[0].id} tiene ${tooLong[0].len} caracteres. ` +
            "Angostar a varchar(200) perderia ese dato. ABORTA.",
        );
      }

      await queryRunner.query(
        `ALTER TABLE taller_ot_firmas MODIFY COLUMN ${columnName} varchar(200) NULL`,
      );
    }
  }
}
