<?php
/**
 * API: Eliminar Venta
 * Sistema Sufarma
 * REFACTORIZADO: Usa funciones centralizadas + CORREGIDO bug de restauración de stock
 * BUG CORREGIDO: Ahora restaura stock aplicando factor de conversión por presentación
 */

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

try {
    // Leer datos del request
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);
    
    $venta_id = isset($data['venta_id']) ? (int)$data['venta_id'] : 0;
    
    // Validación
    if ($venta_id <= 0) {
        throw new Exception('ID de venta inválido');
    }
    
    // Iniciar transacción
    $pdo->beginTransaction();
    
    // 1. Verificar que la venta exista y sea de hoy
    $sqlCheck = "SELECT id, DATE(fecha_y_hora) as fecha_venta FROM ventas WHERE id = ?";
    $stmtCheck = $pdo->prepare($sqlCheck);
    $stmtCheck->execute([$venta_id]);
    $venta = $stmtCheck->fetch();
    
    if (!$venta) {
        throw new Exception('Venta no encontrada');
    }

    if ($venta['fecha_venta'] !== date('Y-m-d')) {
        throw new Exception('Seguridad: No se permite eliminar ventas de días anteriores (' . $venta['fecha_venta'] . ')');
    }
    
    // 1.1 Verificar que ningún item de la venta esté facturado
    $sqlCheckFacturado = "SELECT COUNT(*) as items_facturados 
                          FROM detalle_ventas 
                          WHERE venta_id = ? AND estado_factura = 'FACTURADO'";
    $stmtCheckFacturado = $pdo->prepare($sqlCheckFacturado);
    $stmtCheckFacturado->execute([$venta_id]);
    $checkFacturado = $stmtCheckFacturado->fetch();
    
    if ($checkFacturado['items_facturados'] > 0) {
        throw new Exception('No se puede eliminar una venta que tiene productos facturados');
    }
    
    // 2. Obtener items de la venta con precio para detectar presentación
    $sqlItems = "SELECT dv.producto_id, dv.cantidad, dv.precio, dv.facturado, v.sucursal_id, dv.factor_conversion_usado
                 FROM detalle_ventas dv
                 INNER JOIN ventas v ON dv.venta_id = v.id
                 WHERE dv.venta_id = ?";
    $stmtItems = $pdo->prepare($sqlItems);
    $stmtItems->execute([$venta_id]);
    $items = $stmtItems->fetchAll();
    
    // CORREGIDO: Restaurar stock aplicando factor de conversión (función centralizada)
    foreach ($items as $item) {
        restaurarStockLIFO(
            $pdo,
            $item['producto_id'],
            $item['sucursal_id'],
            $item['cantidad'],
            $item['precio'],
            $item['facturado'],
            $item['factor_conversion_usado']
        );
    }
    
    // 3. Eliminar detalles de venta
    $sqlDeleteDetalles = "DELETE FROM detalle_ventas WHERE venta_id = ?";
    $stmtDeleteDetalles = $pdo->prepare($sqlDeleteDetalles);
    $stmtDeleteDetalles->execute([$venta_id]);
    
    // 4. Eliminar venta
    $sqlDeleteVenta = "DELETE FROM ventas WHERE id = ?";
    $stmtDeleteVenta = $pdo->prepare($sqlDeleteVenta);
    $stmtDeleteVenta->execute([$venta_id]);
    
    // Commit transacción
    $pdo->commit();

    // Auditoría sigilosa
    try {
        require_once dirname(__DIR__, 2) . '/includes/audit.php';
        logAudit('Ventas', 'Eliminar venta', 'ventas', $venta_id, 'Venta eliminada con restauración de stock');
    } catch (Exception $e) { error_log("Audit: " . $e->getMessage()); }
    
    echo json_encode([
        'success' => true,
        'message' => 'Venta eliminada correctamente. Stock restaurado.'
    ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
    
} catch (Exception $e) {
    // Rollback en caso de error
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    
    http_response_code(500);
    $error_msg = $e->getMessage();
    error_log("Error eliminar venta: " . $error_msg);
    echo json_encode([
        'success' => false,
        'error' => $error_msg
    ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
}
