import { MigrationInterface, QueryRunner } from 'typeorm';

/**
 * Per-document review state, so a backoffice reviewer can request a correction
 * on one specific onboarding document instead of rejecting the whole role.
 *
 * Until now `freight.files` carried no status at all: the `pending_add` /
 * `pending_remove` badges the portal shows are derived by diffing live rows
 * against an open company change request, which says nothing about whether a
 * reviewer is happy with a given document. `review_status` is that missing
 * verdict — NULL means never reviewed, which is the state every existing row
 * correctly starts in, so no backfill is needed.
 *
 * The partial index serves the approval gate, which asks "does this company (or
 * profile) still have any document with an open change request?" on every
 * role-status write.
 */
export class AddFileReviewStatus2430000000000 implements MigrationInterface {
  name = 'AddFileReviewStatus2430000000000';

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`
      ALTER TABLE freight.files
        ADD COLUMN IF NOT EXISTS review_status varchar(32) NULL,
        ADD COLUMN IF NOT EXISTS review_note   text        NULL,
        ADD COLUMN IF NOT EXISTS reviewed_by   uuid        NULL,
        ADD COLUMN IF NOT EXISTS reviewed_at   timestamptz NULL
    `);

    await queryRunner.query(`
      CREATE INDEX IF NOT EXISTS "IDX_files_open_change_request"
        ON freight.files (resource, resource_id)
        WHERE review_status = 'change_requested' AND deleted_at IS NULL
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      `DROP INDEX IF EXISTS freight."IDX_files_open_change_request"`,
    );
    await queryRunner.query(`
      ALTER TABLE freight.files
        DROP COLUMN IF EXISTS review_status,
        DROP COLUMN IF EXISTS review_note,
        DROP COLUMN IF EXISTS reviewed_by,
        DROP COLUMN IF EXISTS reviewed_at
    `);
  }
}
