<?php

/*
|--------------------------------------------------------------------------
| REQUIERE:
| - $conn
| - $class_nombre_tercero_cierre
| - $class_referencia_cierre
| - $class_talla_cierre
|--------------------------------------------------------------------------
|
| LÓGICA:
| saldo_cliente =
|   pedidos + cierre
| - ventas - cierre_pedido
|
| Si saldo > 0  => alm_referencia_despacho
| Si saldo < 0  => alm_referencia_cierre
| Si saldo = 0  => borrar ambos
|--------------------------------------------------------------------------
*/

$nombre_tercero = $conn->real_escape_string(trim($class_nombre_tercero_cierre));
$referencia     = $conn->real_escape_string(trim($class_referencia_cierre));
$talla          = $conn->real_escape_string(trim($class_talla_cierre));

$getTotal = function ($sql, $alias) use ($conn) {
    $query = $conn->query($sql);
    if (!$query) {
        throw new Exception("Error SQL: " . $conn->error . " | Query: " . $sql);
    }
    $row = $query->fetch_assoc();
    return (float)($row[$alias] ?? 0);
};

/*--------------------------------------------------------------
| PEDIDOS DEL CLIENTE
--------------------------------------------------------------*/
$sqlPedidos = "
    SELECT COALESCE(SUM(pd.cantidad), 0) AS total
    FROM alm_pedido p
    INNER JOIN alm_pedido_detalle pd ON pd.id_pedido = p.id
    WHERE p.estado <> 'Cancelado'
      AND pd.estado <> 'Cancelado'
      AND p.nombre_tercero = '$nombre_tercero'
      AND pd.referencia_producto = '$referencia'
      AND pd.talla = '$talla'
";
$pedidos = $getTotal($sqlPedidos, 'total');

/*--------------------------------------------------------------
| VENTAS DEL CLIENTE
--------------------------------------------------------------*/
$sqlVentas = "
    SELECT COALESCE(SUM(vd.cantidad), 0) AS total
    FROM alm_venta v
    INNER JOIN alm_venta_detalle vd ON vd.id_venta = v.id
    WHERE v.estado <> 'Cancelado'
      AND vd.estado <> 'Cancelado'
      AND v.nombre_tercero = '$nombre_tercero'
      AND vd.referencia_producto = '$referencia'
      AND vd.talla = '$talla'
";
$ventas = $getTotal($sqlVentas, 'total');

/*--------------------------------------------------------------
| CIERRES DEL CLIENTE
--------------------------------------------------------------*/
$sqlCierre = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM alm_cierre_detalle
    WHERE nombre_tercero = '$nombre_tercero'
      AND referencia_producto = '$referencia'
      AND talla = '$talla'
";
$cierres = $getTotal($sqlCierre, 'total');

/*--------------------------------------------------------------
| CIERRES PEDIDO DEL CLIENTE
--------------------------------------------------------------*/
$sqlCierrePedido = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM alm_cierre_pedido_detalle
    WHERE nombre_tercero = '$nombre_tercero'
      AND referencia_producto = '$referencia'
      AND talla = '$talla'
";
$cierresPedido = $getTotal($sqlCierrePedido, 'total');

/*--------------------------------------------------------------
| SALDO DEL CLIENTE
--------------------------------------------------------------*/
$saldo = ($pedidos + $cierres) - ($ventas + $cierresPedido);

/*--------------------------------------------------------------
| CONTADORES
--------------------------------------------------------------*/
$sqlCountDespacho = "
    SELECT COUNT(id) AS contar
    FROM alm_referencia_despacho
    WHERE nombre_tercero = '$nombre_tercero'
      AND referencia_producto = '$referencia'
      AND talla = '$talla'
";
$countDespacho = (int)$getTotal($sqlCountDespacho, 'contar');

$sqlCountCierre = "
    SELECT COUNT(id) AS contar
    FROM alm_referencia_cierre
    WHERE nombre_tercero = '$nombre_tercero'
      AND referencia_producto = '$referencia'
      AND talla = '$talla'
";
$countCierre = (int)$getTotal($sqlCountCierre, 'contar');

/*--------------------------------------------------------------
| SINCRONIZACIÓN
--------------------------------------------------------------*/
if ($saldo > 0) {

    if ($countDespacho > 0) {
        $sql = "
            UPDATE alm_referencia_despacho
            SET cantidad = '$saldo'
            WHERE nombre_tercero = '$nombre_tercero'
              AND referencia_producto = '$referencia'
              AND talla = '$talla'
        ";
    } else {
        $sql = "
            INSERT INTO alm_referencia_despacho (
                id, nombre_tercero, referencia_producto, talla, cantidad
            ) VALUES (
                NULL, '$nombre_tercero', '$referencia', '$talla', '$saldo'
            )
        ";
    }

    if (!$conn->query($sql)) {
        throw new Exception("Error guardando alm_referencia_despacho: " . $conn->error);
    }

    $sqlDelete = "
        DELETE FROM alm_referencia_cierre
        WHERE nombre_tercero = '$nombre_tercero'
          AND referencia_producto = '$referencia'
          AND talla = '$talla'
    ";
    if (!$conn->query($sqlDelete)) {
        throw new Exception("Error eliminando alm_referencia_cierre: " . $conn->error);
    }

} elseif ($saldo < 0) {

    if ($countCierre > 0) {
        $sql = "
            UPDATE alm_referencia_cierre
            SET cantidad = '$saldo'
            WHERE nombre_tercero = '$nombre_tercero'
              AND referencia_producto = '$referencia'
              AND talla = '$talla'
        ";
    } else {
        $sql = "
            INSERT INTO alm_referencia_cierre (
                id, nombre_tercero, referencia_producto, talla, cantidad
            ) VALUES (
                NULL, '$nombre_tercero', '$referencia', '$talla', '$saldo'
            )
        ";
    }

    if (!$conn->query($sql)) {
        throw new Exception("Error guardando alm_referencia_cierre: " . $conn->error);
    }

    $sqlDelete = "
        DELETE FROM alm_referencia_despacho
        WHERE nombre_tercero = '$nombre_tercero'
          AND referencia_producto = '$referencia'
          AND talla = '$talla'
    ";
    if (!$conn->query($sqlDelete)) {
        throw new Exception("Error eliminando alm_referencia_despacho: " . $conn->error);
    }

} else {

    $sqlDelete1 = "
        DELETE FROM alm_referencia_despacho
        WHERE nombre_tercero = '$nombre_tercero'
          AND referencia_producto = '$referencia'
          AND talla = '$talla'
    ";
    if (!$conn->query($sqlDelete1)) {
        throw new Exception("Error eliminando alm_referencia_despacho en saldo 0: " . $conn->error);
    }

    $sqlDelete2 = "
        DELETE FROM alm_referencia_cierre
        WHERE nombre_tercero = '$nombre_tercero'
          AND referencia_producto = '$referencia'
          AND talla = '$talla'
    ";
    if (!$conn->query($sqlDelete2)) {
        throw new Exception("Error eliminando alm_referencia_cierre en saldo 0: " . $conn->error);
    }
}