import { MigrationInterface, QueryRunner } from "typeorm"

export class AlterRoleAndPermissionAndAddModulesEntity1744022466678 implements MigrationInterface {
  name = "AlterRoleAndPermissionAndAddModulesEntity1744022466678"

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      `CREATE TABLE "modules" (
        "id" SERIAL NOT NULL,
        "module_name" character varying NOT NULL,
        "module_type" character varying NOT NULL,
        "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
        "updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),
        "deleted_at" TIMESTAMP,
        CONSTRAINT "PK_7dbefd488bd96c5bf31f0ce0c95" PRIMARY KEY ("id")
      )`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP COLUMN "admin_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP COLUMN "editor_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP COLUMN "viewer_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP COLUMN "none_access"`,
    )
    await queryRunner.query(`ALTER TABLE "permissions" DROP COLUMN "name"`)
    await queryRunner.query(
      `ALTER TABLE "permissions" DROP CONSTRAINT "UQ_d090ad82a0e97ce764c06c7b312"`,
    )
    await queryRunner.query(`ALTER TABLE "permissions" DROP COLUMN "slug"`)
    await queryRunner.query(`ALTER TABLE "roles" ADD "department_id" integer`)
    await queryRunner.query(
      `ALTER TABLE "roles" ADD "business_vertical_id" integer`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD "module_id" integer`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "admin_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "editor_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "viewer_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "none_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "created_at" SET NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "created_at" SET DEFAULT NOW()`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "updated_at" SET NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "updated_at" SET DEFAULT NOW()`,
    )
    await queryRunner.query(
      `ALTER TABLE "roles" ADD CONSTRAINT "FK_f9842b21d158bb60985c03a9813" FOREIGN KEY ("department_id") REFERENCES "departments"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
    )
    await queryRunner.query(
      `ALTER TABLE "roles" ADD CONSTRAINT "FK_2bbb1454cd05d635b3f50de3d37" FOREIGN KEY ("business_vertical_id") REFERENCES "business_verticals"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD CONSTRAINT "FK_2e0c5c1b40a4137a80930b3b65e" FOREIGN KEY ("module_id") REFERENCES "modules"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
    )
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP CONSTRAINT "FK_2e0c5c1b40a4137a80930b3b65e"`,
    )
    await queryRunner.query(
      `ALTER TABLE "roles" DROP CONSTRAINT "FK_2bbb1454cd05d635b3f50de3d37"`,
    )
    await queryRunner.query(
      `ALTER TABLE "roles" DROP CONSTRAINT "FK_f9842b21d158bb60985c03a9813"`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "updated_at" SET DEFAULT now()`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "updated_at" DROP NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "created_at" SET DEFAULT now()`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "created_at" DROP NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" DROP COLUMN "none_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" DROP COLUMN "viewer_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" DROP COLUMN "editor_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" DROP COLUMN "admin_access"`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" DROP COLUMN "module_id"`,
    )
    await queryRunner.query(
      `ALTER TABLE "roles" DROP COLUMN "business_vertical_id"`,
    )
    await queryRunner.query(`ALTER TABLE "roles" DROP COLUMN "department_id"`)

    // Step-by-step add slug column back safely
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "slug" character varying DEFAULT 'default-slug'`,
    )
    await queryRunner.query(
      `UPDATE "permissions" SET "slug" = 'default-slug' WHERE "slug" IS NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "slug" SET NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ALTER COLUMN "slug" DROP DEFAULT`,
    )

    await queryRunner.query(
      `ALTER TABLE "permissions" ADD CONSTRAINT "UQ_d090ad82a0e97ce764c06c7b312" UNIQUE ("slug")`,
    )
    await queryRunner.query(
      `ALTER TABLE "permissions" ADD "name" character varying NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD "none_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD "viewer_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD "editor_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(
      `ALTER TABLE "role_permissions" ADD "admin_access" boolean NOT NULL DEFAULT false`,
    )
    await queryRunner.query(`DROP TABLE "modules"`)
  }
}
