import { MigrationInterface, QueryRunner } from "typeorm";

// RECONCILIACION. AddUsersPermissionsVehicularCatalogs1740152000000 (la
// referencia real es CreateTallerTables, ver auditoria previa) dejo
// taller_cotizacion_lineas.plu en varchar(24). Medido contra la fuente real
// (information_schema.COLUMNS sobre maeplu en mbinvautocentrorodriguez, NO
// asumido): maeplu.plu es varchar(25). Esta columna guarda PLUs de ambos
// origenes (ERP y TLLP- del taller), asi que tiene que poder alojar
// cualquier maeplu.plu — a diferencia de taller_productos.plu (solo
// TLLP-XXXXXXXX, 13 caracteres, 24 le alcanza y NO se toca aca). La entidad
// (CotizacionLinea.plu) ya se corrigio a length:25 en el mismo cambio que
// esta migracion.
//
// Ensanchar nunca pierde datos — seguro de aplicar siempre, incluida la
// demo (no-op si ya es 25).
export class ReconcileCotizacionLineasPluLength1770600000000
  implements MigrationInterface
{
  public async up(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_cotizacion_lineas");
    if (!table) return;

    const plu = table.findColumnByName("plu");
    if (plu && plu.length !== "25") {
      await queryRunner.query(
        "ALTER TABLE taller_cotizacion_lineas MODIFY COLUMN plu varchar(25) NOT NULL",
      );
    }
  }

  // Angostar 25->24 SI puede perder datos (un PLU real de 25 caracteres,
  // ERP o TLLP-). Se verifica ANTES de tocar la columna — ABORTA si
  // encuentra alguno, en vez de truncar o fallar con un error generico.
  public async down(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_cotizacion_lineas");
    if (!table) return;
    const plu = table.findColumnByName("plu");
    if (!plu || plu.length !== "25") return; // no la puso esta migracion

    const largos = await queryRunner.query(
      `SELECT id, CHAR_LENGTH(plu) as len FROM taller_cotizacion_lineas WHERE CHAR_LENGTH(plu) > 24 LIMIT 1`,
    );
    if (largos.length > 0) {
      throw new Error(
        `No se puede revertir ReconcileCotizacionLineasPluLength1770600000000: la fila id=${largos[0].id} ` +
          `tiene un plu de ${largos[0].len} caracteres. Angostar a varchar(24) perderia ese dato. ABORTA.`,
      );
    }

    await queryRunner.query(
      "ALTER TABLE taller_cotizacion_lineas MODIFY COLUMN plu varchar(24) NOT NULL",
    );
  }
}
