<?php
header('Content-Type: application/json');
require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../../includes/auth_admin.php';
$pdo = getDBConnection();

$usuario_id = $_SESSION['user_id'] ?? 12; 

$data = json_decode(file_get_contents('php://input'), true);

if (!$data || !isset($data['producto_id']) || !isset($data['total_cantidad'])) {
    echo json_encode(['success' => false, 'message' => 'Datos incompletos']);
    exit;
}

try {
    $pdo->beginTransaction();

    $producto_id = $data['producto_id'];
    $total_cantidad = (int)$data['total_cantidad'];
    $costo = (float)($data['costo'] ?? 0);
    $lote_codigo = $data['lote_codigo'] ?? 'L-' . time();
    $fecha_vencimiento = !empty($data['fecha_vencimiento']) ? $data['fecha_vencimiento'] : '2099-12-31';
    $facturado = (int)($data['facturado'] ?? 1);
    $presentacion = $data['presentacion'] ?? 'UNIDAD';
    $distribucion = $data['distribucion'] ?? []; 

    // Resolver presentacion_id
    $stmtPres = $pdo->prepare("SELECT id FROM presentaciones WHERE UPPER(nombre) = UPPER(?) LIMIT 1");
    $stmtPres->execute([$presentacion]);
    $presRow = $stmtPres->fetch(PDO::FETCH_ASSOC);
    $presentacion_id = $presRow ? (int)$presRow['id'] : 1;

    // Resolver factor_conversion
    $stmtFactor = $pdo->prepare("SELECT factor_conversion FROM producto_presentaciones WHERE producto_id = ? AND presentacion_id = ? LIMIT 1");
    $stmtFactor->execute([$producto_id, $presentacion_id]);
    $factorRow = $stmtFactor->fetch(PDO::FETCH_ASSOC);
    $factor = $factorRow ? max(1, (int)$factorRow['factor_conversion']) : 1;

    $unidades_base_total = $total_cantidad * $factor;
    $stock_f = ($facturado == 1) ? $unidades_base_total : 0;
    $stock_nf = ($facturado == 0) ? $unidades_base_total : 0;

    // 1. Registrar ingreso
    $stmtIngreso = $pdo->prepare("INSERT INTO ingresos_sucursal 
        (producto_id, sucursal_id, cantidad_ingresada, 
         presentacion_id, cantidad_unidades_base, usuario_recibe_id, fecha_vencimiento_ingreso) 
        VALUES (?, 1, ?, ?, ?, ?, ?)");
    $stmtIngreso->execute([$producto_id, $total_cantidad, 
                           $presentacion_id, $unidades_base_total, $usuario_id, $fecha_vencimiento]);

    // 2. Inventario Bodega (inventario_sucursal — única fuente de verdad)
    $stmtInv = $pdo->prepare("INSERT INTO inventario_sucursal 
        (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local)
        VALUES (?, 1, ?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE 
            stock_total = stock_total + VALUES(stock_total),
            stock_facturado = stock_facturado + VALUES(stock_facturado),
            stock_no_facturado = stock_no_facturado + VALUES(stock_no_facturado)");
    $stmtInv->execute([$producto_id, $unidades_base_total, $stock_f, $stock_nf, $costo]);

    // 3. Actualizar CPP (Costo Promedio Ponderado)
    if ($costo > 0) {
        $stmtCPP = $pdo->prepare("SELECT costo_promedio_unidad_base, cantidad_total_unidades 
                                  FROM productos_costo_promedio WHERE producto_id = ?");
        $stmtCPP->execute([$producto_id]);
        $cppRow = $stmtCPP->fetch(PDO::FETCH_ASSOC);

        $costo_unidad_base = $costo / $factor;

        if ($cppRow && $cppRow['cantidad_total_unidades'] > 0) {
            $valor_actual = $cppRow['costo_promedio_unidad_base'] * $cppRow['cantidad_total_unidades'];
            $valor_nuevo = $costo_unidad_base * $unidades_base_total;
            $qty_total = $cppRow['cantidad_total_unidades'] + $unidades_base_total;
            $nuevo_cpp = ($valor_actual + $valor_nuevo) / $qty_total;

            $pdo->prepare("UPDATE productos_costo_promedio SET 
                costo_promedio_unidad_base = ?, cantidad_total_unidades = ?, valor_total_inventario = ?
                WHERE producto_id = ?")->execute([round($nuevo_cpp, 4), $qty_total, round($nuevo_cpp * $qty_total, 2), $producto_id]);
        } else {
            $pdo->prepare("INSERT INTO productos_costo_promedio 
                (producto_id, costo_promedio_unidad_base, cantidad_total_unidades, valor_total_inventario)
                VALUES (?, ?, ?, ?)
                ON DUPLICATE KEY UPDATE 
                    costo_promedio_unidad_base = VALUES(costo_promedio_unidad_base),
                    cantidad_total_unidades = VALUES(cantidad_total_unidades),
                    valor_total_inventario = VALUES(valor_total_inventario)")
                ->execute([$producto_id, round($costo_unidad_base, 4), $unidades_base_total, 
                          round($costo_unidad_base * $unidades_base_total, 2)]);
        }
    }

    // 4. Distribución a Sucursales
    foreach ($distribucion as $sucursal_id => $cantidad) {
        if ($cantidad <= 0) continue;
        if ($sucursal_id == 1) continue; 

        $unidades_base_dist = $cantidad * $factor;
        $s_f = ($facturado == 1) ? $unidades_base_dist : 0;
        $s_nf = ($facturado == 0) ? $unidades_base_dist : 0;

        // Traslado
        $stmtTraslado = $pdo->prepare("INSERT INTO traslados (sucursal_origen, sucursal_destino, usuario_id, estado, observaciones) 
                                       VALUES (1, ?, ?, 'completado', 'Distribución automática')");
        $stmtTraslado->execute([$sucursal_id, $usuario_id]);
        $traslado_id = $pdo->lastInsertId();

        // Detalle traslado
        $pdo->prepare("INSERT INTO detalle_traslados_v2 
            (traslado_id, producto_id, presentacion_id, cantidad, cantidad_unidades_base, es_facturado) 
            VALUES (?, ?, ?, ?, ?, ?)")->execute([$traslado_id, $producto_id, $presentacion_id, $cantidad, $unidades_base_dist, $facturado]);

        // Descontar de Bodega
        $stockCol = ($facturado == 1) ? 'stock_facturado' : 'stock_no_facturado';
        $pdo->prepare("UPDATE inventario_sucursal SET 
            stock_total = GREATEST(0, CAST(stock_total AS SIGNED) - ?),
            $stockCol = GREATEST(0, CAST($stockCol AS SIGNED) - ?)
            WHERE producto_id = ? AND sucursal_id = 1")->execute([$unidades_base_dist, $unidades_base_dist, $producto_id]);

        // Sumar a Sucursal destino
        $pdo->prepare("INSERT INTO inventario_sucursal 
            (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local)
            VALUES (?, ?, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
                stock_total = stock_total + VALUES(stock_total),
                stock_facturado = stock_facturado + VALUES(stock_facturado),
                stock_no_facturado = stock_no_facturado + VALUES(stock_no_facturado)")
            ->execute([$producto_id, $sucursal_id, $unidades_base_dist, $s_f, $s_nf, $costo]);
    }

    $pdo->commit();
    echo json_encode(['success' => true, 'message' => 'Ingreso procesado correctamente', 
                       'unidades_base' => $unidades_base_total, 'factor' => $factor]);

} catch (Exception $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    echo json_encode(['success' => false, 'message' => 'Error BD: ' . $e->getMessage()]);
}
?>
