import { MigrationInterface, QueryRunner } from "typeorm";

export class ModifyRolesAndPermissions1751888636542 implements MigrationInterface {
    name = 'ModifyRolesAndPermissions1751888636542'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`CREATE TABLE \`sub_permission\` (\`id\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, \`display_name\` varchar(150) NOT NULL, \`description\` text NULL, \`permission_type\` enum ('super_admin', 'admin', 'user', 'client') NOT NULL DEFAULT 'user', \`is_active\` tinyint NOT NULL DEFAULT 1, \`is_system_permission\` tinyint NOT NULL DEFAULT 0, \`is_client_permission\` tinyint NOT NULL DEFAULT 0, \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`deleted_at\` datetime(6) NULL, \`permission_id\` varchar(255) NOT NULL, UNIQUE INDEX \`idx_sub_permission_name\` (\`name\`), UNIQUE INDEX \`IDX_a20bcb1605e70aca6edae0f8d2\` (\`name\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`permission\` (\`id\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, \`display_name\` varchar(150) NOT NULL, \`description\` text NULL, \`permission_type\` enum ('super_admin', 'admin', 'user', 'client') NOT NULL DEFAULT 'user', \`is_active\` tinyint NOT NULL DEFAULT 1, \`is_system_permission\` tinyint NOT NULL DEFAULT 0, \`is_client_permission\` tinyint NOT NULL DEFAULT 0, \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), UNIQUE INDEX \`IDX_240853a0c3353c25fb12434ad3\` (\`name\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`role_permission_state\` (\`id\` varchar(36) NOT NULL, \`role_id\` varchar(255) NOT NULL, \`permission_id\` varchar(255) NULL, \`sub_permission_id\` varchar(255) NULL, \`permission_state\` enum ('inherit', 'allow', 'deny') NOT NULL DEFAULT 'allow', \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`role\` (\`id\` varchar(36) NOT NULL, \`name\` varchar(150) NOT NULL, \`role_type\` enum ('client_role', 'admin_role', 'custom_role') NOT NULL, \`is_custom\` tinyint NOT NULL DEFAULT 0, \`priority\` int NOT NULL DEFAULT '1', \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`client_id\` varchar(36) NULL, PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`clients\` (\`id\` varchar(36) NOT NULL, \`first_name\` varchar(60) NOT NULL, \`last_name\` varchar(60) NOT NULL, \`email\` varchar(100) NOT NULL, \`plan\` enum ('free', 'basic', 'premium', 'enterprise') NOT NULL DEFAULT 'free', \`max_users\` int NOT NULL DEFAULT '5', \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), UNIQUE INDEX \`IDX_b48860677afe62cd96e1265948\` (\`email\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`user_permission_override\` (\`id\` varchar(36) NOT NULL, \`user_id\` int NOT NULL, \`permission_id\` varchar(255) NULL, \`sub_permission_id\` varchar(255) NULL, \`permission_state\` enum ('inherit', 'allow', 'deny') NOT NULL DEFAULT 'inherit', \`client_id\` varchar(255) NULL, \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`CREATE TABLE \`user_roles\` (\`user_id\` int NOT NULL, \`role_id\` varchar(36) NOT NULL, INDEX \`IDX_87b8888186ca9769c960e92687\` (\`user_id\`), INDEX \`IDX_b23c65e50a758245a33ee35fda\` (\`role_id\`), PRIMARY KEY (\`user_id\`, \`role_id\`)) ENGINE=InnoDB`);
        await queryRunner.query(`ALTER TABLE \`users\` ADD \`client_id\` varchar(255) NULL`);
        await queryRunner.query(`ALTER TABLE \`users\` ADD \`linked_client_id\` varchar(255) NULL`);
        await queryRunner.query(`ALTER TABLE \`users\` ADD \`status\` enum ('active', 'inactive', 'pending') NOT NULL DEFAULT 'active'`);
        await queryRunner.query(`ALTER TABLE \`comments\` CHANGE \`role\` \`role\` enum ('super_admin', 'admin', 'user', 'client') NOT NULL`);
        await queryRunner.query(`ALTER TABLE \`users\` CHANGE \`role\` \`role\` enum ('super_admin', 'admin', 'user', 'client') NOT NULL DEFAULT 'user'`);
        await queryRunner.query(`ALTER TABLE \`sub_permission\` ADD CONSTRAINT \`FK_a35485110e37f582e9d4792bb1a\` FOREIGN KEY (\`permission_id\`) REFERENCES \`permission\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` ADD CONSTRAINT \`FK_34fafddfe47cf72d6b370be8fbd\` FOREIGN KEY (\`role_id\`) REFERENCES \`role\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` ADD CONSTRAINT \`FK_4632c1bb7cc2441681a95cf72d7\` FOREIGN KEY (\`permission_id\`) REFERENCES \`permission\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` ADD CONSTRAINT \`FK_16a04b59a8aa056c789fb72d94a\` FOREIGN KEY (\`sub_permission_id\`) REFERENCES \`sub_permission\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`role\` ADD CONSTRAINT \`FK_7ec8b66943c6444ee369282c922\` FOREIGN KEY (\`client_id\`) REFERENCES \`clients\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` ADD CONSTRAINT \`FK_8d97ae51a17ad07df17a2c8e062\` FOREIGN KEY (\`user_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` ADD CONSTRAINT \`FK_da829fa2e592d3202422745ab06\` FOREIGN KEY (\`permission_id\`) REFERENCES \`permission\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` ADD CONSTRAINT \`FK_69e4e27d2d72b230a6d086ac591\` FOREIGN KEY (\`sub_permission_id\`) REFERENCES \`sub_permission\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` ADD CONSTRAINT \`FK_f39155ce90b547d4b3ee4b06afa\` FOREIGN KEY (\`client_id\`) REFERENCES \`clients\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`users\` ADD CONSTRAINT \`FK_0d1e90d75674c54f8660c4ed446\` FOREIGN KEY (\`client_id\`) REFERENCES \`clients\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`users\` ADD CONSTRAINT \`FK_6950d0de3f9888b4a2325ff2991\` FOREIGN KEY (\`linked_client_id\`) REFERENCES \`clients\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE \`user_roles\` ADD CONSTRAINT \`FK_87b8888186ca9769c960e926870\` FOREIGN KEY (\`user_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE`);
        await queryRunner.query(`ALTER TABLE \`user_roles\` ADD CONSTRAINT \`FK_b23c65e50a758245a33ee35fda1\` FOREIGN KEY (\`role_id\`) REFERENCES \`role\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE \`user_roles\` DROP FOREIGN KEY \`FK_b23c65e50a758245a33ee35fda1\``);
        await queryRunner.query(`ALTER TABLE \`user_roles\` DROP FOREIGN KEY \`FK_87b8888186ca9769c960e926870\``);
        await queryRunner.query(`ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_6950d0de3f9888b4a2325ff2991\``);
        await queryRunner.query(`ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_0d1e90d75674c54f8660c4ed446\``);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` DROP FOREIGN KEY \`FK_f39155ce90b547d4b3ee4b06afa\``);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` DROP FOREIGN KEY \`FK_69e4e27d2d72b230a6d086ac591\``);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` DROP FOREIGN KEY \`FK_da829fa2e592d3202422745ab06\``);
        await queryRunner.query(`ALTER TABLE \`user_permission_override\` DROP FOREIGN KEY \`FK_8d97ae51a17ad07df17a2c8e062\``);
        await queryRunner.query(`ALTER TABLE \`role\` DROP FOREIGN KEY \`FK_7ec8b66943c6444ee369282c922\``);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` DROP FOREIGN KEY \`FK_16a04b59a8aa056c789fb72d94a\``);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` DROP FOREIGN KEY \`FK_4632c1bb7cc2441681a95cf72d7\``);
        await queryRunner.query(`ALTER TABLE \`role_permission_state\` DROP FOREIGN KEY \`FK_34fafddfe47cf72d6b370be8fbd\``);
        await queryRunner.query(`ALTER TABLE \`sub_permission\` DROP FOREIGN KEY \`FK_a35485110e37f582e9d4792bb1a\``);
        await queryRunner.query(`ALTER TABLE \`users\` CHANGE \`role\` \`role\` enum ('super_admin', 'admin', 'user', 'audience') NOT NULL DEFAULT 'user'`);
        await queryRunner.query(`ALTER TABLE \`comments\` CHANGE \`role\` \`role\` enum ('super_admin', 'admin', 'user', 'audience') NOT NULL`);
        await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`status\``);
        await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`linked_client_id\``);
        await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`client_id\``);
        await queryRunner.query(`DROP INDEX \`IDX_b23c65e50a758245a33ee35fda\` ON \`user_roles\``);
        await queryRunner.query(`DROP INDEX \`IDX_87b8888186ca9769c960e92687\` ON \`user_roles\``);
        await queryRunner.query(`DROP TABLE \`user_roles\``);
        await queryRunner.query(`DROP TABLE \`user_permission_override\``);
        await queryRunner.query(`DROP INDEX \`IDX_b48860677afe62cd96e1265948\` ON \`clients\``);
        await queryRunner.query(`DROP TABLE \`clients\``);
        await queryRunner.query(`DROP TABLE \`role\``);
        await queryRunner.query(`DROP TABLE \`role_permission_state\``);
        await queryRunner.query(`DROP INDEX \`IDX_240853a0c3353c25fb12434ad3\` ON \`permission\``);
        await queryRunner.query(`DROP TABLE \`permission\``);
        await queryRunner.query(`DROP INDEX \`IDX_a20bcb1605e70aca6edae0f8d2\` ON \`sub_permission\``);
        await queryRunner.query(`DROP INDEX \`idx_sub_permission_name\` ON \`sub_permission\``);
        await queryRunner.query(`DROP TABLE \`sub_permission\``);
    }

}
