import { MigrationInterface, QueryRunner } from 'typeorm';

// 화상회의 방에 입장 코드(code) 추가 — 이름과 식별자를 분리한다.
// code = 입장 URL·LiveKit 방·초대 링크의 안정적 키(불변). 이름은 표시용 라벨로 강등(고유 해제).
// 운영(migrationsRun)에서만 실행되며, dev 는 synchronize 로 자동 반영된다.
export class AddMeetingRoomCode1782900000000 implements MigrationInterface {
  name = 'AddMeetingRoomCode1782900000000';

  public async up(queryRunner: QueryRunner): Promise<void> {
    // 1) 코드 컬럼 추가(우선 nullable) → 기존 행 백필 → NOT NULL 승격
    await queryRunner.query(
      `ALTER TABLE "meeting_rooms" ADD "code" character varying`,
    );
    // 기존 방에 고유 코드 백필(md5(random) 12자리 16진수 — 충돌 사실상 없음)
    await queryRunner.query(
      `UPDATE "meeting_rooms" SET "code" = substr(md5(random()::text || "id"::text), 1, 12) WHERE "code" IS NULL`,
    );
    await queryRunner.query(
      `ALTER TABLE "meeting_rooms" ALTER COLUMN "code" SET NOT NULL`,
    );
    await queryRunner.query(
      `CREATE UNIQUE INDEX "IDX_meeting_rooms_code" ON "meeting_rooms" ("code")`,
    );
    // 2) 이름은 더 이상 고유가 아니다(표시용 라벨) → 고유 인덱스 제거
    await queryRunner.query(`DROP INDEX "IDX_meeting_rooms_name"`);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    // 주의: 이름 중복 데이터가 있으면 고유 인덱스 복원이 실패할 수 있다.
    await queryRunner.query(
      `CREATE UNIQUE INDEX "IDX_meeting_rooms_name" ON "meeting_rooms" ("name")`,
    );
    await queryRunner.query(`DROP INDEX "IDX_meeting_rooms_code"`);
    await queryRunner.query(`ALTER TABLE "meeting_rooms" DROP COLUMN "code"`);
  }
}
