import { MigrationInterface, QueryRunner, Table } from 'typeorm';
import { Licensee } from '../licensee/licensee.entity';
import { Ticket } from '../ticket/ticket.entity';

export class AddLicenseeTable1625142659019 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(
      new Table({
        name: 'licensee',
        columns: [
          {
            name: 'id',
            type: 'int',
            isPrimary: true,
            isGenerated: false,
          },
          {
            name: 'email',
            type: 'varchar',
            default: null,
            isNullable: true,
          },
        ],
      })
    );

    // It actually returns the class object but it's internal to the TypeORM that's why it's explicitly typed here
    const queryResult: {
      licenseeId: number;
    }[] = await queryRunner.manager
      .getRepository(Ticket)
      .createQueryBuilder('ticket')
      .select('ticket.licenseeId')
      .groupBy('ticket.licenseeId')
      .getRawMany();

    for (const { licenseeId } of queryResult) {
      await Licensee.getById(licenseeId, queryRunner.manager);
    }
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable('licensee');
  }
}
