<?php
require_once 'includes/header.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: liquidaciones.php');
    exit();
}

// Validar que el usuario sea administrador
if (!isset($_SESSION['user_rol']) || ($_SESSION['user_rol'] !== 'admin' && $_SESSION['user_rol'] !== 'administrador')) {
    header('Location: login.php?error=unauthorized');
    exit();
}

// Validar campos
$movimiento_id = $_POST['movimiento_id'] ?? null;
$producto_id = $_POST['producto_id'] ?? null;
$ciudad_id = $_POST['ciudad_id'] ?? null;
$cantidad = $_POST['cantidad'] ?? null;
$cantidad_pedidos = $_POST['cantidad_pedidos'] ?? null;
$precio_liquidacion = $_POST['precio_liquidacion'] ?? null;
$fecha = $_POST['fecha'] ?? null;

if (empty($movimiento_id) || empty($producto_id) || empty($ciudad_id) || empty($cantidad) || !isset($cantidad_pedidos) || !isset($precio_liquidacion) || empty($fecha)) {
    header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=missing_fields');
    exit();
}

$pdo = db();

// Iniciar transacción
$pdo->beginTransaction();

try {
    // 1. Obtener el movimiento original para revertir el stock
    $stmt = $pdo->prepare("SELECT producto_id, ciudad_origen_id, cantidad FROM movimientos WHERE id = ?");
    $stmt->execute([$movimiento_id]);
    $movimiento_original = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($movimiento_original) {
        // Revertir el stock del producto original en la ciudad de origen
        $stmt_revert = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual + ? WHERE producto_id = ? AND ciudad_id = ?");
        $stmt_revert->execute([$movimiento_original['cantidad'], $movimiento_original['producto_id'], $movimiento_original['ciudad_origen_id']]);
    }

    // 2. Verificar si hay suficiente stock para el nuevo producto/cantidad en la nueva ciudad
    $stmt_stock = $pdo->prepare("SELECT stock_actual FROM stock_por_ciudad WHERE producto_id = ? AND ciudad_id = ?");
    $stmt_stock->execute([$producto_id, $ciudad_id]);
    $stock_actual = $stmt_stock->fetchColumn();

    if ($stock_actual === false || $stock_actual < $cantidad) {
        // Si no hay suficiente stock, revertir la transacción y redirigir con error
        $pdo->rollBack();
        header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=no_stock');
        exit();
    }

    // 3. Actualizar el movimiento
    $sql = "UPDATE movimientos 
            SET producto_id = ?, 
                ciudad_origen_id = ?, 
                cantidad = ?, 
                cantidad_pedidos = ?, 
                precio_liquidacion = ?, 
                fecha = ?
            WHERE id = ?";
    $stmt_update = $pdo->prepare($sql);
    $stmt_update->execute([
        $producto_id,
        $ciudad_id,
        $cantidad,
        $cantidad_pedidos,
        $precio_liquidacion,
        $fecha,
        $movimiento_id
    ]);

    // 4. Actualizar el stock para el nuevo producto/ciudad
    $stmt_update_stock = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - ? WHERE producto_id = ? AND ciudad_id = ?");
    $stmt_update_stock->execute([$cantidad, $producto_id, $ciudad_id]);

    // Confirmar la transacción
    $pdo->commit();

    header('Location: liquidaciones.php?success=updated');
    exit();

} catch (Exception $e) {
    // Si hay un error, revertir la transacción
    $pdo->rollBack();
    // Log del error (opcional)
    // error_log($e->getMessage());
    header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=db_error');
    exit();
}
