import { MigrationInterface, QueryRunner } from 'typeorm';

/**
 * Wagon spec belongs to the wagon TYPE, not to each physical wagon.
 *
 * `wagons.tare_weight` and `wagons.max_payload_weight` duplicated
 * `wagon_types.tare_weight_tons` / `wagon_types.capacity_tons` on all 1100 rows,
 * with nothing keeping them in step. They had drifted completely: every wagon
 * disagreed with its type's tare (seeded ~20T against a real 22.4T NW5), and a
 * third disagreed on payload (NW5 wagons claiming 22T–70T against a flat 70T).
 * None of those numbers came from the railway.
 *
 * Nothing reads them for capacity — that math resolves tare and capacity through
 * `wagon_type_id` — so dropping them removes a source of fiction rather than a
 * source of truth. `wagon_type_id` is NOT NULL with no orphans, so the type is
 * always reachable.
 *
 * A wagon re-tared after repair would need a nullable override column on
 * `wagons` falling back to the type; deliberately not added, since no such
 * per-wagon value exists today.
 */
export class DropWagonSpecColumns2080000000000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`
      ALTER TABLE freight.wagons
        DROP COLUMN IF EXISTS tare_weight,
        DROP COLUMN IF EXISTS max_payload_weight;
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    // Re-add nullable, backfill from the owning type, then restore NOT NULL.
    // The pre-drop values were drifted seed data and are not recoverable — the
    // type's spec is what they should always have held.
    await queryRunner.query(`
      ALTER TABLE freight.wagons
        ADD COLUMN IF NOT EXISTS tare_weight NUMERIC(10, 2),
        ADD COLUMN IF NOT EXISTS max_payload_weight NUMERIC(10, 2);
    `);
    await queryRunner.query(`
      UPDATE freight.wagons w
         SET tare_weight = t.tare_weight_tons,
             max_payload_weight = t.capacity_tons
        FROM freight.wagon_types t
       WHERE t.id = w.wagon_type_id;
    `);
    await queryRunner.query(`
      ALTER TABLE freight.wagons
        ALTER COLUMN tare_weight SET NOT NULL,
        ALTER COLUMN max_payload_weight SET NOT NULL;
    `);
  }
}
