<?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");
 
 

require_once(__DIR__ . '/../funciones_db.php'); // Ajusta la ruta si es necesario

try {
    $mysqli->begin_transaction();

    // 1. Buscar el registro en el historial para saber qué revertir
    $sql_hist = "SELECT * FROM historial_anulaciones WHERE id = ? AND slug_tienda = ?";
    $stmt_hist = $mysqli->prepare($sql_hist);
    $stmt_hist->bind_param("is", $historial_id, $slug_tienda);
    $stmt_hist->execute();
    $historial = $stmt_hist->get_result()->fetch_assoc();
    $stmt_hist->close();

    if (!$historial) {
        throw new Exception("Registro de anulación no encontrado.");
    }

    // 2. Lógica de reversión según el tipo de origen
    if ($historial['tipo_origen'] === 'factura') {
        // Revertir anulación de factura: devolver stock, cambiar estado a 'pendiente'
        $stmt_detalles = $mysqli->prepare("SELECT articulo_id, cantidad FROM factura_detalles WHERE factura_id = ?");
        $stmt_detalles->bind_param("i", $historial['id_origen']);
        $stmt_detalles->execute();
        $detalles = $stmt_detalles->get_result()->fetch_all(MYSQLI_ASSOC);
        $stmt_detalles->close();

        $motivo_movimiento = "Revivir Anulacion de Factura";
        $batch_id = uniqid('rev_anul_fact_');
        $stmt_update_stock = $mysqli->prepare("UPDATE articulos SET stock = stock - ? WHERE id = ?");
        $stmt_insert_movimiento = $mysqli->prepare("INSERT INTO inventario_movimientos (...) VALUES (?,?,?)");

        foreach ($detalles as $item) {
            // Quitar stock y registrar movimiento (lógica similar a la de antes)
            $stmt_update_stock->bind_param("is", $item['cantidad'], $item['articulo_id']);
            $stmt_update_stock->execute();
            // ... (lógica de inserción en inventario_movimientos) ...
        }
        $stmt_update_stock->close();
        $stmt_insert_movimiento->close();

        $stmt_update_factura = $mysqli->prepare("UPDATE facturas SET estado = 'pendiente', updated_at = NOW() WHERE id = ?");
        $stmt_update_factura->bind_param("i", $historial['id_origen']);
        $stmt_update_factura->execute();
        $stmt_update_factura->close();

    } elseif ($historial['tipo_origen'] === 'nota_credito') {
        // Revertir reversión de nota de crédito: devolver stock, cambiar estado a 'emitida'
        // ... (lógica similar a la de factura, pero sobre `nota_credito_detalles` y estado 'emitida') ...
    } elseif ($historial['tipo_origen'] === 'credito') {
        // Revertir anulación de crédito: cambiar estado a 'activo'
        $stmt_update_credito = $mysqli->prepare("UPDATE creditos SET estado = 'activo', updated_at = NOW() WHERE id = ?");
        $stmt_update_credito->bind_param("i", $historial['id_origen']);
        $stmt_update_credito->execute();
        $stmt_update_credito->close();
    }

    // 3. Registrar la acción de "reversión" en el historial
    registrarHistorialAnulacion(
        $mysqli,
        $slug_tienda,
        $historial['tipo_origen'],
        $historial['id_origen'],
        $historial['numero_origen'],
        $historial['cliente_nombre'],
        $historial['total'],
        'reversar', // <-- Nueva acción
        $cajero,
        "Reversión de la anulación anterior."
    );

    $mysqli->commit();
    echo json_encode(['success' => true, 'message' => 'Anulación revivida correctamente.']);

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