#!/usr/bin/env php
<?php
/**
 * Migration Application Script
 * Applies the reviews system migration to the database
 * 
 * Usage: php apply_migration.php
 */

// Определяем пути
define('ROOT_PATH', dirname(__DIR__, 2));
define('MIGRATION_FILE', __DIR__ . '/add_reviews_system.sql');

// Подключаем автозагрузчик
require_once ROOT_PATH . '/app/Core/Database.php';

use App\Core\Database;

echo "\n";
echo "========================================\n";
echo "  Применение миграции: Reviews System  \n";
echo "========================================\n\n";

// Проверяем наличие файла миграции
if (!file_exists(MIGRATION_FILE)) {
    echo "✗ ОШИБКА: Файл миграции не найден: " . MIGRATION_FILE . "\n\n";
    exit(1);
}

echo "→ Файл миграции найден: " . basename(MIGRATION_FILE) . "\n";

// Читаем SQL из файла
$sql = file_get_contents(MIGRATION_FILE);
if (empty($sql)) {
    echo "✗ ОШИБКА: Файл миграции пуст\n\n";
    exit(1);
}

echo "→ SQL загружен, размер: " . strlen($sql) . " байт\n";

// Подключаемся к базе данных
try {
    echo "→ Подключение к базе данных...\n";
    $db = Database::getInstance();
    $connection = $db->getConnection();
    echo "✓ Подключение успешно\n";
} catch (Exception $e) {
    echo "✗ ОШИБКА подключения: " . $e->getMessage() . "\n\n";
    exit(1);
}

// Выполняем миграцию
// Не используем транзакцию, т.к. SQL файл содержит IF NOT EXISTS для идемпотентности
try {
    echo "\n→ Выполнение миграции...\n";
    
    // Выполняем весь SQL файл за один раз
    // PostgreSQL обработает все команды, включая DO блоки и CREATE OR REPLACE
    $connection->exec($sql);
    
    echo "✓ Миграция успешно выполнена\n";
    
} catch (Exception $e) {
    // Проверяем, не является ли это ошибкой "уже существует"
    $errorMsg = $e->getMessage();
    
    if (strpos($errorMsg, 'already exists') !== false ||
        strpos($errorMsg, 'does not exist') !== false) {
        echo "⚠ Часть объектов уже существует (это нормально для повторного запуска)\n";
        echo "✓ Миграция продолжена\n";
    } else {
        echo "✗ ОШИБКА выполнения миграции:\n";
        echo $errorMsg . "\n\n";
        echo "💡 Попробуйте выполнить SQL вручную через psql или GUI клиент\n\n";
        exit(1);
    }
}

// Проверяем результат
echo "\n→ Проверка результата...\n";

try {
    // Проверяем таблицу reviews
    $result = $connection->query("SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'reviews'");
    $exists = $result->fetchColumn() > 0;
    
    if ($exists) {
        echo "  ✓ Таблица 'reviews' создана\n";
        
        // Получаем структуру таблицы
        $columns = $connection->query("SELECT column_name FROM information_schema.columns WHERE table_name = 'reviews'")->fetchAll(PDO::FETCH_COLUMN);
        echo "    Колонки: " . implode(', ', $columns) . "\n";
    } else {
        echo "  ✗ Таблица 'reviews' не найдена\n";
    }
    
    // Проверяем новые поля в products
    $result = $connection->query("SELECT column_name FROM information_schema.columns WHERE table_name = 'products' AND column_name IN ('rating', 'review_count')");
    $productColumns = $result->fetchAll(PDO::FETCH_COLUMN);
    
    if (in_array('rating', $productColumns)) {
        echo "  ✓ Поле 'rating' добавлено в таблицу 'products'\n";
    }
    if (in_array('review_count', $productColumns)) {
        echo "  ✓ Поле 'review_count' добавлено в таблицу 'products'\n";
    }
    
    // Проверяем функции
    $result = $connection->query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'update_product_rating'");
    $functionExists = $result->fetchColumn() > 0;
    
    if ($functionExists) {
        echo "  ✓ Функция 'update_product_rating' создана\n";
    }
    
    // Проверяем триггеры
    $result = $connection->query("SELECT COUNT(*) FROM pg_trigger WHERE tgname LIKE '%review%'");
    $triggerCount = $result->fetchColumn();
    
    if ($triggerCount > 0) {
        echo "  ✓ Триггеры созданы (количество: $triggerCount)\n";
    }
    
} catch (Exception $e) {
    echo "  ⚠ Не удалось проверить результат: " . $e->getMessage() . "\n";
}

echo "\n========================================\n";
echo "  ✓ МИГРАЦИЯ УСПЕШНО ПРИМЕНЕНА!         \n";
echo "========================================\n\n";

echo "Что дальше:\n";
echo "1. Откройте любую страницу товара в каталоге\n";
echo "2. Войдите как обычный пользователь (не админ)\n";
echo "3. Оставьте тестовый отзыв с оценкой\n";
echo "4. Проверьте, что рейтинг обновился\n\n";

echo "API endpoints:\n";
echo "- POST /reviews - создание отзыва\n";
echo "- POST /reviews/{id} - обновление отзыва\n";
echo "- POST /reviews/{id}/delete - удаление отзыва\n";
echo "- GET /reviews/product/{id} - получение отзывов\n\n";

exit(0);

