<?php
declare(strict_types=1);

use Celena\Core\Database\Connection;
use Celena\Core\Database\Schema;

/**
 * Вариации товара: цвет/размер/материал с собственной ценой и остатком.
 *
 * Хранение — JSON прямо в shop_products:
 *   - options: [{ "name": "Цвет", "values": ["Красный","Синий"] }, …]
 *   - variations: [{ "id": 1, "values": ["Красный","S"], "price": 1200,
 *                    "old_price": 0, "stock": 10, "sku": "RED-S", "image": "" }, …]
 *
 * В shop_order_items добавлены variation_id и variation_label
 * (например, «Цвет: Красный · Размер: S»), чтобы заказ хранил снимок
 * выбранной вариации даже после её удаления у товара.
 */
return function (Schema $schema, Connection $conn): void {
    $driver = $conn->driver()->name();

    /** @return bool true если колонка уже есть */
    $hasColumn = function (string $table, string $column) use ($conn, $driver): bool {
        $tbl = $conn->table($table);
        if ($driver === 'pgsql') {
            $row = $conn->run(
                "SELECT 1 FROM information_schema.columns WHERE table_name = ? AND column_name = ? LIMIT 1",
                [$tbl, $column]
            )->fetch();
        } else {
            $row = $conn->run(
                "SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ? LIMIT 1",
                [$tbl, $column]
            )->fetch();
        }
        return $row !== false && $row !== null;
    };

    $jsonType = $driver === 'pgsql' ? 'JSONB' : 'JSON';

    $tbl = $conn->table_q('shop_products');
    if (!$hasColumn('shop_products', 'options')) {
        $col = $conn->quoteId('options');
        $conn->exec("ALTER TABLE $tbl ADD COLUMN $col $jsonType NULL");
    }
    if (!$hasColumn('shop_products', 'variations')) {
        $col = $conn->quoteId('variations');
        $conn->exec("ALTER TABLE $tbl ADD COLUMN $col $jsonType NULL");
    }

    $tblOi = $conn->table_q('shop_order_items');
    if (!$hasColumn('shop_order_items', 'variation_id')) {
        $col = $conn->quoteId('variation_id');
        $conn->exec("ALTER TABLE $tblOi ADD COLUMN $col INT NULL");
    }
    if (!$hasColumn('shop_order_items', 'variation_label')) {
        $col = $conn->quoteId('variation_label');
        $conn->exec("ALTER TABLE $tblOi ADD COLUMN $col VARCHAR(500) NULL");
    }
};
