import { MigrationInterface, QueryRunner } from 'typeorm';

export class EmailVerification1774770000000 implements MigrationInterface {
  name = 'EmailVerification1774770000000';

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      'ALTER TABLE `users` ADD `isEmailVerified` tinyint NOT NULL DEFAULT 0',
    );
    await queryRunner.query(
      'ALTER TABLE `users` ADD `emailVerifiedAt` timestamp NULL',
    );
    await queryRunner.query(
      'CREATE TABLE `email_verification_codes` (`id` varchar(36) NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `userId` varchar(36) NOT NULL, `codeHash` varchar(64) NOT NULL, `expiresAt` timestamp NOT NULL, `usedAt` timestamp NULL, `failedAttempts` int NOT NULL DEFAULT 0, INDEX `IDX_email_verification_user` (`userId`), INDEX `IDX_email_verification_user_expiry` (`userId`, `expiresAt`), PRIMARY KEY (`id`)) ENGINE=InnoDB',
    );
    await queryRunner.query(
      'ALTER TABLE `email_verification_codes` ADD CONSTRAINT `FK_email_verification_user` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
    );
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      'ALTER TABLE `email_verification_codes` DROP FOREIGN KEY `FK_email_verification_user`',
    );
    await queryRunner.query('DROP TABLE `email_verification_codes`');
    await queryRunner.query('ALTER TABLE `users` DROP COLUMN `emailVerifiedAt`');
    await queryRunner.query('ALTER TABLE `users` DROP COLUMN `isEmailVerified`');
  }
}
