<?php
// ---------------------------------------------------------------------
// actualizarml.php
// ---------------------------------------------------------------------
require_once 'config/db.php';

/**
 * Obtiene el user_id y access_token más reciente de la tabla tb_tokens
 */
function getAccessTokenAndUserId($conn)
{
    $stmt = $conn->prepare("SELECT user_id, access_token FROM tb_tokens ORDER BY updated_at DESC LIMIT 1");
    $stmt->execute();
    $stmt->bind_result($user_id, $access_token);
    $stmt->fetch();
    $stmt->close();
    return ['user_id' => $user_id, 'access_token' => $access_token];
}

/**
 * Llama a la API de Mercado Libre (GET, PUT, etc.) usando file_get_contents con contexto HTTP,
 * pero solo envía "Content-Type: application/json" si NO es GET.
 */
function callMLApi($url, $method = 'GET', $data = null)
{
    $method = strtoupper($method);
    $headers = [];
    if ($method !== 'GET') {
        $headers[] = "Content-Type: application/json\r\n";
    }

    $options = [
        'http' => [
            'method'  => $method,
            'header'  => implode("", $headers),
        ]
    ];

    if ($data !== null) {
        $options['http']['content'] = json_encode($data);
    }

    $context = stream_context_create($options);
    $response = @file_get_contents($url, false, $context);

    if ($response === false) {
        $error = error_get_last();
        return [
            'success' => false,
            'error'   => 'HTTP error: ' . $error['message'],
            'data'    => null
        ];
    }

    $decoded = json_decode($response, true);
    if (isset($decoded['error'])) {
        return [
            'success' => false,
            'error'   => "API error: {$decoded['error']} - " . ($decoded['message'] ?? ''),
            'data'    => $decoded
        ];
    }

    return [
        'success' => true,
        'error'   => null,
        'data'    => $decoded
    ];
}

/**
 * Actualiza el 'status' (active/paused) de un ítem en Mercado Libre.
 */
function updateItemStatus($productId, $newStatus, $accessToken)
{
    $url = "https://api.mercadolibre.com/items/$productId?access_token=$accessToken";
    $data = ["status" => $newStatus];

    $resp = callMLApi($url, 'PUT', $data);
    if (!$resp['success']) {
        echo "❌ Error al cambiar estado de item $productId a '$newStatus': " . $resp['error'] . "\n";
        return false;
    } else {
        echo "✅ Estado de item $productId actualizado a '$newStatus'.\n";
        return true;
    }
}

/**
 * Consulta la vista para ver si se requiere que el ítem esté activo/pausado y lo compara con su estado real.
 * Devuelve un array con la información de cada producto:
 * [
 *   [ "product_id" => "...", "EstadoPagina" => X, "EstadoML" => X ],
 *   ...
 * ]
 */
function getEstadoPaginaVsML($conn)
{
    // Este SELECT agrupa por product_id y status (EstadoML), y saca la min(EstadoVariacion)
    // Asegúrate de que los nombres coincidan exactamente con tu vista/columnas
    $sql = "
        SELECT 
            vw_actualizaciones_ml.product_id,
            MIN(vw_actualizaciones_ml.EstadoVariacion) AS EstadoPagina,
            vw_actualizaciones_ml.status AS EstadoML
        FROM vw_actualizaciones_ml
        GROUP BY 
            vw_actualizaciones_ml.product_id,
            vw_actualizaciones_ml.status
    ";

    $result = $conn->query($sql);
    if (!$result) {
        die("Error al obtener estados: " . $conn->error);
    }

    $states = [];
    while ($row = $result->fetch_assoc()) {
        $states[] = $row;
    }

    return $states;
}

/**
 * Obtiene los productos (y/o variaciones) que deben actualizarse
 */
function getUpdates($conn)
{
    // Ajusta la consulta según tu vista/tabla
    $sql = "SELECT product_id, variant_id, StockML, PrecioMLReal
            FROM vw_actualizaciones_ml
            WHERE Cambiar = 1";

    $result = $conn->query($sql);
    if (!$result) {
        die("Error al obtener actualizaciones: " . $conn->error);
    }

    $updates = [];
    while ($row = $result->fetch_assoc()) {
        $updates[] = $row;
    }

    return $updates;
}

// ---------------------------------------------------------------------
// PROCESO PRINCIPAL
// ---------------------------------------------------------------------

if ($conn->connect_error) {
    die("Error de conexión a la BD: " . $conn->connect_error);
}

$credentials = getAccessTokenAndUserId($conn);
$accessToken = $credentials['access_token'];

/**
 * 1) Comparar EstadoPagina vs EstadoML y actualizar la publicación si difieren
 */
$states = getEstadoPaginaVsML($conn);

