import { MigrationInterface, QueryRunner } from 'typeorm';

/**
 * Per-supplier driver on junction rows — enables independent driver
 * assignment on multi-supplier MD lines and Supplier Collection driver
 * breakdown per junction-scoped cash collection.
 */
export class JunctionSupplierDriver1785700000000 implements MigrationInterface {
  name = 'JunctionSupplierDriver1785700000000';

  public async up(qr: QueryRunner): Promise<void> {
    for (const table of [
      'booking_transport_item_suppliers',
      'booking_activity_item_suppliers',
      'booking_special_item_suppliers',
    ]) {
      await qr.query(`
        ALTER TABLE "${table}"
          ADD COLUMN IF NOT EXISTS "driver_id" uuid NULL,
          ADD COLUMN IF NOT EXISTS "driver_name_text" varchar(255) NULL,
          ADD COLUMN IF NOT EXISTS "driver_phone_text" varchar(50) NULL
      `);
    }

    await qr.query(`
      DO $$ BEGIN
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'fk_btis_driver'
        ) THEN
          ALTER TABLE "booking_transport_item_suppliers"
            ADD CONSTRAINT "fk_btis_driver"
            FOREIGN KEY ("driver_id") REFERENCES "drivers"("id");
        END IF;
      END $$;
    `);
    await qr.query(`
      DO $$ BEGIN
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'fk_bais_driver'
        ) THEN
          ALTER TABLE "booking_activity_item_suppliers"
            ADD CONSTRAINT "fk_bais_driver"
            FOREIGN KEY ("driver_id") REFERENCES "drivers"("id");
        END IF;
      END $$;
    `);
    await qr.query(`
      DO $$ BEGIN
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'fk_bsis_driver'
        ) THEN
          ALTER TABLE "booking_special_item_suppliers"
            ADD CONSTRAINT "fk_bsis_driver"
            FOREIGN KEY ("driver_id") REFERENCES "drivers"("id");
        END IF;
      END $$;
    `);

    // Primary junction rows inherit the transport item driver when unset.
    await qr.query(`
      UPDATE "booking_transport_item_suppliers" j
         SET driver_id = ti.driver_id,
             driver_name_text = CASE WHEN ti.driver_id IS NULL THEN ti.driver_name_text ELSE NULL END,
             driver_phone_text = CASE WHEN ti.driver_id IS NULL THEN ti.driver_phone_text ELSE NULL END,
             updated_at = now()
        FROM "booking_transport_items" ti
       WHERE j.transport_item_id = ti.id
         AND j.is_deleted = false
         AND ti.is_deleted = false
         AND j.sort_order = 0
         AND j.driver_id IS NULL
         AND j.driver_name_text IS NULL
         AND (ti.driver_id IS NOT NULL OR ti.driver_name_text IS NOT NULL)
    `);
  }

  public async down(qr: QueryRunner): Promise<void> {
    await qr.query(`
      ALTER TABLE "booking_special_item_suppliers"
        DROP CONSTRAINT IF EXISTS "fk_bsis_driver"
    `);
    await qr.query(`
      ALTER TABLE "booking_activity_item_suppliers"
        DROP CONSTRAINT IF EXISTS "fk_bais_driver"
    `);
    await qr.query(`
      ALTER TABLE "booking_transport_item_suppliers"
        DROP CONSTRAINT IF EXISTS "fk_btis_driver"
    `);
    for (const table of [
      'booking_transport_item_suppliers',
      'booking_activity_item_suppliers',
      'booking_special_item_suppliers',
    ]) {
      await qr.query(`
        ALTER TABLE "${table}"
          DROP COLUMN IF EXISTS "driver_phone_text",
          DROP COLUMN IF EXISTS "driver_name_text",
          DROP COLUMN IF EXISTS "driver_id"
      `);
    }
  }
}
