<?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']) : '';
 $historial_id = isset($input['historial_id']) ? (int)$input['historial_id'] : 0;
 $cajero = isset($input['cajero']) ? trim($input['cajero']) : '';
 $motivo = isset($input['motivo']) ? trim($input['motivo']) : '';

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

try {
    $mysqli->begin_transaction();

    // 1. Obtener los datos del historial para saber qué revertir
    $stmt_hist = $mysqli->prepare("
        SELECT factura_original_id, estado_original, numero_factura 
        FROM historial_facturas_anuladas 
        WHERE id = ? AND slug_tienda = ? AND reversed_at IS NULL FOR UPDATE
    ");
    $stmt_hist->bind_param("is", $historial_id, $slug_tienda);
    $stmt_hist->execute();
    $historial_data = $stmt_hist->get_result()->fetch_assoc();
    $stmt_hist->close();

    if (!$historial_data) {
        throw new Exception("Registro de anulación no encontrado o ya ha sido revertido.");
    }

    $factura_original_id = $historial_data['factura_original_id'];
    $estado_original = $historial_data['estado_original'];
    $numero_factura = $historial_data['numero_factura'];

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

    // 3. Quitar del stock y registrar movimiento de reversión
    $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 = ?");
    
    $motivo_movimiento = "Reversion de Anulacion";
    $batch_id = uniqid('reversion_anul_');
    $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();
        $cantidad_anterior = $stock_data['stock'];

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

        // c. Quitar del stock el articulo
        $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 anulacion de factura No.: {$numero_factura}. 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);
        }
    }
    $stmt_get_stock->close();
    $stmt_update_stock->close();
    $stmt_insert_movimiento->close();

    // 4. Restaurar el estado de la factura original
    $stmt_update_factura = $mysqli->prepare("
        UPDATE facturas SET estado = ? WHERE id = ? AND slug_tienda = ?
    ");
    $stmt_update_factura->bind_param("sis", $estado_original, $factura_original_id, $slug_tienda);
    if (!$stmt_update_factura->execute()) {
        throw new Exception("Error al restaurar el estado de la factura original: " . $stmt_update_factura->error);
    }
    $stmt_update_factura->close();

    // 5. Marcar el historial como revertido
    $stmt_update_hist = $mysqli->prepare("
        UPDATE historial_facturas_anuladas 
        SET reversed_at = NOW(), reversed_by = ?, motivo_reversion = ? 
        WHERE id = ?
    ");
    $stmt_update_hist->bind_param("ssi", $cajero, $motivo, $historial_id);
    if (!$stmt_update_hist->execute()) {
        throw new Exception("Error al actualizar el historial: " . $stmt_update_hist->error);
    }
    $stmt_update_hist->close();

    $mysqli->commit();

    echo json_encode([
        'success' => true, 
        'message' => 'Anulación revertida correctamente. La factura ha sido restaurada.'
    ]);

} catch (Exception $e) {
    $mysqli->rollback();
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
} finally {
    if (isset($mysqli) && $mysqli) { $mysqli->close(); }
}
?>