import { MigrationInterface, QueryRunner, TableForeignKey } from "typeorm";

// RECONCILIACION. CreateTallerTables1738852000000 creo el FK de
// taller_vehiculos.tipo_vehiculo_id -> taller_tipos_vehiculo.id con
// ON DELETE SET NULL. La entidad (Vehiculo.tipoVehiculo, @ManyToOne SIN
// onDelete) y la demo real (sin clausula ON DELETE = NO ACTION, el default
// de InnoDB, verificado con getTable() — no adivinado) coinciden en que
// borrar un tipo de vehiculo EN USO debe bloquearse, no desvincular el
// vehiculo en silencio.
//
// Solo cambia el COMPORTAMIENTO de un futuro DELETE sobre taller_tipos_vehiculo
// — no valida ni toca ninguna fila de taller_vehiculos existente. Sin riesgo
// de datos: pasar de SET NULL a NO ACTION nunca puede fallar por datos
// incompatibles (a diferencia de un cambio de tipo/longitud/nullability).
export class ReconcileVehiculosTipoVehiculoFk1770500000000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_vehiculos");
    if (!table) return;

    const fk = table.foreignKeys.find(
      (f) =>
        f.columnNames.length === 1 &&
        f.columnNames[0] === "tipo_vehiculo_id" &&
        f.referencedTableName === "taller_tipos_vehiculo",
    );

    if (fk && fk.onDelete === "SET NULL") {
      await queryRunner.dropForeignKey("taller_vehiculos", fk);
      await queryRunner.createForeignKey(
        "taller_vehiculos",
        new TableForeignKey({
          columnNames: ["tipo_vehiculo_id"],
          referencedTableName: "taller_tipos_vehiculo",
          referencedColumnNames: ["id"],
          // Sin onDelete: MySQL lo deja en NO ACTION, igual que la demo real.
        }),
      );
    }
  }

  // Seguro de revertir de verdad: es solo un cambio de COMPORTAMIENTO del
  // FK (que pasa con un DELETE futuro sobre taller_tipos_vehiculo), nunca
  // toca una fila existente de taller_vehiculos — sin riesgo de perdida de
  // datos en ninguna direccion.
  public async down(queryRunner: QueryRunner): Promise<void> {
    const table = await queryRunner.getTable("taller_vehiculos");
    if (!table) return;

    const fk = table.foreignKeys.find(
      (f) =>
        f.columnNames.length === 1 &&
        f.columnNames[0] === "tipo_vehiculo_id" &&
        f.referencedTableName === "taller_tipos_vehiculo",
    );

    if (fk && fk.onDelete !== "SET NULL") {
      await queryRunner.dropForeignKey("taller_vehiculos", fk);
      await queryRunner.createForeignKey(
        "taller_vehiculos",
        new TableForeignKey({
          columnNames: ["tipo_vehiculo_id"],
          referencedTableName: "taller_tipos_vehiculo",
          referencedColumnNames: ["id"],
          onDelete: "SET NULL",
        }),
      );
    }
  }
}
