<?php

/*
|--------------------------------------------------------------------------
| REQUIERE:
| - $conn
| - $class_referencia
| - $class_talla
|--------------------------------------------------------------------------
|
| LÓGICA DEL ALMACÉN
|
| DISPONIBLE =
|   recibido desde fábrica (despacho/detalle externo)
| + alm_novedad entrada
| + alm_compra_detalle
| - alm_novedad salida
| - alm_venta_detalle
|
| PRODUCCIÓN A PEDIR A FÁBRICA =
|   lo que el almacén debe a sus clientes (alm_referencia_despacho)
| - disponible positivo
| - lo que la fábrica ya le debe al almacén (referencia_despacho externo)
|--------------------------------------------------------------------------
*/

$referencia = $conn->real_escape_string(trim($class_referencia));
$talla      = $conn->real_escape_string(trim($class_talla));

$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);
};

/*--------------------------------------------------------------
| SUMAR INVENTARIO
--------------------------------------------------------------*/

/*
| DESPACHO RECIBIDO DESDE FÁBRICA
| Tablas externas del otro sistema
*/
$sqlDespachoFabrica = "
    SELECT COALESCE(SUM(dd.cantidad), 0) AS total
    FROM despacho d
    INNER JOIN despacho_detalle dd ON dd.id_despacho = d.id
    WHERE d.estado <> 'Cancelado'
      AND dd.estado = 'Recibido'
      AND d.nombre_tercero = 'INNOVASUELAS ALMACEN'
      AND dd.referencia_producto = '$referencia'
      AND dd.talla = '$talla'
";
$despachoFabrica = $getTotal($sqlDespachoFabrica, 'total');

/*
| NOVEDAD ENTRADA
*/
$sqlEntrada = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM alm_novedad
    WHERE referencia_producto = '$referencia'
      AND talla = '$talla'
      AND movimiento = 'Entrada'
";
$novedadEntrada = $getTotal($sqlEntrada, 'total');

/*
| COMPRAS DEL ALMACÉN
*/
$sqlCompras = "
    SELECT COALESCE(SUM(cd.cantidad), 0) AS total
    FROM alm_compra c
    INNER JOIN alm_compra_detalle cd ON cd.id_compra = c.id
    WHERE c.estado <> 'Cancelado'
      AND cd.estado <> 'Cancelado'
      AND cd.referencia_producto = '$referencia'
      AND cd.talla = '$talla'
";
$compras = $getTotal($sqlCompras, 'total');

/*--------------------------------------------------------------
| RESTAR INVENTARIO
--------------------------------------------------------------*/

/*
| NOVEDAD SALIDA
*/
$sqlSalida = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM alm_novedad
    WHERE referencia_producto = '$referencia'
      AND talla = '$talla'
      AND movimiento = 'Salida'
";
$novedadSalida = $getTotal($sqlSalida, 'total');

/*
| VENTAS DEL ALMACÉN
| Reservan / consumen inventario si están en Proceso o Finalizado
*/
$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 IN ('Proceso', 'Finalizado')
      AND vd.referencia_producto = '$referencia'
      AND vd.talla = '$talla'
";
$ventas = $getTotal($sqlVentas, 'total');

/*--------------------------------------------------------------
| DISPONIBLE
--------------------------------------------------------------*/
$disponible = ($despachoFabrica + $novedadEntrada + $compras) - ($novedadSalida + $ventas);

/*--------------------------------------------------------------
| SINCRONIZAR alm_referencia_disponible
--------------------------------------------------------------*/
$sqlCountDisponible = "
    SELECT COUNT(id) AS contar
    FROM alm_referencia_disponible
    WHERE referencia_producto = '$referencia'
      AND talla = '$talla'
";
$countDisponible = (int)$getTotal($sqlCountDisponible, 'contar');

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

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

/*--------------------------------------------------------------
| LO QUE EL ALMACÉN LE DEBE A SUS CLIENTES
| Sale desde la tabla consolidada del propio almacén
--------------------------------------------------------------*/
$sqlDeboClientes = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM alm_referencia_despacho
    WHERE referencia_producto = '$referencia'
      AND talla = '$talla'
";
$deboClientes = $getTotal($sqlDeboClientes, 'total');

/*--------------------------------------------------------------
| LO QUE LA FÁBRICA YA LE DEBE AL ALMACÉN
| Tabla externa del otro sistema
--------------------------------------------------------------*/
$sqlDebenFabrica = "
    SELECT COALESCE(SUM(cantidad), 0) AS total
    FROM referencia_despacho
    WHERE nombre_tercero = 'INNOVASUELAS ALMACEN'
      AND referencia_producto = '$referencia'
      AND talla = '$talla'
";
$debenFabrica = $getTotal($sqlDebenFabrica, 'total');

/*--------------------------------------------------------------
| PRODUCCIÓN A PEDIR A FÁBRICA
| Solo descuento disponible positivo
--------------------------------------------------------------*/
$disponibleParaProduccion = max($disponible, 0);
$produccionNecesaria = $deboClientes - $disponibleParaProduccion - $debenFabrica;

/*--------------------------------------------------------------
| SINCRONIZAR alm_referencia_produccion
--------------------------------------------------------------*/
$sqlCountProduccion = "
    SELECT COUNT(id) AS contar
    FROM alm_referencia_produccion
    WHERE referencia_producto = '$referencia'
      AND talla = '$talla'
";
$countProduccion = (int)$getTotal($sqlCountProduccion, 'contar');

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

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