<?php
/**
 * API: Procesar Venta
 * Sistema Sufarma - Backend Robusto
 * REFACTORIZADO: Usa funciones centralizadas de inventario_helpers.php
 */

header('Content-Type: application/json');
require_once '../../db_connection.php';
require_once '../../includes/functions/inventario_helpers.php';

try {
    // 1. CARGAR CONFIGURACIÓN DE SUCURSAL
    $sucursal_activa = obtenerSucursalActiva();

    // Leer datos JSON
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input || empty($input['items'])) {
        throw new Exception('El carrito está vacío o los datos son inválidos');
    }

    // Validar que se haya proporcionado un usuario
    if (!isset($input['usuario_id']) || empty($input['usuario_id'])) {
        throw new Exception('Debe seleccionar un usuario para procesar la venta');
    }

    $usuario_id = (int)$input['usuario_id'];
    $client_uuid = isset($input['client_uuid']) ? $input['client_uuid'] : null;
    $cliente_id = 1; // Consumidor Final
    $tipopago_id = 1; // Efectivo

    // VERIFICACIÓN DE IDEMPOTENCIA (UUID)
    if ($client_uuid) {
        $stmtUUID = $pdo->prepare("SELECT id FROM ventas WHERE client_uuid = ?");
        $stmtUUID->execute([$client_uuid]);
        $ventaExisente = $stmtUUID->fetch();
        
        if ($ventaExisente) {
            // Si ya existe, devolver éxito sin duplicar (Idempotencia)
            echo json_encode([
                'success' => true,
                'venta_id' => $ventaExisente['id'],
                'message' => 'Venta ya procesada anteriormente (Idempotencia)',
                'duplicated' => true
            ]);
            exit;
        }
    }

    $pdo->beginTransaction();

    // 2. Insertar Venta
    $descuento = isset($input['descuento']) ? (float)$input['descuento'] : 0;
    $caja_sesion_id = isset($input['caja_sesion_id']) ? (int)$input['caja_sesion_id'] : null;
    
    $sqlVenta = "INSERT INTO ventas (
        fecha_y_hora, total, subtotal, impuestos, descuento, usuario_id, cliente_id, sucursal_id, id_tipopago, monto_efectivo, client_uuid, caja_sesion_id
    ) VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    $stmtVenta = $pdo->prepare($sqlVenta);
    $stmtVenta->execute([
        $input['total'],
        $input['subtotal'],
        $input['taxes'],
        $descuento,
        $usuario_id,
        $cliente_id,
        $sucursal_activa,
        $tipopago_id,
        $input['total'],
        $client_uuid,
        $caja_sesion_id
    ]);

    $venta_id = $pdo->lastInsertId();

    // 3. Insertar Detalles y Actualizar Stock
    $sqlDetalle = "INSERT INTO detalle_ventas (
        venta_id, producto_id, cantidad, factor_conversion_usado, precio, subtotal, 
        facturado, exento_iva, estado_factura, presentacion_id, costo_promedio_al_vender
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    
    $stmtDetalle = $pdo->prepare($sqlDetalle);

    foreach ($input['items'] as $item) {
        $subtotal = $item['precio'] * $item['cantidad'];
        $facturado = $item['facturar'] ? 1 : 0;
        $exento_iva = isset($item['exento_iva']) ? (int)$item['exento_iva'] : 0;
        
        // Detectar presentación y calcular factor de conversión (función centralizada)
        $presentacionSugerida = isset($item['presentacion']) ? $item['presentacion'] : null;
        $deteccion = detectarPresentacionPorPrecio($pdo, $item['producto_id'], $item['precio'], $presentacionSugerida);
        $unidades_base_a_descontar = $item['cantidad'] * $deteccion['factor_conversion'];
        
        // Obtener CPP actual para snapshot
        $cpp_actual = obtenerCPP($pdo, $item['producto_id']);
        
        // Guardar detalle (con presentacion_id y CPP snapshot)
        $stmtDetalle->execute([
            $venta_id,
            $item['producto_id'],
            $item['cantidad'],
            $deteccion['factor_conversion'],
            $item['precio'],
            $subtotal,
            $facturado,
            $exento_iva,
            'PENDIENTE',
            $deteccion['presentacion_id'],
            $cpp_actual > 0 ? $cpp_actual : null
        ]);

        // Descontar del inventario (FIFO - función centralizada)
        descontarStockFIFO($pdo, $item['producto_id'], $sucursal_activa, $unidades_base_a_descontar, $facturado);
    }

    $pdo->commit();

    // 4. DISPARAR EVENTOS EN TIEMPO REAL (SSE)
    try {
        require_once '../sync/disparar_evento.php';
        registrar_evento_sync($pdo, 'NUEVA_VENTA', null, ['venta_id' => $venta_id, 'total' => $input['total']]);
        
        $productos_notificados = [];
        foreach ($input['items'] as $item) {
            if (!in_array($item['producto_id'], $productos_notificados)) {
                registrar_evento_sync($pdo, 'STOCK_ACTUALIZADO', $item['producto_id'], ['tipo' => 'venta']);
                $productos_notificados[] = $item['producto_id'];
            }
        }
    } catch (Exception $e) {
        error_log("Error al disparar evento SSE en venta: " . $e->getMessage());
    }

    // Auditoría sigilosa
    try {
        if (session_status() === PHP_SESSION_NONE) session_start();
        $_SESSION['user_id'] = $usuario_id;
        require_once dirname(__DIR__, 2) . '/includes/audit.php';
        $items_count = count($input['items']);
        logAudit('Ventas', 'Crear venta', 'ventas', $venta_id, ['total' => $input['total'], 'items' => $items_count, 'sucursal' => $sucursal_activa]);
    } catch (Exception $e) { error_log("Audit: " . $e->getMessage()); }

    echo json_encode([
        'success' => true,
        'venta_id' => $venta_id,
        'sucursal_id' => $sucursal_activa,
        'message' => 'Venta guardada correctamente'
    ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    $error_msg = 'Error al guardar venta: ' . $e->getMessage();
    error_log($error_msg);
    echo json_encode([
        'success' => false,
        'error' => $error_msg
    ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
}
?>