import { MigrationInterface, QueryRunner } from "typeorm";

export class AddSlackEnabledSettings1774934146760 implements MigrationInterface {
    name = 'AddSlackEnabledSettings1774934146760'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE "builds" DROP CONSTRAINT "FK_builds_app"`);
        await queryRunner.query(`ALTER TABLE "apps" DROP CONSTRAINT "FK_apps_user"`);
        await queryRunner.query(`ALTER TABLE "api_keys" DROP CONSTRAINT "FK_api_keys_user"`);
        await queryRunner.query(`DROP INDEX "public"."UQ_builds_short_code"`);
        await queryRunner.query(`DROP INDEX "public"."IDX_apps_platform_bundle"`);
        await queryRunner.query(`DROP INDEX "public"."IDX_api_keys_user_id"`);
        await queryRunner.query(`DROP INDEX "public"."IDX_api_keys_key"`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_enabled" boolean`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_access_token" character varying`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_workspace_id" character varying`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_webhook_url" character varying`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_channel_id" character varying`);
        await queryRunner.query(`ALTER TABLE "users" ADD "slack_bot_user_id" character varying`);
        await queryRunner.query(`ALTER TABLE "platform_settings" ADD "slack_enabled" boolean NOT NULL DEFAULT false`);
        await queryRunner.query(`ALTER TABLE "builds" DROP CONSTRAINT "builds_short_code_key"`);
        await queryRunner.query(`ALTER TABLE "builds" DROP COLUMN "short_code"`);
        await queryRunner.query(`ALTER TABLE "builds" ADD "short_code" character varying(8)`);
        await queryRunner.query(`ALTER TABLE "builds" ADD CONSTRAINT "UQ_ccdca51c22b6368935b3a944756" UNIQUE ("short_code")`);
        await queryRunner.query(`ALTER TABLE "users" ADD CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3" UNIQUE ("email")`);
        await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "role" SET NOT NULL`);
        await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "is_active" SET NOT NULL`);
        await queryRunner.query(`ALTER TABLE "builds" ADD CONSTRAINT "FK_231c3800bafae63c236c8966233" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE "apps" ADD CONSTRAINT "FK_f941b1b6d148f527bfd4f20a1ca" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE "api_keys" ADD CONSTRAINT "FK_a3baee01d8408cd3c0f89a9a973" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE "api_keys" DROP CONSTRAINT "FK_a3baee01d8408cd3c0f89a9a973"`);
        await queryRunner.query(`ALTER TABLE "apps" DROP CONSTRAINT "FK_f941b1b6d148f527bfd4f20a1ca"`);
        await queryRunner.query(`ALTER TABLE "builds" DROP CONSTRAINT "FK_231c3800bafae63c236c8966233"`);
        await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "is_active" DROP NOT NULL`);
        await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "role" DROP NOT NULL`);
        await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3"`);
        await queryRunner.query(`ALTER TABLE "builds" DROP CONSTRAINT "UQ_ccdca51c22b6368935b3a944756"`);
        await queryRunner.query(`ALTER TABLE "builds" DROP COLUMN "short_code"`);
        await queryRunner.query(`ALTER TABLE "builds" ADD "short_code" character varying(12) NOT NULL`);
        await queryRunner.query(`ALTER TABLE "builds" ADD CONSTRAINT "builds_short_code_key" UNIQUE ("short_code")`);
        await queryRunner.query(`ALTER TABLE "platform_settings" DROP COLUMN "slack_enabled"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_bot_user_id"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_channel_id"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_webhook_url"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_workspace_id"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_access_token"`);
        await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "slack_enabled"`);
        await queryRunner.query(`CREATE INDEX "IDX_api_keys_key" ON "api_keys" ("key") `);
        await queryRunner.query(`CREATE INDEX "IDX_api_keys_user_id" ON "api_keys" ("user_id") `);
        await queryRunner.query(`CREATE UNIQUE INDEX "IDX_apps_platform_bundle" ON "apps" ("user_id", "platform", "bundle_or_package") `);
        await queryRunner.query(`CREATE UNIQUE INDEX "UQ_builds_short_code" ON "builds" ("short_code") `);
        await queryRunner.query(`ALTER TABLE "api_keys" ADD CONSTRAINT "FK_api_keys_user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE "apps" ADD CONSTRAINT "FK_apps_user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE "builds" ADD CONSTRAINT "FK_builds_app" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
    }

}
