import { MigrationInterface, QueryRunner } from "typeorm"

export class AddMissingCompanyIdToRoles1762932353231 implements MigrationInterface {
  name = "AddMissingCompanyIdToRoles1762932353231"

  public async up(queryRunner: QueryRunner): Promise<void> {
    // Check if company_id column exists before adding it
    const hasCompanyId = await queryRunner.hasColumn("roles", "company_id")
    if (!hasCompanyId) {
      await queryRunner.query(`ALTER TABLE "roles" ADD "company_id" integer`)

      // Add foreign key constraint for company_id
      await queryRunner.query(
        `ALTER TABLE "roles" ADD CONSTRAINT "FK_roles_company_id" FOREIGN KEY ("company_id") REFERENCES "companies"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
      )
    }

    // Check if deleted_at column exists before adding it
    const hasDeletedAt = await queryRunner.hasColumn("roles", "deleted_at")
    if (!hasDeletedAt) {
      await queryRunner.query(`ALTER TABLE "roles" ADD "deleted_at" TIMESTAMP`)
    }
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    // Check if foreign key constraint exists before dropping it
    const hasConstraint = await queryRunner.query(
      `SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = 'roles' AND constraint_name = 'FK_roles_company_id'`,
    )

    if (hasConstraint.length > 0) {
      await queryRunner.query(
        `ALTER TABLE "roles" DROP CONSTRAINT "FK_roles_company_id"`,
      )
    }

    // Check if columns exist before dropping them
    const hasDeletedAt = await queryRunner.hasColumn("roles", "deleted_at")
    if (hasDeletedAt) {
      await queryRunner.query(`ALTER TABLE "roles" DROP COLUMN "deleted_at"`)
    }

    const hasCompanyId = await queryRunner.hasColumn("roles", "company_id")
    if (hasCompanyId) {
      await queryRunner.query(`ALTER TABLE "roles" DROP COLUMN "company_id"`)
    }
  }
}
