import { type MigrationInterface, type QueryRunner } from 'typeorm';

export class TicketEnhancements1778600000000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    // Add booking_reference_no to activity_ticket_batches
    await queryRunner.query(`
      ALTER TABLE activity_ticket_batches
      ADD COLUMN IF NOT EXISTS booking_reference_no VARCHAR(100) NULL
    `);

    // Add cancel/refund fields to booking_activity_items
    await queryRunner.query(`
      ALTER TABLE booking_activity_items
      ADD COLUMN IF NOT EXISTS cancelled_count INTEGER NOT NULL DEFAULT 0,
      ADD COLUMN IF NOT EXISTS refund_status VARCHAR(20) NOT NULL DEFAULT 'NONE',
      ADD COLUMN IF NOT EXISTS cancellation_notes TEXT NULL
    `);

    // Create activity_ticket_journeys table (full journey/history log per ticket)
    await queryRunner.query(`
      CREATE TABLE IF NOT EXISTS activity_ticket_journeys (
        id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
        tenant_id UUID NOT NULL,
        ticket_item_id UUID NOT NULL REFERENCES activity_ticket_items(id) ON DELETE CASCADE,
        event VARCHAR(30) NOT NULL,
        booking_id UUID NULL,
        booking_activity_item_id UUID NULL,
        from_path VARCHAR(500) NULL,
        to_path VARCHAR(500) NULL,
        notes TEXT NULL,
        created_by UUID NULL,
        updated_by UUID NULL,
        created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        is_deleted BOOLEAN NOT NULL DEFAULT FALSE
      )
    `);

    await queryRunner.query(`
      CREATE INDEX IF NOT EXISTS idx_ticket_journeys_item
      ON activity_ticket_journeys(ticket_item_id)
    `);

    await queryRunner.query(`
      CREATE INDEX IF NOT EXISTS idx_ticket_journeys_booking
      ON activity_ticket_journeys(tenant_id, booking_id)
      WHERE booking_id IS NOT NULL
    `);

    // Index for booking_reference_no lookups
    await queryRunner.query(`
      CREATE INDEX IF NOT EXISTS idx_ticket_batches_booking_ref
      ON activity_ticket_batches(tenant_id, booking_reference_no)
      WHERE booking_reference_no IS NOT NULL
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`DROP INDEX IF EXISTS idx_ticket_batches_booking_ref`);
    await queryRunner.query(`DROP TABLE IF EXISTS activity_ticket_journeys`);
    await queryRunner.query(`
      ALTER TABLE booking_activity_items
      DROP COLUMN IF EXISTS cancelled_count,
      DROP COLUMN IF EXISTS refund_status,
      DROP COLUMN IF EXISTS cancellation_notes
    `);
    await queryRunner.query(`
      ALTER TABLE activity_ticket_batches
      DROP COLUMN IF EXISTS booking_reference_no
    `);
  }
}
