/home/ivoiecob/www/wp-content/plugins/wp-social-reviews/database/Migrations/ReviewsMigrator.php
<?php

namespace WPSocialReviews\Database\Migrations;

class ReviewsMigrator
{
    static $tableName = 'wpsr_reviews';

    public static function migrate()
    {
        global $wpdb;
        $charsetCollate = $wpdb->get_charset_collate();
        $table = $wpdb->prefix . static::$tableName;

        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Required for migration to check table existence
        if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to create table
            $sql = "CREATE TABLE $table (
                `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,		
				`platform_name` varchar(255),
				`source_id` varchar(255),
				`review_id` varchar(255),
				`category` varchar(255),
				`review_title` varchar(255),
				`reviewer_name` varchar(255),
				`reviewer_url` varchar(255),
				`reviewer_img` TEXT NULL,
				`reviewer_text` LONGTEXT NULL,
				`review_time` timestamp NULL,
				`rating` int(11),
				`review_approved` int(11) DEFAULT 1,
				`recommendation_type` varchar(255),
				`fields` LONGTEXT NULL,
                `created_at` TIMESTAMP NULL,
                `updated_at` TIMESTAMP NULL,
                INDEX `idx_platform_name` (`platform_name`),
                INDEX `idx_review_id` (`review_id`),
                INDEX `idx_source_id` (`source_id`),
                INDEX `idx_review_approved` (`review_approved`),
                INDEX `idx_rating` (`rating`)
            ) $charsetCollate;";
            dbDelta($sql);
        } else {
            static::alterTable($table);
        }
    }

    public static function alterTable($table)
    {
        global $wpdb;
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Required for migration to check existing columns
        $existing_columns = $wpdb->get_col($wpdb->prepare("DESC %i", $table), 0);
        if(!in_array('category', $existing_columns)) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to add missing column
            $wpdb->query($wpdb->prepare('ALTER TABLE %i ADD %i varchar(255) NULL AFTER %i', $table, 'category', 'source_id'));
        }

        if(!in_array('review_approved', $existing_columns)) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to add missing column
            $wpdb->query($wpdb->prepare('ALTER TABLE %i ADD %i int(11) DEFAULT 1 AFTER %i', $table, 'review_approved', 'recommendation_type'));
        }

        if(!in_array('review_id', $existing_columns)) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to add missing column
            $wpdb->query($wpdb->prepare('ALTER TABLE %i ADD %i varchar(255) NULL AFTER %i', $table, 'review_id', 'source_id'));
        }

        if(!in_array('fields', $existing_columns)) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to add missing column
            $wpdb->query($wpdb->prepare('ALTER TABLE %i ADD %i LONGTEXT NULL AFTER %i', $table, 'fields', 'recommendation_type'));
        }

        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to modify column
        $wpdb->query($wpdb->prepare("ALTER TABLE %i MODIFY COLUMN %i TEXT NULL", $table, 'reviewer_img'));

        static::addMissingIndexes($table);
    }

    public static function addMissingIndexes($table)
    {
        global $wpdb;

        // Safely escape table name
        $table = esc_sql($table);

        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Required for migration to check existing indexes
        $existing_indexes = $wpdb->get_results($wpdb->prepare("SHOW INDEX FROM %i", $table));
        $existing_index_names = [];

        foreach ($existing_indexes as $index) {
            $existing_index_names[] = $index->Key_name;
        }

        $indexes = [
            'idx_platform_name' => 'platform_name',
            'idx_review_id'     => 'review_id',
            'idx_source_id'     => 'source_id',
            'idx_review_approved'     => 'review_approved',
            'idx_rating'        => 'rating',
        ];

        foreach ($indexes as $index_name => $column_name) {
            if (!in_array($index_name, $existing_index_names)) {
                // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- Required for migration to add missing indexes
                $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD INDEX %i (%i)", $table, $index_name, $column_name));
            }
        }
    }
}