<?php
// actualizarminmaxbulk.php
require __DIR__ . '/vendor/autoload.php';

use Automattic\WooCommerce\Client;
use Automattic\WooCommerce\HttpClient\HttpClientException;

/* --------------------------------------------------------------------------
 * 1. CONFIGURACIÓN BÁSICA
 * -------------------------------------------------------------------------- */

set_time_limit(0);
header('Content-Type: text/html; charset=UTF-8');
while (ob_get_level()) ob_end_clean();
ob_implicit_flush(true);

function js_log(string $msg)
{
    echo "<script>log('" . addslashes($msg) . "');</script>";
}
function js_prog(int $c, int $t)
{
    echo "<script>prog({$c}, {$t});</script>";
}

/* --------------------------------------------------------------------------
 * 2. SALIDA HTML INICIAL (LOG + PROGRESO)
 * -------------------------------------------------------------------------- */
echo '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Actualizar Min/Max Bulk WP</title></head><body>';
echo '<h1>Bulk: Actualización de Min/Max en Variantes</h1>';
echo '<progress id="progressBar" value="0" max="0" style="width:100%;height:20px;"></progress>';
echo '<pre id="log" style="background:#f0f0f0;padding:10px;font-family:monospace;"></pre>';
echo <<<JS
<script>
function log(t){document.getElementById('log').textContent+=t+"\\n";}
function prog(c,t){const b=document.getElementById('progressBar');b.max=t;b.value=c;}
</script>
JS;

/* --------------------------------------------------------------------------
 * 3. CONEXIÓN MYSQL
 * -------------------------------------------------------------------------- */
$mysqli = new mysqli('localhost', 'ndconsulta', 'Nitro2021', 'db_compranet');
if ($mysqli->connect_error) {
    die('Conexión fallida: ' . $mysqli->connect_error);
}

/* --------------------------------------------------------------------------
 * 4. CLIENTE WOOCOMMERCE
 * -------------------------------------------------------------------------- */
$wc = new Client(
    'https://compranet.com.co',
    'ck_910af40e780677e03593d388885a2e58b7c4fa43',
    'cs_2983cea05dbc631dc6236c61c79feb35a61666cf',
    [
        'wp_api'            => true,
        'version'           => 'wc/v3',
        'query_string_auth' => true,
        'timeout'           => 300,
        'connect_timeout'   => 30,
        'verify_ssl'        => false,
    ]
);

/* --------------------------------------------------------------------------
 * 5. OBTENER TODAS LAS VARIANTES A ACTUALIZAR
 * -------------------------------------------------------------------------- */
$sql = "
SELECT
    p.wp_id         AS wpIDProducto,
    v.wp_id         AS wpIDVariante,
    v.minVenta      AS minVenta,
    v.multiploVenta AS multiploVenta
FROM tb_productos_variantes v
JOIN tb_productos p ON p.id = v.idProducto
WHERE p.wp_id > 0
  AND v.wp_id > 0
  AND (v.minVenta > 1 OR v.multiploVenta > 1)
ORDER BY p.wp_id, v.wp_id
";
$res = $mysqli->query($sql);
if (!$res) {
    die('Error en la consulta: ' . $mysqli->error);
}

// Cargar en array y agrupar por producto
$groups = [];
while ($row = $res->fetch_assoc()) {
    $groups[$row['wpIDProducto']][] = $row;
}
$totalVariants = array_sum(array_map('count', $groups));
$processed     = 0;

js_log("Total de variantes a procesar: {$totalVariants}");
js_prog(0, $totalVariants);

/* --------------------------------------------------------------------------
 * 6. PROCESAR CADA PRODUCTO EN LOTES DE 100
 * -------------------------------------------------------------------------- */
foreach ($groups as $prod_id => $variants) {
    // separar en chunks de 100
    $chunks = array_chunk($variants, 100);
    foreach ($chunks as $chunk) {
        // construir payload de update
        $update_batch = [];
        foreach ($chunk as $v) {
            $update_batch[] = [
                'id'        => (int)$v['wpIDVariante'],
                'meta_data' => [
                    ['key' => 'min_quantity', 'value' => (int)$v['minVenta']],
                    ['key' => 'product_step',  'value' => (int)$v['multiploVenta']],
                ],
            ];
        }

        js_log("Producto {$prod_id}: enviando lote de " . count($chunk) . " variantes");
        try {
            // llamada bulk
            $resp = $wc->post("products/{$prod_id}/variations/batch", [
                'update' => $update_batch
            ]);
            // recorrer respuestas exitosas
            if (isset($resp->update) && is_array($resp->update)) {
                foreach ($resp->update as $updated) {
                    $processed++;
                    js_prog($processed, $totalVariants);
                    js_log("  → OK variante {$updated->id}");
                }
            } else {
                // si no viene detalle, incrementar manualmente
                foreach ($chunk as $_) {
                    $processed++;
                    js_prog($processed, $totalVariants);
                }
                js_log("  → Lote procesado (sin detalle en respuesta)");
            }
        } catch (HttpClientException $e) {
            // en caso de error, marcar todos del chunk como procesados para no bloquear el progreso
            foreach ($chunk as $v) {
                $processed++;
                js_prog($processed, $totalVariants);
                js_log("  → ERROR variante {$v['wpIDVariante']}: " . $e->getMessage());
            }
        }
    }
}

/* --------------------------------------------------------------------------
 * 7. CIERRE
 * -------------------------------------------------------------------------- */
js_log("Proceso finalizado. Variantes procesadas: {$processed}/{$totalVariants}");
echo '</body></html>';
$mysqli->close();
