import { MigrationInterface, QueryRunner } from "typeorm";

export class AddTrigramIndexes1749112156541 implements MigrationInterface {

    public async up(queryRunner: QueryRunner): Promise<void> {

        // Ensure the pg_trgm extension is available for trigram indexing
        await queryRunner.query(`CREATE EXTENSION IF NOT EXISTS pg_trgm`);

        // Create GIN trigram indexes for optimized pattern matching
        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_users_first_name_trgm 
          ON users USING gin (first_name gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_users_last_name_trgm 
          ON users USING gin (last_name gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_categories_title_trgm 
          ON categories USING gin (title gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_keywords_keyword_trgm 
          ON keywords USING gin (keyword gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_social_medias_username_trgm 
          ON social_medias USING gin (social_user_name gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_social_medias_displayname_trgm 
          ON social_medias USING gin (display_name gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_social_medias_cityname_trgm 
          ON social_medias USING gin (city_name gin_trgm_ops);
        `);

        await queryRunner.query(`
          CREATE INDEX IF NOT EXISTS idx_social_medias_description_trgm 
          ON social_medias USING gin (description gin_trgm_ops);
        `);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP INDEX IF EXISTS idx_social_medias_description_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_social_medias_cityname_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_social_medias_displayname_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_social_medias_username_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_keywords_keyword_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_categories_title_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_users_last_name_trgm`);
        await queryRunner.query(`DROP INDEX IF EXISTS idx_users_first_name_trgm`);
    }

}
