<?php
// ? Errores (quitar en produccion)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// ? CORS y Headers
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ? Conexion
require_once(__DIR__ . '/../config.php');
 $mysqli->set_charset("utf8mb4");

// ? JSON
 $input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
    echo json_encode(['success'=>false,'message'=>'JSON invalido']);
    exit;
}

// --- VALIDACION DE PARAMETROS ---
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
 $nota_id = isset($input['nota_id']) ? (int)$input['nota_id'] : 0;
 $cajero = isset($input['cajero']) ? trim($input['cajero']) : '';
 $motivo = isset($input['motivo']) ? trim($input['motivo']) : '';

if (!$slug_tienda || !$nota_id || !$cajero || !$motivo) {
    echo json_encode(['success' => false, 'message' => 'Parametros invalidos o incompletos.']);
    exit;
}

try {
    // Iniciar transaccion para asegurar la integridad de los datos
    $mysqli->begin_transaction();

    // 1. Validar que la nota exista, pertenezca a la tienda y no este ya reversada o aplicada
    $stmt_check = $mysqli->prepare("SELECT estado FROM notas_credito WHERE id = ? AND slug_tienda = ? FOR UPDATE");
    $stmt_check->bind_param("is", $nota_id, $slug_tienda);
    $stmt_check->execute();
    $nota_data = $stmt_check->get_result()->fetch_assoc();
    $stmt_check->close();

    if (!$nota_data) {
        throw new Exception("Nota de credito no encontrada.");
    }

    if ($nota_data['estado'] === 'reversada') {
        throw new Exception("La nota de credito ya se encuentra reversada.");
    }

    if ($nota_data['estado'] === 'aplicada') {
        throw new Exception("No se puede reversar una nota de credito que ya ha sido aplicada.");
    }

    // 2. Obtener los detalles de los productos para quitar del stock
    $stmt_detalles = $mysqli->prepare("SELECT articulo_id, cantidad FROM nota_credito_detalles WHERE nota_credito_id = ?");
    $stmt_detalles->bind_param("i", $nota_id);
    $stmt_detalles->execute();
    $detalles = $stmt_detalles->get_result()->fetch_all(MYSQLI_ASSOC);
    $stmt_detalles->close();

    // --- NUEVA LOGICA: Quitar stock y registrar movimiento ---
    
    // Preparar las sentencias fuera del bucle para mayor eficiencia
    $stmt_get_stock = $mysqli->prepare("SELECT stock FROM articulos WHERE id = ? FOR UPDATE");
    $stmt_update_stock = $mysqli->prepare("UPDATE articulos SET stock = stock - ? WHERE id = ?");
    
    // Preparar la sentencia para el movimiento de inventario
    $motivo_movimiento = "Reversion Nota de Credito";
    $batch_id = uniqid('rev_'); // Generar un ID unico para todo el lote de movimientos
    $stmt_insert_movimiento = $mysqli->prepare("
        INSERT INTO inventario_movimientos (
            articulo_id, slug_tienda, cantidad_ingresada, cantidad_anterior, 
            cantidad_actual, motivo, nota, batch_id
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    ");

    foreach ($detalles as $item) {
        // a. Obtener el stock ANTERIOR del articulo
        $stmt_get_stock->bind_param("s", $item['articulo_id']);
        $stmt_get_stock->execute();
        $stock_result = $stmt_get_stock->get_result();
        $stock_data = $stock_result->fetch_assoc();
        
        if (!$stock_data) {
            throw new Exception("Articulo con ID {$item['articulo_id']} no encontrado para consultar stock.");
        }
        $cantidad_anterior = $stock_data['stock'];

        // b. Calcular la cantidad ACTUAL
        $cantidad_actual = $cantidad_anterior - $item['cantidad'];

        // c. Quitar del stock (la operacion inversa a cuando se crea la nota)
        $stmt_update_stock->bind_param("is", $item['cantidad'], $item['articulo_id']);
        if (!$stmt_update_stock->execute()) {
            throw new Exception("Error al quitar stock para el articulo ID {$item['articulo_id']}: " . $stmt_update_stock->error);
        }

        // d. Registrar el movimiento en inventario_movimientos
        $cantidad_ingresada = -$item['cantidad']; // Es un egreso, por lo que es negativo
        $nota_detalle = "Reversion de nota ID: {$nota_id}. Motivo: {$motivo}";
        
        $stmt_insert_movimiento->bind_param(
            "ssiiisss",
            $item['articulo_id'], // articulo_id
            $slug_tienda,         // slug_tienda
            $cantidad_ingresada,  // cantidad_ingresada (negativo)
            $cantidad_anterior,   // cantidad_anterior
            $cantidad_actual,     // cantidad_actual
            $motivo_movimiento,   // motivo
            $nota_detalle,        // nota (detalles)
            $batch_id             // batch_id
        );
        if (!$stmt_insert_movimiento->execute()) {
            throw new Exception("Error al registrar movimiento de inventario para el articulo ID {$item['articulo_id']}: " . $stmt_insert_movimiento->error);
        }
    }

    // Cerrar las sentencias del bucle
    $stmt_get_stock->close();
    $stmt_update_stock->close();
    $stmt_insert_movimiento->close();

    // 4. Actualizar el estado de la nota de credito a 'reversada'
    $stmt_update_nota = $mysqli->prepare("UPDATE notas_credito SET estado = 'reversada' WHERE id = ? AND slug_tienda = ?");
    $stmt_update_nota->bind_param("is", $nota_id, $slug_tienda);
    if (!$stmt_update_nota->execute()) {
        throw new Exception("Error al actualizar el estado de la nota de credito: " . $stmt_update_nota->error);
    }
    $stmt_update_nota->close();

    // 5. Registrar la reversion en la tabla de auditoria para dejar un rastro claro
    $stmt_log = $mysqli->prepare("
        INSERT INTO reversiones_notas_credito (nota_credito_id, cajero_reversion, motivo_reversion) 
        VALUES (?, ?, ?)
    ");
    $stmt_log->bind_param("iss", $nota_id, $cajero, $motivo);
    if (!$stmt_log->execute()) {
        throw new Exception("Error al registrar la reversion: " . $stmt_log->error);
    }
    $stmt_log->close();

    // Si todas las operaciones tuvieron exito, confirmar la transaccion
    $mysqli->commit();

    echo json_encode([
        'success' => true, 
        'message' => 'Nota de credito reversada y stock actualizado correctamente.'
    ]);

} catch (Exception $e) {
    // Si algo salio mal, deshacer todos los cambios realizados en la transaccion
    $mysqli->rollback();
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
} finally {
    if (isset($mysqli) && $mysqli) { $mysqli->close(); }
}
?>