foreach ($states as $st) {
    $productId = $st['product_id'];
    $estadoPag = (int)$st['EstadoPagina']; // 1 => debe estar activo; !=1 => pausado
    $estadoML  = (int)$st['EstadoML'];     // 1 => está activo; 0 => está pausado

    // si 'EstadoPagina=1' => "active", si no => "paused"
    $desiredStatus = ($estadoPag === 1) ? "active" : "paused";
    // si 'EstadoML=1' => "active", si no => "paused"
    $currentStatus = ($estadoML === 1) ? "active" : "paused";

    // Si difieren, actualizamos el status en ML
    if ($desiredStatus !== $currentStatus) {
        updateItemStatus($productId, $desiredStatus, $accessToken);
    }
}

/**
 * 2) Luego de ajustar los estados (active/paused) según se requiera,
 *    procedemos a actualizar precio/stock (variaciones o ítem simple).
 */
$updates = getUpdates($conn);

if (empty($updates)) {
    echo "🔍 No hay productos o variaciones para actualizar.\n";
    $conn->close();
    exit;
}

// Agrupar las filas por product_id
$groupedItems = [];
foreach ($updates as $row) {
    $pid = $row['product_id'];

    if (!isset($groupedItems[$pid])) {
        $groupedItems[$pid] = [];
    }

    $groupedItems[$pid][] = [
        'variant_id' => $row['variant_id'],
        'stock'      => (int)$row['StockML'],
        'price'      => (float)$row['PrecioMLReal']
    ];
}

echo "🔄 Iniciando actualización de " . count($updates) . " registros en Mercado Libre...\n";

// Recorremos cada product_id para actualizar
foreach ($groupedItems as $productId => $variationsInfo) {
    // Ver cuántas filas tienen variant_id vacío
    $onlyEmptyVariants = array_filter($variationsInfo, fn($v) => empty($v['variant_id']));

    // CASO A: Todas las filas sin variant_id => ítem sin variaciones
    if (count($onlyEmptyVariants) === count($variationsInfo)) {
        $info = $variationsInfo[0];

        $url = "https://api.mercadolibre.com/items/$productId?access_token=$accessToken";
        $data = [
            "available_quantity" => $info['stock'],
            "price" => $info['price']
        ];

        $resp = callMLApi($url, 'PUT', $data);
        if (!$resp['success']) {
            echo "❌ Error al actualizar item $productId (sin variaciones): " . $resp['error'] . "\n";
        } else {
            echo "✅ Item $productId actualizado [stock={$info['stock']}, price={$info['price']}]\n";
        }
    } else {
        // CASO B: El ítem sí tiene variaciones
        // 1) Obtenemos el ítem completo (incluyendo variations)
        $getUrl = "https://api.mercadolibre.com/items/$productId?access_token=$accessToken";
        $getResp = callMLApi($getUrl, 'GET');

        if (!$getResp['success']) {
            echo "❌ Error al obtener item $productId: " . $getResp['error'] . "\n";
            continue;
        }

        $itemData = $getResp['data'];
        if (!isset($itemData['variations'])) {
            // No hay 'variations' => quizá es un ítem simple
            $info = $variationsInfo[0];
            $url = "https://api.mercadolibre.com/items/$productId?access_token=$accessToken";
            $data = [
                "available_quantity" => $info['stock'],
                "price" => $info['price']
            ];

            $putResp = callMLApi($url, 'PUT', $data);
            if (!$putResp['success']) {
                echo "❌ Error al actualizar item $productId: " . $putResp['error'] . "\n";
            } else {
                echo "✅ Item $productId (sin variations) actualizado.\n";
            }
            continue;
        }

        // Array de variaciones existentes
        $currentVariations = $itemData['variations'];

        // 2) Actualizamos solo las que están en $variationsInfo
        foreach ($variationsInfo as $vInfo) {
            $vid  = $vInfo['variant_id'];
            $newQ = $vInfo['stock'];
            $newP = $vInfo['price'];

            // Buscar esa variación en currentVariations
            $found = false;
            foreach ($currentVariations as &$cv) {
                if ((string)$cv['id'] === (string)$vid) {
                    // Actualizamos los valores
                    $cv['available_quantity'] = $newQ;
                    $cv['price'] = $newP;
                    $found = true;
                    break;
                }
            }
            unset($cv);

            if (!$found) {
                echo "⚠️ Advertencia: No se encontró la variación $vid en $productId. (No se actualizará)\n";
            }
        }

        // 3) Construir nuevo array de variaciones con solo los campos permitidos
        $newVariations = [];
        foreach ($currentVariations as $cv) {
            $newVariations[] = [
                "id" => $cv["id"],
                "price" => $cv["price"],
                "available_quantity" => $cv["available_quantity"]
            ];
        }

        // 4) Enviamos el array reconstruido de variaciones
        $putUrl = "https://api.mercadolibre.com/items/$productId?access_token=$accessToken";
        $body = [
            "variations" => $newVariations
        ];

        $putResponse = callMLApi($putUrl, 'PUT', $body);
        if (!$putResponse['success']) {
            echo "❌ Error al actualizar item $productId (con variaciones): " . $putResponse['error'] . "\n";
        } else {
            echo "✅ Item $productId actualizado con sus variaciones.\n";
        }
    }
}

echo "✅ Proceso de actualización finalizado.\n";
$conn->close();
