<?php
// siigo/scripts/sync_productos.php

require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../lib/Client.php';

/**
 * Elimina comillas dobles y simples del nombre para evitar invalid_name en Siigo.
 */
function sanitizeName(string $name): string
{
  return str_replace(['"', "'", '”', '“', '¨', '°', 'º', '´', '`'], '', $name);
}

/**
 * Realiza llamadas al API de Siigo con hasta 3 reintentos ante 429 rate-limit.
 */
function apiRequest(string $method, string $uri, array $opts = [])
{
  global $client;
  $lastException = null;
  for ($i = 0; $i < 3; $i++) {
    try {
      return $client->{$method}($uri, $opts);
    } catch (\Exception $e) {
      $lastException = $e;
      // Si es rate-limit, esperamos 2 segundos y reintentamos
      if (strpos($e->getMessage(), '"Code":"requests_limit"') !== false) {
        sleep(2);
        continue;
      }
      // Otros errores: salimos inmediatamente
      throw $e;
    }
  }
  // Tras 3 intentos fallidos lanzamos la última excepción
  throw $lastException;
}

// ——————————————————————————
// 1) Conexión MySQL
// ——————————————————————————
$servername = 'localhost';
$username   = 'ndconsulta';
$password   = 'Nitro2021';
$dbname     = 'db_compranet';
$port       = 3306;

$conn = new mysqli($servername, $username, $password, $dbname, $port);
if ($conn->connect_error) {
  die("Conexión fallida: " . $conn->connect_error);
}
$conn->set_charset('utf8');

// ——————————————————————————
// 2) Seleccionar SKUs sin siigo_id
// ——————————————————————————
$sql = "
SELECT 
  pv.referenciaCPN AS SKU,
  p.nombre,
  pv.txtColor,
  pv.siigo_id,
  p.idImpuesto
FROM tb_productos_variantes pv
INNER JOIN tb_productos p 
  ON pv.idProducto = p.id
INNER JOIN tb_impuestos i 
  ON p.idImpuesto = i.id
WHERE 
  pv.siigo_id IS NULL 
  AND P.idProveedor != 7 AND p.nombre IS NOT NULL
  AND pv.referenciaCPN NOT LIKE 'CPN-S%' 
  AND pv.referenciaCPN NOT LIKE 'CPN-M%'
GROUP BY
  pv.referenciaCPN,
  p.nombre,
  pv.txtColor,
  pv.siigo_id,
  p.idImpuesto
ORDER BY
  pv.referenciaCPN DESC;
";

$result = $conn->query($sql);
if (!$result) {
  die("Error en consulta: " . $conn->error);
}

$client = new SiigoClient();

// ——————————————————————————
// 3) Recorremos cada SKU
// ——————————————————————————
while ($row = $result->fetch_assoc()) {
  $sku        = $row['SKU'];
  $nombre     = $row['nombre'];
  $color      = $row['txtColor'];
  $idImpuesto = (int) $row['idImpuesto'];

  // 3a) Intentar buscar en Siigo
  try {
    $resp  = apiRequest('get', 'products', [
      'code'      => $sku,
      'page'      => 1,
      'page_size' => 1
    ]);
    $found = $resp['results'][0] ?? null;
  } catch (\Exception $e) {
    echo "Error buscando SKU {$sku}: {$e->getMessage()}\n";
    continue;
  }

  if ($found) {
    // ya existe → tomamos el GUID
    $guid = $found['id'];
  } else {
    // 3b) No existe → crear en Siigo
    $safeName = sanitizeName($nombre);
    $payload  = [
      'code'          => $sku,
      'name'          => "{$safeName} - {$color}",
      'type'          => 'Product',
      'account_group' => 1101,
    ];
    // IVA 19% sólo si idImpuesto == 2
    if ($idImpuesto === 2) {
      $payload['taxes'] = [
        ['id' => 11560]
      ];
    }

    try {
      $created = apiRequest('post', 'products', ['json' => $payload]);
      $guid    = $created['id'] ?? null;
    } catch (\Exception $e) {
      echo "Error creando SKU {$sku}: {$e->getMessage()}\n";
      continue;
    }
  }

  // 3c) Actualizar siigo_id en la tabla
  if (!empty($guid)) {
    $upd = $conn->prepare("
            UPDATE tb_productos_variantes 
               SET siigo_id = ? 
             WHERE referenciaCPN = ?
        ");
    $upd->bind_param('ss', $guid, $sku);
    $upd->execute();
    echo "Sincronizado {$sku} → {$guid}\n";
  }
}

$conn->close();
