<?php
// Incluir la configuración de la base de datos
require_once 'config/db.php';

/**
 * Función helper para obtener datos desde una URL usando cURL
 * Retorna un array asociativo decodificado de JSON o null en caso de error
 */
function fetchData($url)
{
    // Inicializa cURL
    $ch = curl_init($url);

    // Configura las opciones de cURL
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Desactiva verificación SSL si tu entorno lo requiere

    // Ejecuta la petición
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error    = curl_error($ch);

    curl_close($ch);

    // Verifica errores de conexión
    if ($response === false || $error) {
        echo "<p style='color:red;'>[ERROR] No se pudo conectar a la URL: $url<br>cURL error: $error</p>";
        return null;
    }

    // Verifica si la respuesta HTTP es correcta (200-299)
    if ($httpCode < 200 || $httpCode >= 300) {
        echo "<p style='color:red;'>[ERROR] Respuesta HTTP no exitosa ($httpCode) al acceder a: $url</p>";
        return null;
    }

    // Decodifica el JSON
    $data = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo "<p style='color:red;'>[ERROR] Error decodificando JSON de: $url<br>"
            . json_last_error_msg() . "</p>";
        return null;
    }

    return $data;
}

/**
 * Función para obtener categorías (nivel superior) y guardarlas
 */
function saveCategories($conn)
{
    echo "<p>Obteniendo categorías principales...</p>";
    $url = "https://api.mercadolibre.com/sites/MCO/categories";
    $categories = fetchData($url);

    if (!is_array($categories)) {
        echo "<p style='color:red;'>[ERROR] No se obtuvieron categorías.</p>";
        return;
    }

    foreach ($categories as $category) {
        // parent_id es null en el nivel más alto
        saveCategory($conn, $category, null);
    }
}

/**
 * Función recursiva para guardar categoría y sus subcategorías
 */
function saveCategory($conn, $category, $parent_id)
{
    // Inserta la categoría con ON DUPLICATE KEY UPDATE
    // Asegúrate de que en tu tabla tb_categories hayas definido
    // PRIMARY KEY (id) o al menos UNIQUE KEY en la columna 'id'.
    $stmt = $conn->prepare("
        INSERT INTO tb_categories (id, name, parent_id) 
        VALUES (?, ?, ?) 
        ON DUPLICATE KEY UPDATE name=VALUES(name), parent_id=VALUES(parent_id)
    ");
    $stmt->bind_param("sss", $category['id'], $category['name'], $parent_id);

    if (!$stmt->execute()) {
        echo "<p style='color:red;'>[ERROR] Al guardar la categoría {$category['id']}: "
            . $stmt->error . "</p>";
    }
    $stmt->close();

    // Obtener detalles de la categoría para recursividad
    $url = "https://api.mercadolibre.com/categories/{$category['id']}";
    $category_details = fetchData($url);

    // Verifica que haya datos de children_categories
    if (isset($category_details['children_categories']) && is_array($category_details['children_categories'])) {
        foreach ($category_details['children_categories'] as $child) {
            saveCategory($conn, $child, $category['id']);
        }
    }
}

/**
 * Función para obtener y guardar precios de publicación
 */
function saveListingPrices($conn)
{
    echo "<p>Obteniendo precios de publicación...</p>";
    $url = "https://api.mercadolibre.com/sites/MCO/listing_prices";
    $prices = fetchData($url);

    if (!is_array($prices)) {
        echo "<p style='color:red;'>[ERROR] No se obtuvieron precios de publicación.</p>";
        return;
    }

    // Prepara la consulta con ON DUPLICATE KEY UPDATE
    // Necesitas que en tu tabla tb_listing_prices tengas algo como:
    // PRIMARY KEY(listing_type_id, category_id)
    $stmt = $conn->prepare("
        INSERT INTO tb_listing_prices (listing_type_id, category_id, listing_price, currency_id)
        VALUES (?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE
            listing_price = VALUES(listing_price),
            currency_id   = VALUES(currency_id)
    ");

    foreach ($prices as $price) {
        // Valida que existan las claves que esperas
        if (!isset($price['id'], $price['category_id'], $price['price'], $price['currency_id'])) {
            echo "<p style='color:red;'>[ERROR] Faltan datos en el objeto de 'listing_prices': "
                . print_r($price, true) . "</p>";
            continue;
        }

        $stmt->bind_param(
            "ssds",
            $price['id'],          // listing_type_id
            $price['category_id'], // category_id
            $price['price'],       // listing_price
            $price['currency_id']  // currency_id
        );
        if (!$stmt->execute()) {
            echo "<p style='color:red;'>[ERROR] Al guardar precios de publicación ({$price['id']}): "
                . $stmt->error . "</p>";
        }
    }
    $stmt->close();
}

/**
 * Función para obtener y guardar comisiones
 */
function saveCommissions($conn)
{
    echo "<p>Obteniendo comisiones...</p>";
    $url = "https://api.mercadolibre.com/sites/MCO/listing_prices";
    $prices = fetchData($url);

    if (!is_array($prices)) {
        echo "<p style='color:red;'>[ERROR] No se obtuvieron datos de comisiones.</p>";
        return;
    }

    // Prepara la consulta con ON DUPLICATE KEY UPDATE
    // Necesitas que en tu tabla tb_commissions tengas algo como:
    // PRIMARY KEY(category_id, sale_fee_mode)
    $stmt = $conn->prepare("
        INSERT INTO tb_commissions (category_id, sale_fee_mode, sale_fee_amount, currency_id)
        VALUES (?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE
            sale_fee_amount = VALUES(sale_fee_amount),
            currency_id     = VALUES(currency_id)
    ");

    foreach ($prices as $price) {
        // Verifica si existe sale_fee
        if (isset($price['sale_fee']) && is_array($price['sale_fee'])) {
            // Valida que tenga 'mode' y 'amount'
            if (!isset($price['sale_fee']['mode'], $price['sale_fee']['amount'])) {
                echo "<p style='color:red;'>[ERROR] Faltan datos en 'sale_fee': "
                    . print_r($price['sale_fee'], true) . "</p>";
                continue;
            }

            $stmt->bind_param(
                "ssds",
                $price['category_id'],
                $price['sale_fee']['mode'],
                $price['sale_fee']['amount'],
                $price['currency_id']
            );
            if (!$stmt->execute()) {
                echo "<p style='color:red;'>[ERROR] Al guardar comisión (cat: {$price['category_id']}): "
                    . $stmt->error . "</p>";
            }
        }
    }
    $stmt->close();
}

// ----------------------------------------------------------------------------------
// Llamadas a las funciones
// ----------------------------------------------------------------------------------
echo "<h3>Iniciando proceso de guardado de datos Mercado Libre...</h3>";

saveCategories($conn);
saveListingPrices($conn);
saveCommissions($conn);

echo "<p><strong>Proceso finalizado. Datos guardados correctamente (si no hubo errores arriba).</strong></p>";

$conn->close();
