<?php
$pageTitle = 'Detalle de Orden';
require_once __DIR__ . '/../../config/config.php';
requireLogin();

$db = getDB();
$id = intval(isset($_GET['id']) ? $_GET['id'] : 0);

// Estructura mínima para control de gasto obligatorio por orden
try {
    $chkNoGasto = $db->query("SHOW COLUMNS FROM ordenes LIKE 'no_gasto_insumos'")->fetch();
    if (!$chkNoGasto) {
        $db->exec("ALTER TABLE ordenes ADD COLUMN no_gasto_insumos TINYINT(1) NOT NULL DEFAULT 0");
    }
} catch (Exception $e) {}

// ==== PROCESAR ACCIONES POST PRIMERO ====

// Cambiar laboratorista
if (isset($_POST['cambiar_laboratorista']) && $id > 0) {
    $laboratorista_id = !empty($_POST['laboratorista_id']) ? intval($_POST['laboratorista_id']) : null;
    $stmt = $db->prepare("UPDATE ordenes SET laboratorista_id = ? WHERE id = ?");
    $stmt->execute([$laboratorista_id, $id]);
    showAlert('Laboratorista actualizado correctamente');
    header('Location: view.php?id=' . $id);
    exit;
}

// Agregar gasto de inventario manual
if (isset($_POST['agregar_gasto_inventario']) && $id > 0) {
    try {
        $db->beginTransaction();
        
        $insumo_id = intval($_POST['insumo_id']);
        $cantidad = floatval($_POST['cantidad']);
        $motivo = sanitize(isset($_POST['motivo']) ? $_POST['motivo'] : 'Gasto adicional manual');
        
        // Obtener stock actual
        $stmtStock = $db->prepare("SELECT stock_actual FROM insumos WHERE id = ?");
        $stmtStock->execute([$insumo_id]);
        $stockActual = $stmtStock->fetchColumn();
        
        if ($stockActual === false) {
            throw new Exception('Insumo no encontrado');
        }
        
        $nuevoStock = $stockActual - $cantidad;
        
        // Actualizar stock
        $stmtUpdate = $db->prepare("UPDATE insumos SET stock_actual = ? WHERE id = ?");
        $stmtUpdate->execute([$nuevoStock, $insumo_id]);
        
        // Registrar movimiento
        $stmtMov = $db->prepare("
            INSERT INTO movimientos_inventario 
            (insumo_id, tipo, cantidad, stock_anterior, stock_nuevo, motivo, orden_id, usuario_id)
            VALUES (?, 'salida', ?, ?, ?, ?, ?, ?)
        ");
        $stmtMov->execute([
            $insumo_id,
            $cantidad,
            $stockActual,
            $nuevoStock,
            $motivo,
            $id,
            $_SESSION['user_id']
        ]);
        
        $db->commit();
        showAlert('Gasto de inventario agregado correctamente');
        header('Location: view.php?id=' . $id);
        exit;
        
    } catch (Exception $e) {
        $db->rollBack();
        showAlert('Error al agregar gasto: ' . $e->getMessage(), 'danger');
    }
}

// ==== OBTENER DATOS DE LA ORDEN ====

// Obtener orden
$stmt = $db->prepare("
    SELECT o.*, p.nombre, p.apellidos, p.documento_numero, p.sexo, p.fecha_nacimiento,
           u.nombre as usuario_nombre, lab.nombre as laboratorista_nombre, o.laboratorista_id,
           o.created_at, o.updated_at
    FROM ordenes o 
    JOIN pacientes p ON o.paciente_id = p.id 
    JOIN usuarios u ON o.usuario_id = u.id
    LEFT JOIN usuarios lab ON o.laboratorista_id = lab.id
    WHERE o.id = ?
");
$stmt->execute([$id]);
$orden = $stmt->fetch();

if (!$orden) {
    showAlert('Orden no encontrada', 'danger');
    header('Location: list.php');
    exit;
}

// Agregar examen a la orden
if (isset($_POST['agregar_examen_orden']) && $id > 0) {
    if ($orden['estado'] === 'entregada' || $orden['estado'] === 'cancelada') {
        showAlert('No se puede editar una orden entregada o cancelada', 'danger');
    } else {
        $examenNuevoId = intval($_POST['examen_nuevo_id'] ?? 0);
        if ($examenNuevoId <= 0) {
            showAlert('Seleccione un examen válido', 'danger');
        } else {
            try {
                $db->beginTransaction();

                $stmtDup = $db->prepare("SELECT id FROM orden_detalle WHERE orden_id = ? AND examen_id = ? LIMIT 1");
                $stmtDup->execute([$id, $examenNuevoId]);
                if ($stmtDup->fetch()) {
                    throw new Exception('Ese examen ya está agregado en la orden');
                }

                $stmtEx = $db->prepare("SELECT precio FROM examenes WHERE id = ? AND activo = 1 LIMIT 1");
                $stmtEx->execute([$examenNuevoId]);
                $precioEx = $stmtEx->fetchColumn();
                if ($precioEx === false) {
                    throw new Exception('Examen no encontrado o inactivo');
                }

                $stmtAdd = $db->prepare("INSERT INTO orden_detalle (orden_id, examen_id, precio, estado) VALUES (?, ?, ?, 'pendiente')");
                $stmtAdd->execute([$id, $examenNuevoId, $precioEx]);

                // Descargar automáticamente insumos del examen agregado
                $stmtInsumosEx = $db->prepare("SELECT * FROM examenes_insumos WHERE examen_id = ?");
                $stmtInsumosEx->execute([$examenNuevoId]);
                $insumosExamen = $stmtInsumosEx->fetchAll();

                foreach ($insumosExamen as $ins) {
                    $stmtStock = $db->prepare("SELECT stock_actual FROM insumos WHERE id = ?");
                    $stmtStock->execute([$ins['insumo_id']]);
                    $stockActual = floatval($stmtStock->fetchColumn());

                    $cantidadDescarga = floatval($ins['cantidad']);
                    $nuevoStock = $stockActual - $cantidadDescarga;

                    $stmtUpdStock = $db->prepare("UPDATE insumos SET stock_actual = ? WHERE id = ?");
                    $stmtUpdStock->execute([$nuevoStock, $ins['insumo_id']]);

                    $stmtMov = $db->prepare("
                        INSERT INTO movimientos_inventario
                        (insumo_id, tipo, cantidad, stock_anterior, stock_nuevo, motivo, orden_id, usuario_id)
                        VALUES (?, 'salida', ?, ?, ?, ?, ?, ?)
                    ");
                    $stmtMov->execute([
                        $ins['insumo_id'],
                        $cantidadDescarga,
                        $stockActual,
                        $nuevoStock,
                        'Descarga automática por agregar examen en orden ' . $orden['codigo'],
                        $id,
                        $_SESSION['user_id']
                    ]);
                }

                $stmtSub = $db->prepare("SELECT COALESCE(SUM(precio),0) FROM orden_detalle WHERE orden_id = ?");
                $stmtSub->execute([$id]);
                $nuevoSubtotal = floatval($stmtSub->fetchColumn());
                $descuento = floatval($orden['descuento']);
                $nuevoTotal = $nuevoSubtotal - $descuento;

                $stmtUpd = $db->prepare("UPDATE ordenes SET subtotal = ?, total = ?, no_gasto_insumos = 0 WHERE id = ?");
                $stmtUpd->execute([$nuevoSubtotal, $nuevoTotal, $id]);

                $db->commit();
                showAlert('Examen agregado correctamente. Debe confirmar gasto o marcar "No se gastó" para finalizar.');
                header('Location: view.php?id=' . $id);
                exit;
            } catch (Exception $e) {
                if ($db->inTransaction()) $db->rollBack();
                showAlert('Error al agregar examen: ' . $e->getMessage(), 'danger');
            }
        }
    }
}

// Quitar examen de la orden
if (isset($_POST['quitar_examen_orden']) && $id > 0) {
    if ($orden['estado'] === 'entregada' || $orden['estado'] === 'cancelada') {
        showAlert('No se puede editar una orden entregada o cancelada', 'danger');
    } else {
        $detalleId = intval($_POST['detalle_id'] ?? 0);
        try {
            $db->beginTransaction();

            $stmtCount = $db->prepare("SELECT COUNT(*) FROM orden_detalle WHERE orden_id = ?");
            $stmtCount->execute([$id]);
            $cantidadActual = intval($stmtCount->fetchColumn());
            if ($cantidadActual <= 1) {
                throw new Exception('La orden debe tener al menos un examen');
            }

            // Obtener examen del detalle a quitar para reintegrar insumos
            $stmtDet = $db->prepare("SELECT examen_id FROM orden_detalle WHERE id = ? AND orden_id = ? LIMIT 1");
            $stmtDet->execute([$detalleId, $id]);
            $examenQuitarId = intval($stmtDet->fetchColumn());
            if ($examenQuitarId <= 0) {
                throw new Exception('No se encontró el examen a quitar');
            }

            // Reintegrar automáticamente insumos al quitar examen
            $stmtInsumosEx = $db->prepare("SELECT * FROM examenes_insumos WHERE examen_id = ?");
            $stmtInsumosEx->execute([$examenQuitarId]);
            $insumosExamen = $stmtInsumosEx->fetchAll();

            foreach ($insumosExamen as $ins) {
                $stmtStock = $db->prepare("SELECT stock_actual FROM insumos WHERE id = ?");
                $stmtStock->execute([$ins['insumo_id']]);
                $stockActual = floatval($stmtStock->fetchColumn());

                $cantidadRetorno = floatval($ins['cantidad']);
                $nuevoStock = $stockActual + $cantidadRetorno;

                $stmtUpdStock = $db->prepare("UPDATE insumos SET stock_actual = ? WHERE id = ?");
                $stmtUpdStock->execute([$nuevoStock, $ins['insumo_id']]);

                $stmtMov = $db->prepare("
                    INSERT INTO movimientos_inventario
                    (insumo_id, tipo, cantidad, stock_anterior, stock_nuevo, motivo, orden_id, usuario_id)
                    VALUES (?, 'entrada', ?, ?, ?, ?, ?, ?)
                ");
                $stmtMov->execute([
                    $ins['insumo_id'],
                    $cantidadRetorno,
                    $stockActual,
                    $nuevoStock,
                    'Reintegro automático por quitar examen en orden ' . $orden['codigo'],
                    $id,
                    $_SESSION['user_id']
                ]);
            }

            $stmtDel = $db->prepare("DELETE FROM orden_detalle WHERE id = ? AND orden_id = ?");
            $stmtDel->execute([$detalleId, $id]);
            if ($stmtDel->rowCount() === 0) {
                throw new Exception('No se encontró el examen a quitar');
            }

            $stmtSub = $db->prepare("SELECT COALESCE(SUM(precio),0) FROM orden_detalle WHERE orden_id = ?");
            $stmtSub->execute([$id]);
            $nuevoSubtotal = floatval($stmtSub->fetchColumn());
            $descuento = floatval($orden['descuento']);
            $nuevoTotal = $nuevoSubtotal - $descuento;

            $stmtUpd = $db->prepare("UPDATE ordenes SET subtotal = ?, total = ?, no_gasto_insumos = 0 WHERE id = ?");
            $stmtUpd->execute([$nuevoSubtotal, $nuevoTotal, $id]);

            $db->commit();
            showAlert('Examen quitado correctamente. Debe confirmar gasto o marcar "No se gastó" para finalizar.');
            header('Location: view.php?id=' . $id);
            exit;
        } catch (Exception $e) {
            if ($db->inTransaction()) $db->rollBack();
            showAlert('Error al quitar examen: ' . $e->getMessage(), 'danger');
        }
    }
}

// Marcar explícitamente que no hubo gasto de insumos
if (isset($_POST['marcar_no_gasto']) && $id > 0) {
    if ($orden['estado'] === 'entregada' || $orden['estado'] === 'cancelada') {
        showAlert('No se puede cambiar esta confirmación en una orden entregada o cancelada', 'danger');
    } else {
        $db->prepare("UPDATE ordenes SET no_gasto_insumos = 1 WHERE id = ?")->execute([$id]);
        showAlert('Se marcó la orden como "No se gastó"');
        header('Location: view.php?id=' . $id);
        exit;
    }
}

// Editar hora de recepción (solo admin)
if (isset($_POST['editar_hora_recepcion']) && $id > 0) {
    if (!isset($_SESSION['rol']) || strtolower($_SESSION['rol']) !== 'admin') {
        showAlert('No tiene permisos para editar la hora de recepción', 'danger');
        header('Location: view.php?id=' . $id);
        exit;
    }

    $nuevaFechaHora = trim($_POST['fecha_orden'] ?? '');
    $ts = strtotime($nuevaFechaHora);
    if ($ts === false) {
        showAlert('Fecha/hora inválida', 'danger');
        header('Location: view.php?id=' . $id);
        exit;
    }

    $fechaFormateada = date('Y-m-d H:i:s', $ts);
    $stmtUpd = $db->prepare("UPDATE ordenes SET fecha_orden = ?, updated_at = NOW() WHERE id = ?");
    $stmtUpd->execute([$fechaFormateada, $id]);

    showAlert('Hora de recepción actualizada correctamente');
    header('Location: view.php?id=' . $id);
    exit;
}

if (isset($_POST['desmarcar_no_gasto']) && $id > 0) {
    if ($orden['estado'] === 'entregada' || $orden['estado'] === 'cancelada') {
        showAlert('No se puede cambiar esta confirmación en una orden entregada o cancelada', 'danger');
    } else {
        $db->prepare("UPDATE ordenes SET no_gasto_insumos = 0 WHERE id = ?")->execute([$id]);
        showAlert('Se quitó la marca de "No se gastó"');
        header('Location: view.php?id=' . $id);
        exit;
    }
}

// Calcular edad del paciente
$edad = null;
if ($orden['fecha_nacimiento']) {
    $edad = date_diff(date_create($orden['fecha_nacimiento']), date_create('today'))->y;
}

// Obtener exámenes de la orden
$stmt = $db->prepare("
    SELECT od.*, e.nombre as examen_nombre, e.codigo as examen_codigo
    FROM orden_detalle od
    JOIN examenes e ON od.examen_id = e.id
    WHERE od.orden_id = ?
");
$stmt->execute([$id]);
$detalles = $stmt->fetchAll();

$puedeEditarOrden = ($orden['estado'] !== 'entregada' && $orden['estado'] !== 'cancelada');

// Exámenes disponibles para agregar (que aún no están en la orden)
$examenesDisponibles = [];
if ($puedeEditarOrden) {
    $idsActuales = array_map(function($d){ return intval($d['examen_id']); }, $detalles);
    if (!empty($idsActuales)) {
        $placeholders = implode(',', array_fill(0, count($idsActuales), '?'));
        $stmtDisp = $db->prepare("SELECT id, codigo, nombre, precio FROM examenes WHERE activo = 1 AND id NOT IN ($placeholders) ORDER BY nombre");
        $stmtDisp->execute($idsActuales);
    } else {
        $stmtDisp = $db->query("SELECT id, codigo, nombre, precio FROM examenes WHERE activo = 1 ORDER BY nombre");
    }
    $examenesDisponibles = $stmtDisp->fetchAll();
}

// Obtener pagos
$stmt = $db->prepare("SELECT * FROM pagos WHERE orden_id = ? ORDER BY fecha_pago");
$stmt->execute([$id]);
$pagos = $stmt->fetchAll();

$totalPagado = array_sum(array_column($pagos, 'monto'));
$saldoPendiente = $orden['total'] - $totalPagado;

// Obtener movimientos de inventario relacionados con esta orden
$stmt = $db->prepare("
    SELECT mi.*, i.nombre as insumo_nombre, i.unidad_medida, i.codigo
    FROM movimientos_inventario mi
    JOIN insumos i ON mi.insumo_id = i.id
    WHERE mi.orden_id = ? AND mi.tipo = 'salida'
    ORDER BY mi.fecha_movimiento DESC
");
$stmt->execute([$id]);
$insumosGastados = $stmt->fetchAll();

$gastoValidado = (!empty($insumosGastados) || !empty($orden['no_gasto_insumos']));

// Cambiar estado (GET action)
if (isset($_GET['action']) && $_GET['action'] == 'cambiar_estado') {
    $nuevoEstado = isset($_GET['nuevo_estado']) ? $_GET['nuevo_estado'] : '';
    $estadosPermitidos = ['pendiente', 'en_proceso', 'completada', 'entregada', 'cancelada'];
    
    if (in_array($nuevoEstado, $estadosPermitidos)) {
        if (($nuevoEstado === 'completada' || $nuevoEstado === 'entregada') && !$gastoValidado) {
            showAlert('Antes de finalizar o entregar debe confirmar gasto de insumos, o marcar "No se gastó"', 'warning');
            header('Location: view.php?id=' . $id);
            exit;
        }
        $stmt = $db->prepare("UPDATE ordenes SET estado = ? WHERE id = ?");
        $stmt->execute([$nuevoEstado, $id]);
        showAlert('Estado actualizado correctamente');
        header('Location: view.php?id=' . $id);
        exit;
    }
}

// Carga insumos preconfigurados para los exámenes de la orden
$insumosPreconfigurados = [];
try {
    $stmtInsPre = $db->prepare("
        SELECT
            i.id as insumo_id, i.nombre as insumo_nombre, i.codigo as insumo_codigo,
            i.unidad_medida, i.stock_actual,
            e.nombre as examen_nombre,
            ei.cantidad as cantidad_config
        FROM orden_detalle od
        JOIN examenes e ON e.id = od.examen_id
        JOIN examenes_insumos ei ON ei.examen_id = od.examen_id
        JOIN insumos i ON i.id = ei.insumo_id
        WHERE od.orden_id = ? AND i.activo = 1
        ORDER BY e.nombre, i.nombre
    ");
    $stmtInsPre->execute([$id]);
    $insumosPreconfigurados = $stmtInsPre->fetchAll();
} catch (Exception $e) { $insumosPreconfigurados = []; }

require_once __DIR__ . '/../../includes/header.php';
?>

<div class="d-flex justify-content-between align-items-center mt-4 mb-4">
    <h2><i class="bi bi-clipboard2-pulse"></i> Orden <?= $orden['codigo'] ?></h2>
    <div>
        <a href="print_label.php?id=<?= $id ?>" class="btn btn-outline-primary" target="_blank">
            <i class="bi bi-upc-scan"></i> Imprimir Viñeta
        </a>
        <a href="print.php?id=<?= $id ?>" class="btn btn-outline-secondary" target="_blank">
            <i class="bi bi-printer"></i> Imprimir
        </a>
        <?php if ($orden['estado'] == 'completada' || $orden['estado'] == 'entregada'): ?>
        <a href="<?= SITE_URL ?>/modules/resultados/print.php?orden_id=<?= $id ?>" 
           class="btn btn-success" target="_blank">
            <i class="bi bi-file-earmark-pdf"></i> Ver PDF Resultados
        </a>
        <a href="<?= SITE_URL ?>/modules/resultados/print.php?orden_id=<?= $id ?>&descargar_pdf=1" 
           class="btn btn-danger" target="_blank">
            <i class="bi bi-download"></i> Descargar PDF
        </a>
        <?php endif; ?>
        <a href="list.php" class="btn btn-outline-secondary">
            <i class="bi bi-arrow-left"></i> Volver
        </a>
    </div>
</div>

<div class="row">
    <div class="col-md-8">
        <!-- Info de la Orden -->
        <div class="card mb-4">
            <div class="card-header d-flex justify-content-between align-items-center">
                <h5 class="mb-0"><i class="bi bi-info-circle"></i> Información de la Orden</h5>
                <?php
                $estadoClass = [
                    'pendiente' => 'bg-warning',
                    'en_proceso' => 'bg-info',
                    'completada' => 'bg-success',
                    'entregada' => 'bg-primary',
                    'cancelada' => 'bg-danger'
                ];
                ?>
                <span class="badge <?= $estadoClass[$orden['estado']] ?> fs-6">
                    <?= ucfirst(str_replace('_', ' ', $orden['estado'])) ?>
                </span>
            </div>
            <div class="card-body">
                <div class="row">
                    <div class="col-md-6">
                        <table class="table table-borderless">
                            <tr>
                                <td width="40%"><strong>Código:</strong></td>
                                <td><?= $orden['codigo'] ?></td>
                            </tr>
                            <tr>
                                <td><strong>Paciente:</strong></td>
                                <td>
                                    <a href="<?= SITE_URL ?>/modules/pacientes/view.php?id=<?= $orden['paciente_id'] ?>">
                                        <?= $orden['nombre'] . ' ' . $orden['apellidos'] ?>
                                    </a>
                                </td>
                            </tr>
                            <tr>
                                <td><strong>Documento:</strong></td>
                                <td><?= $orden['documento_numero'] ?></td>
                            </tr>
                            <tr>
                                <td><strong>Sexo/Edad:</strong></td>
                                <td>
                                    <?= $orden['sexo'] == 'M' ? 'Masculino' : 'Femenino' ?>
                                    <?= $edad ? "/ $edad años" : '' ?>
                                </td>
                            </tr>
                        </table>
                    </div>
                    <div class="col-md-6">
                        <table class="table table-borderless">
                            <tr>
                                <td width="40%"><strong>Fecha Orden:</strong></td>
                                <td>
                                    <?= formatDateTime($orden['fecha_orden']) ?>
                                    <?php if (isset($_SESSION['rol']) && strtolower($_SESSION['rol']) === 'admin'): ?>
                                        <button type="button" class="btn btn-sm btn-outline-secondary ms-2" 
                                                data-bs-toggle="modal" data-bs-target="#modalEditarHora" title="Editar hora de recepción">
                                            <i class="bi bi-clock"></i>
                                        </button>
                                    <?php endif; ?>
                                </td>
                            </tr>
                            <tr>
                                <td><strong>Médico:</strong></td>
                                <td><?= $orden['medico_solicitante'] ?: '-' ?></td>
                            </tr>
                            <tr>
                                <td><strong>Fecha Entrega:</strong></td>
                                <td><?= $orden['fecha_entrega_estimada'] ? formatDate($orden['fecha_entrega_estimada']) : '-' ?></td>
                            </tr>
                            <tr>
                                <td><strong>Atendido por:</strong></td>
                                <td><?= $orden['usuario_nombre'] ?></td>
                            </tr>
                            <tr>
                                <td><strong>Laboratorista:</strong></td>
                                <td>
                                    <?php if ($orden['laboratorista_nombre']): ?>
                                        <span class="badge bg-info"><?= htmlspecialchars($orden['laboratorista_nombre']) ?></span>
                                    <?php else: ?>
                                        <span class="text-muted">Sin asignar</span>
                                    <?php endif; ?>
                                    <?php if ($orden['estado'] != 'entregada' && $orden['estado'] != 'cancelada'): ?>
                                    <button type="button" class="btn btn-sm btn-outline-primary ms-2" 
                                            data-bs-toggle="modal" data-bs-target="#modalLaboratorista">
                                        <i class="bi bi-pencil"></i>
                                    </button>
                                    <?php endif; ?>
                                </td>
                            </tr>
                        </table>
                    </div>
                </div>
                
                <?php if ($orden['observaciones']): ?>
                <div class="alert alert-info mb-0">
                    <strong>Observaciones:</strong> <?= htmlspecialchars($orden['observaciones']) ?>
                </div>
                <?php endif; ?>
                
                <!-- Información adicional -->
                <div class="row mt-3 pt-3 border-top">
                    <div class="col-md-6">
                        <small class="text-muted d-block"><i class="bi bi-clock"></i> <strong>Creada:</strong></small>
                        <small><?= formatDateTime($orden['created_at']) ?></small>
                    </div>
                    <div class="col-md-6">
                        <small class="text-muted d-block"><i class="bi bi-pencil"></i> <strong>Actualizada:</strong></small>
                        <small><?= formatDateTime($orden['updated_at']) ?></small>
                    </div>
                </div>
            </div>
        </div>

        <!-- Exámenes -->
        <div class="card mb-4">
            <div class="card-header d-flex justify-content-between align-items-center">
                <h5 class="mb-0"><i class="bi bi-droplet"></i> Exámenes Solicitados</h5>
                <?php if ($puedeEditarOrden): ?>
                <button type="button" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#modalEditarExamenes">
                    <i class="bi bi-pencil-square"></i> Editar Exámenes
                </button>
                <?php endif; ?>
            </div>
            <div class="card-body">
                <table class="table">
                    <thead>
                        <tr>
                            <th>Código</th>
                            <th>Examen</th>
                            <th>Precio</th>
                            <th>Estado</th>
                            <th width="100">Acciones</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($detalles as $det): ?>
                        <tr>
                            <td><?= $det['examen_codigo'] ?></td>
                            <td><?= $det['examen_nombre'] ?></td>
                            <td><?= formatMoney($det['precio']) ?></td>
                            <td>
                                <?php
                                $estClass = [
                                    'pendiente' => 'bg-warning',
                                    'en_proceso' => 'bg-info',
                                    'completado' => 'bg-success'
                                ];
                                ?>
                                <span class="badge <?= $estClass[$det['estado']] ?>">
                                    <?= ucfirst($det['estado']) ?>
                                </span>
                            </td>
                            <td>
                                <?php if ($det['estado'] == 'completado'): ?>
                                <button class="btn btn-sm btn-outline-success" title="Completado">
                                    <i class="bi bi-check-circle-fill"></i>
                                </button>
                                <?php endif; ?>
                                <?php if ($puedeEditarOrden): ?>
                                <form method="POST" class="d-inline" onsubmit="return confirm('¿Quitar este examen de la orden?')">
                                    <input type="hidden" name="detalle_id" value="<?= $det['id'] ?>">
                                    <button type="submit" name="quitar_examen_orden" class="btn btn-sm btn-outline-danger" title="Quitar examen">
                                        <i class="bi bi-x-lg"></i>
                                    </button>
                                </form>
                                <?php endif; ?>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                    <tfoot>
                        <tr>
                            <td colspan="2" class="text-end"><strong>Subtotal:</strong></td>
                            <td colspan="3"><strong><?= formatMoney($orden['subtotal']) ?></strong></td>
                        </tr>
                        <?php if ($orden['descuento'] > 0): ?>
                        <tr>
                            <td colspan="2" class="text-end">Descuento:</td>
                            <td colspan="3">-<?= formatMoney($orden['descuento']) ?></td>
                        </tr>
                        <?php endif; ?>
                        <tr class="table-primary">
                            <td colspan="2" class="text-end"><strong>TOTAL:</strong></td>
                            <td colspan="3"><strong class="h5"><?= formatMoney($orden['total']) ?></strong></td>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
        
        <!-- Botones de Acción Rápida -->
        <div class="card mb-4">
            <div class="card-header">
                <h5 class="mb-0"><i class="bi bi-lightning-charge"></i> Acciones Rápidas</h5>
            </div>
            <div class="card-body">
                <div class="d-grid gap-2">
                    <?php if ($orden['estado'] != 'cancelada' && $orden['estado'] != 'entregada'): ?>
                    <a href="<?= SITE_URL ?>/modules/resultados/edit.php?orden_id=<?= $id ?>" class="btn btn-success">
                        <i class="bi bi-pencil"></i> Ingresar Resultados
                    </a>
                    <?php endif; ?>
                    
                    <?php if ($orden['estado'] == 'completada' || $orden['estado'] == 'entregada'): ?>
                    <a href="<?= SITE_URL ?>/modules/resultados/print.php?orden_id=<?= $id ?>" 
                       class="btn btn-outline-success" target="_blank">
                        <i class="bi bi-file-earmark-pdf"></i> Ver PDF Resultados
                    </a>
                    <a href="<?= SITE_URL ?>/modules/resultados/print.php?orden_id=<?= $id ?>&descargar_pdf=1" 
                       class="btn btn-outline-danger" target="_blank">
                        <i class="bi bi-download"></i> Descargar PDF Resultados
                    </a>
                    <?php endif; ?>
                    
                    <?php if ($orden['estado'] != 'entregada' && $orden['estado'] != 'cancelada'): ?>
                    <button type="button" class="btn btn-outline-warning" 
                            data-bs-toggle="modal" data-bs-target="#modalInsumos">
                        <i class="bi bi-box-seam"></i> Ver/Agregar Gastos de Insumos
                    </button>
                    <?php endif; ?>
                    
                    <a href="print.php?id=<?= $id ?>" class="btn btn-outline-secondary" target="_blank">
                        <i class="bi bi-printer"></i> Imprimir Orden
                    </a>
                    <a href="print_label.php?id=<?= $id ?>" class="btn btn-outline-primary" target="_blank">
                        <i class="bi bi-upc-scan"></i> Imprimir Viñeta (Tubo)
                    </a>
                </div>
            </div>
        </div>
    </div>

    <div class="col-md-4">
        <!-- Estado y Acciones -->
        <div class="card mb-4">
            <div class="card-header">
                <h5 class="mb-0"><i class="bi bi-gear"></i> Acciones</h5>
            </div>
            <div class="card-body">
                <?php if ($puedeEditarOrden): ?>
                <div class="alert <?= $gastoValidado ? 'alert-success' : 'alert-warning' ?> py-2">
                    <div class="small mb-2">
                        <strong>Validación de gasto:</strong>
                        <?= $gastoValidado ? 'Confirmado' : 'Pendiente (obligatorio para finalizar/entregar)' ?>
                    </div>
                    <?php if (!empty($orden['no_gasto_insumos'])): ?>
                    <form method="POST" class="d-inline">
                        <button type="submit" name="desmarcar_no_gasto" class="btn btn-sm btn-outline-secondary">
                            <i class="bi bi-arrow-counterclockwise"></i> Quitar "No se gastó"
                        </button>
                    </form>
                    <?php else: ?>
                    <form method="POST" class="d-inline">
                        <button type="submit" name="marcar_no_gasto" class="btn btn-sm btn-outline-warning">
                            <i class="bi bi-slash-circle"></i> Marcar "No se gastó"
                        </button>
                    </form>
                    <?php endif; ?>
                </div>
                <?php endif; ?>

                <?php if ($orden['estado'] != 'cancelada'): ?>
                <label class="form-label">Cambiar Estado:</label>
                <div class="d-grid gap-2">
                    <?php if ($orden['estado'] == 'pendiente'): ?>
                    <a href="?id=<?= $id ?>&action=cambiar_estado&nuevo_estado=en_proceso" 
                       class="btn btn-info">
                        <i class="bi bi-play"></i> Iniciar Proceso
                    </a>
                    <?php endif; ?>
                    
                    <?php if ($orden['estado'] == 'en_proceso'): ?>
                    <a href="?id=<?= $id ?>&action=cambiar_estado&nuevo_estado=completada" 
                       class="btn btn-success">
                        <i class="bi bi-check-lg"></i> Marcar Completada
                    </a>
                    <?php endif; ?>
                    
                    <?php if ($orden['estado'] == 'completada'): ?>
                    <a href="?id=<?= $id ?>&action=cambiar_estado&nuevo_estado=entregada" 
                       class="btn btn-primary">
                        <i class="bi bi-box-arrow-right"></i> Marcar Entregada
                    </a>
                    <?php endif; ?>
                    
                    <?php if ($orden['estado'] != 'entregada'): ?>
                    <a href="?id=<?= $id ?>&action=cambiar_estado&nuevo_estado=cancelada" 
                       class="btn btn-outline-danger"
                       onclick="return confirm('¿Está seguro de cancelar esta orden?')">
                        <i class="bi bi-x-lg"></i> Cancelar Orden
                    </a>
                    <?php endif; ?>
                </div>
                <?php else: ?>
                <div class="alert alert-danger mb-0">
                    <i class="bi bi-x-circle"></i> Esta orden ha sido cancelada
                </div>
                <?php endif; ?>
            </div>
        </div>

        <!-- Pagos -->
        <div class="card">
            <div class="card-header d-flex justify-content-between align-items-center">
                <h5 class="mb-0"><i class="bi bi-cash-stack"></i> Pagos</h5>
                <?php if ($saldoPendiente > 0 && $orden['estado'] != 'cancelada'): ?>
                <a href="<?= SITE_URL ?>/modules/caja/pago.php?orden_id=<?= $id ?>" class="btn btn-sm btn-warning">
                    <i class="bi bi-plus"></i> Cobrar
                </a>
                <?php endif; ?>
            </div>
            <div class="card-body">
                <?php if (empty($pagos)): ?>
                <p class="text-muted text-center">No hay pagos registrados</p>
                <?php else: ?>
                <ul class="list-group list-group-flush mb-3">
                    <?php foreach ($pagos as $pago): ?>
                    <li class="list-group-item d-flex justify-content-between">
                        <div>
                            <small class="text-muted"><?= formatDateTime($pago['fecha_pago']) ?></small>
                            <br>
                            <small><?= ucfirst($pago['metodo_pago']) ?></small>
                        </div>
                        <strong class="text-success"><?= formatMoney($pago['monto']) ?></strong>
                    </li>
                    <?php endforeach; ?>
                </ul>
                <?php endif; ?>
                
                <hr>
                
                <div class="d-flex justify-content-between mb-2">
                    <span>Total Orden:</span>
                    <strong><?= formatMoney($orden['total']) ?></strong>
                </div>
                <div class="d-flex justify-content-between mb-2">
                    <span>Pagado:</span>
                    <strong class="text-success"><?= formatMoney($totalPagado) ?></strong>
                </div>
                <div class="d-flex justify-content-between">
                    <span class="h6">Saldo Pendiente:</span>
                    <strong class="h6 <?= $saldoPendiente > 0 ? 'text-danger' : 'text-success' ?>">
                        <?= formatMoney($saldoPendiente) ?>
                    </strong>
                </div>
                
                <?php if ($saldoPendiente <= 0): ?>
                <div class="alert alert-success mt-3 mb-0 text-center">
                    <i class="bi bi-check-circle"></i> Pagado Completo
                </div>
                <?php endif; ?>
            </div>
        </div>
    </div>
</div>

<!-- Modal editar exámenes de la orden -->
<?php if ($puedeEditarOrden): ?>
<div class="modal fade" id="modalEditarExamenes" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <form method="POST">
                <div class="modal-header">
                    <h5 class="modal-title"><i class="bi bi-pencil-square"></i> Editar Exámenes de la Orden</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body">
                    <?php if (empty($examenesDisponibles)): ?>
                    <div class="alert alert-info mb-0">No hay más exámenes activos para agregar.</div>
                    <?php else: ?>
                    <div class="mb-2">
                        <label class="form-label fw-semibold">Buscar examen</label>
                        <input type="text" id="buscadorExamenModal" class="form-control mb-2"
                               placeholder="Escriba código o nombre del examen..."
                               autocomplete="off"
                               oninput="filtrarExamenesModal()">
                        <div id="listaExamenesModal" style="max-height:340px; overflow-y:auto; border:1px solid #dee2e6; border-radius:6px;">
                            <div id="sinResultadosExamen" class="text-center text-muted py-3" style="display:none;">No se encontraron exámenes.</div>
                            <?php foreach ($examenesDisponibles as $exd): ?>
                            <div class="examen-opcion-modal d-flex justify-content-between align-items-center px-3 py-2"
                                 style="cursor:pointer; border-bottom:1px solid #f0f0f0;"
                                 data-id="<?= $exd['id'] ?>"
                                 data-texto="<?= htmlspecialchars(mb_strtolower($exd['codigo'] . ' ' . $exd['nombre'], 'UTF-8')) ?>"
                                 onclick="seleccionarExamenModal(this)">
                                <div>
                                    <span class="fw-semibold"><?= htmlspecialchars($exd['nombre']) ?></span>
                                    <span class="text-muted ms-2" style="font-size:12px;"><?= htmlspecialchars($exd['codigo']) ?></span>
                                </div>
                                <span class="badge bg-success"><?= formatMoney($exd['precio']) ?></span>
                            </div>
                            <?php endforeach; ?>
                        </div>
                        <input type="hidden" name="examen_nuevo_id" id="examenNuevoIdHidden" required>
                        <div id="examenSeleccionadoInfo" class="mt-2 d-none alert alert-primary py-2 px-3" style="font-size:13px;"></div>
                        <small class="text-muted">Al agregar o quitar exámenes se recalcula subtotal/total y se vuelve a pedir validar gasto.</small>
                    </div>
                    <?php endif; ?>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
                    <?php if (!empty($examenesDisponibles)): ?>
                    <button type="submit" name="agregar_examen_orden" class="btn btn-primary" id="btnAgregarExamen" disabled>
                        <i class="bi bi-plus-lg"></i> Agregar Examen
                    </button>
                    <?php endif; ?>
                </div>
            </form>
        </div>
    </div>
</div>
<?php endif; ?>

<!-- Modal para editar hora de recepción (admin) -->
<?php if (isset($_SESSION['rol']) && strtolower($_SESSION['rol']) === 'admin'): ?>
<div class="modal fade" id="modalEditarHora" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <form method="POST">
                <div class="modal-header">
                    <h5 class="modal-title"><i class="bi bi-clock"></i> Editar Hora de Recepción</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body">
                    <label class="form-label">Fecha y hora de recepción</label>
                    <input type="datetime-local" name="fecha_orden" class="form-control" required
                           value="<?= date('Y-m-d\TH:i', strtotime($orden['fecha_orden'])) ?>">
                    <div class="form-text">Formato local. Solo administradores pueden modificar esto.</div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" name="editar_hora_recepcion" class="btn btn-primary">Guardar</button>
                </div>
            </form>
        </div>
    </div>
</div>
<?php endif; ?>

<!-- Modal para cambiar laboratorista -->
<div class="modal fade" id="modalLaboratorista" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <form method="POST">
                <div class="modal-header">
                    <h5 class="modal-title"><i class="bi bi-person-badge"></i> Asignar Laboratorista</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body">
                    <label class="form-label">Seleccionar Laboratorista Encargado</label>
                    <select name="laboratorista_id" class="form-select" required>
                        <option value="">Sin asignar</option>
                        <?php
                        $stmtLabs = $db->query("SELECT id, nombre FROM usuarios WHERE rol = 'laboratorista' AND activo = 1 ORDER BY nombre");
                        while ($lab = $stmtLabs->fetch()):
                        ?>
                        <option value="<?= $lab['id'] ?>" <?= ($orden['laboratorista_id'] ?? 0) == $lab['id'] ? 'selected' : '' ?>>
                            <?= htmlspecialchars($lab['nombre']) ?>
                        </option>
                        <?php endwhile; ?>
                    </select>
                    <small class="text-muted">El laboratorista será responsable de procesar los resultados</small>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" name="cambiar_laboratorista" class="btn btn-primary">
                        <i class="bi bi-check-lg"></i> Guardar
                    </button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- Modal de Insumos Gastados -->
<div class="modal fade" id="modalInsumos" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-box-seam"></i> Insumos Gastados - Orden <?= $orden['codigo'] ?></h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <?php if (empty($insumosGastados)): ?>
                <div class="alert alert-info">
                    <i class="bi bi-info-circle"></i> No hay insumos gastados registrados para esta orden.
                    <br>
                    <small>Los insumos se descuentan automáticamente al crear la orden.</small>
                </div>
                <?php else: ?>
                <div class="table-responsive">
                    <table class="table table-sm">
                        <thead>
                            <tr>
                                <th>Código</th>
                                <th>Insumo</th>
                                <th>Cantidad</th>
                                <th>Stock Anterior</th>
                                <th>Stock Nuevo</th>
                                <th>Fecha</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($insumosGastados as $mov): ?>
                            <tr>
                                <td><code><?= htmlspecialchars($mov['codigo']) ?></code></td>
                                <td><?= htmlspecialchars($mov['insumo_nombre']) ?></td>
                                <td>
                                    <span class="badge bg-danger"><?= $mov['cantidad'] ?></span>
                                    <?= $mov['unidad_medida'] ?>
                                </td>
                                <td><?= $mov['stock_anterior'] ?></td>
                                <td>
                                    <span class="<?= $mov['stock_nuevo'] < 0 ? 'text-danger fw-bold' : '' ?>">
                                        <?= $mov['stock_nuevo'] ?>
                                    </span>
                                </td>
                                <td><small><?= formatDateTime($mov['fecha_movimiento']) ?></small></td>
                            </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
                
                <?php 
                // Verificar si hay stock negativo
                $hayStockNegativo = false;
                foreach ($insumosGastados as $mov) {
                    if ($mov['stock_nuevo'] < 0) {
                        $hayStockNegativo = true;
                        break;
                    }
                }
                if ($hayStockNegativo): 
                ?>
                <div class="alert alert-warning mt-3">
                    <i class="bi bi-exclamation-triangle"></i> <strong>Advertencia:</strong> Algunos insumos quedaron con stock negativo.
                    <a href="<?= SITE_URL ?>/modules/inventario/list.php" target="_blank" class="alert-link">Ir a Inventario</a>
                </div>
                <?php endif; ?>
                <?php endif; ?>
            </div>
            <div class="modal-footer">
                <?php if ($orden['estado'] != 'entregada'): ?>
                <button type="button" class="btn btn-success" onclick="abrirModalGasto()">
                    <i class="bi bi-plus-circle"></i> Agregar Gasto Manual
                </button>
                <?php endif; ?>
                <a href="<?= SITE_URL ?>/modules/inventario/list.php" target="_blank" class="btn btn-outline-primary">
                    <i class="bi bi-box-seam"></i> Ver Inventario Completo
                </a>
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
            </div>
        </div>
    </div>
</div>

<!-- Modal Agregar Gastos de Inventario (Múltiples) -->
<div class="modal fade" id="agregarGastoModal" tabindex="-1" data-bs-backdrop="static">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-plus-circle"></i> Agregar Gastos de Inventario</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <?php if (!empty($insumosPreconfigurados)): ?>
                <!-- Sección de insumos preconfigurados -->
                <div id="seccionPrecarga" class="mb-3">
                    <h6 class="text-primary mb-1"><i class="bi bi-boxes"></i> Insumos Preconfigurados</h6>
                    <p class="text-muted small mb-2">Marque los insumos a descontar. Puede editar las cantidades antes de confirmar.</p>
                    <div class="table-responsive">
                        <table class="table table-sm table-bordered mb-2" id="tablaPreconfig">
                            <thead class="table-light">
                                <tr>
                                    <th width="30"><input type="checkbox" id="chkTodosPrec" checked onchange="toggleTodosPreconfigurados(this)" title="Seleccionar todos"></th>
                                    <th>Examen</th>
                                    <th>Insumo</th>
                                    <th width="110">Cantidad</th>
                                    <th>Unidad</th>
                                </tr>
                            </thead>
                            <tbody id="tbodyPreconfig">
                                <?php foreach ($insumosPreconfigurados as $insPre): ?>
                                <tr class="fila-preconfig">
                                    <td class="text-center">
                                        <input type="checkbox" class="chk-preconfig" checked
                                               value="<?= $insPre['insumo_id'] ?>"
                                               data-nombre="<?= htmlspecialchars($insPre['insumo_nombre']) ?>"
                                               data-unidad="<?= htmlspecialchars($insPre['unidad_medida']) ?>"
                                               data-stock="<?= $insPre['stock_actual'] ?>">
                                    </td>
                                    <td><small class="text-muted"><?= htmlspecialchars($insPre['examen_nombre']) ?></small></td>
                                    <td><small><?= htmlspecialchars($insPre['insumo_nombre']) ?></small></td>
                                    <td>
                                        <input type="number" class="form-control form-control-sm cant-preconfig"
                                               value="<?= $insPre['cantidad_config'] ?>" step="0.01" min="0.01">
                                    </td>
                                    <td><small><?= htmlspecialchars($insPre['unidad_medida']) ?></small></td>
                                </tr>
                                <?php endforeach; ?>
                            </tbody>
                        </table>
                    </div>
                    <button type="button" class="btn btn-warning btn-sm" onclick="confirmarInsumosPreconfigurados()" id="btnConfirmarPrec">
                        <i class="bi bi-check-all"></i> Confirmar Seleccionados
                    </button>
                    <span id="precargaStatus" class="ms-2 small"></span>
                </div>
                <hr class="my-2">
                <?php endif; ?>

                <!-- Lista de gastos agregados -->
                <div id="gastosAgregados" class="mb-3" style="display: none;">
                    <h6><i class="bi bi-check-circle text-success"></i> Gastos Agregados:</h6>
                    <ul class="list-group list-group-flush" id="listaGastosAgregados"></ul>
                </div>
                
                <hr id="separadorGastos" style="display: none;">
                
                <!-- Formulario para agregar -->
                <div class="row g-3">
                    <div class="col-md-5">
                        <label class="form-label">Insumo <span class="text-danger">*</span></label>
                        <select id="gasto_insumo_id" class="form-select" required>
                            <option value="">Seleccionar insumo...</option>
                            <?php
                            $stmtInsumos = $db->query("SELECT id, nombre, stock_actual, unidad_medida FROM insumos WHERE activo = 1 ORDER BY nombre");
                            $insumosArray = $stmtInsumos->fetchAll();
                            foreach ($insumosArray as $insumo):
                            ?>
                            <option value="<?= $insumo['id'] ?>" 
                                    data-stock="<?= $insumo['stock_actual'] ?>" 
                                    data-nombre="<?= htmlspecialchars($insumo['nombre']) ?>"
                                    data-unidad="<?= htmlspecialchars($insumo['unidad_medida']) ?>">
                                <?= $insumo['nombre'] ?> (Stock: <?= $insumo['stock_actual'] ?> <?= $insumo['unidad_medida'] ?>)
                            </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    
                    <div class="col-md-3">
                        <label class="form-label">Cantidad <span class="text-danger">*</span></label>
                        <input type="number" step="0.01" min="0.01" id="gasto_cantidad" class="form-control" required>
                    </div>
                    
                    <div class="col-md-4">
                        <label class="form-label">Motivo</label>
                        <input type="text" id="gasto_motivo" class="form-control" placeholder="Opcional...">
                    </div>
                </div>
                
                <div class="mt-3">
                    <button type="button" class="btn btn-success" onclick="agregarGastoAjax()">
                        <i class="bi bi-plus-lg"></i> Agregar y Continuar
                    </button>
                    <span id="gastoLoading" class="ms-2" style="display: none;">
                        <span class="spinner-border spinner-border-sm"></span> Guardando...
                    </span>
                    <span id="gastoMensaje" class="ms-2"></span>
                </div>
                
                <div class="alert alert-info mt-3 mb-0">
                    <i class="bi bi-info-circle"></i> Puede agregar varios gastos sin cerrar esta ventana. Los cambios se guardan inmediatamente.
                </div>
            </div>
            <div class="modal-footer">
                <span class="me-auto text-muted" id="contadorGastos">0 gastos agregados</span>
                <button type="button" class="btn btn-primary" data-bs-dismiss="modal">
                    <i class="bi bi-check-lg"></i> Finalizar
                </button>
            </div>
        </div>
    </div>
</div>

<script>
var gastosCount = 0;

function filtrarExamenesModal() {
    var inp = document.getElementById('buscadorExamenModal');
    if (!inp) return;
    var q = inp.value.toLowerCase()
        .replace(/[áàä]/g,'a').replace(/[éèë]/g,'e')
        .replace(/[íìï]/g,'i').replace(/[óòö]/g,'o')
        .replace(/[úùü]/g,'u').replace(/ñ/g,'n').trim();
    var hayVisible = false;
    document.querySelectorAll('#listaExamenesModal .examen-opcion-modal').forEach(function(el) {
        var t = (el.getAttribute('data-texto')||'').toLowerCase()
            .replace(/[áàä]/g,'a').replace(/[éèë]/g,'e')
            .replace(/[íìï]/g,'i').replace(/[óòö]/g,'o')
            .replace(/[úùü]/g,'u').replace(/ñ/g,'n');
        var ok = !q || t.indexOf(q) !== -1;
        el.style.display = ok ? '' : 'none';
        if (ok) hayVisible = true;
    });
    var sinRes = document.getElementById('sinResultadosExamen');
    if (sinRes) sinRes.style.display = (q.length > 0 && !hayVisible) ? '' : 'none';
}

function seleccionarExamenModal(el) {
    document.querySelectorAll('.examen-opcion-modal').forEach(function(e) { e.style.background = ''; });
    el.style.background = '#e8f4fd';
    var id     = el.getAttribute('data-id');
    var nombre = (el.querySelector('.fw-semibold')||{}).textContent || '';
    var precio = (el.querySelector('.badge')||{}).textContent || '';
    var hidden = document.getElementById('examenNuevoIdHidden');
    if (hidden) hidden.value = id;
    var btn = document.getElementById('btnAgregarExamen');
    if (btn) btn.disabled = false;
    var info = document.getElementById('examenSeleccionadoInfo');
    if (info) {
        info.classList.remove('d-none');
        info.innerHTML = '<i class="bi bi-check-circle-fill text-primary me-1"></i> Seleccionado: <strong>' + nombre + '</strong> &mdash; ' + precio;
    }
}

document.addEventListener('DOMContentLoaded', function() {
    var modal = document.getElementById('modalEditarExamenes');
    if (!modal) return;
    modal.addEventListener('shown.bs.modal', function() {
        var inp = document.getElementById('buscadorExamenModal');
        if (inp) { inp.value = ''; inp.focus(); }
        document.querySelectorAll('#listaExamenesModal .examen-opcion-modal').forEach(function(e) {
            e.style.display = ''; e.style.background = '';
        });
        var sinRes = document.getElementById('sinResultadosExamen');
        if (sinRes) sinRes.style.display = 'none';
        var hidden = document.getElementById('examenNuevoIdHidden');
        if (hidden) hidden.value = '';
        var btn = document.getElementById('btnAgregarExamen');
        if (btn) btn.disabled = true;
        var info = document.getElementById('examenSeleccionadoInfo');
        if (info) { info.classList.add('d-none'); info.innerHTML = ''; }
    });
});

function toggleTodosPreconfigurados(chk) {
    document.querySelectorAll('.chk-preconfig').forEach(function(c) { c.checked = chk.checked; });
}

function confirmarInsumosPreconfigurados() {
    var filas = document.querySelectorAll('#tbodyPreconfig tr.fila-preconfig');
    var seleccionadas = [];
    filas.forEach(function(fila) {
        var chk = fila.querySelector('.chk-preconfig');
        var cant = fila.querySelector('.cant-preconfig');
        if (chk && chk.checked && !chk.disabled && cant && parseFloat(cant.value) > 0) {
            seleccionadas.push({ insumo_id: chk.value, nombre: chk.dataset.nombre,
                                 cantidad: cant.value, unidad: chk.dataset.unidad, fila: fila });
        }
    });
    if (seleccionadas.length === 0) { alert('No hay insumos seleccionados.'); return; }
    var btn = document.getElementById('btnConfirmarPrec');
    btn.disabled = true;
    var status = document.getElementById('precargaStatus');
    status.innerHTML = '<span class="text-info"><span class="spinner-border spinner-border-sm"></span> Procesando 0/' + seleccionadas.length + '...</span>';
    var idx = 0;
    function procesarSiguiente() {
        if (idx >= seleccionadas.length) {
            btn.disabled = false;
            status.innerHTML = '<span class="text-success"><i class="bi bi-check-circle"></i> ' + seleccionadas.length + ' insumo(s) descontado(s)</span>';
            return;
        }
        var item = seleccionadas[idx]; idx++;
        status.innerHTML = '<span class="text-info"><span class="spinner-border spinner-border-sm"></span> Procesando ' + idx + '/' + seleccionadas.length + '...</span>';
        var formData = new FormData();
        formData.append('agregar_gasto_ajax', '1');
        formData.append('insumo_id', item.insumo_id);
        formData.append('cantidad', item.cantidad);
        formData.append('motivo', 'Insumo preconfigurado para examen');
        formData.append('orden_id', '<?= $id ?>');
        fetch('ajax_gasto_inventario.php', { method: 'POST', body: formData })
        .then(function(r) { return r.json(); })
        .then(function(data) {
            if (data.success) {
                gastosCount++;
                document.getElementById('contadorGastos').textContent = gastosCount + ' gasto(s) agregado(s)';
                document.getElementById('gastosAgregados').style.display = 'block';
                document.getElementById('separadorGastos').style.display = 'block';
                var li = document.createElement('li');
                li.className = 'list-group-item d-flex justify-content-between align-items-center py-1';
                li.innerHTML = '<span>' + item.nombre + '</span><span class="badge bg-danger">' + item.cantidad + ' ' + item.unidad + '</span>';
                document.getElementById('listaGastosAgregados').appendChild(li);
                item.fila.style.opacity = '0.4';
                item.fila.querySelector('.chk-preconfig').disabled = true;
            }
            procesarSiguiente();
        })
        .catch(function() { procesarSiguiente(); });
    }
    procesarSiguiente();
}

function abrirModalGasto() {
    // Cerrar el modal de insumos gastados primero
    var modalInsumos = bootstrap.Modal.getInstance(document.getElementById('modalInsumos'));
    if (modalInsumos) {
        modalInsumos.hide();
    }
    
    // Resetear el modal
    gastosCount = 0;
    document.getElementById('listaGastosAgregados').innerHTML = '';
    document.getElementById('gastosAgregados').style.display = 'none';
    document.getElementById('separadorGastos').style.display = 'none';
    document.getElementById('contadorGastos').textContent = '0 gastos agregados';
    
    // Esperar a que se cierre y abrir el de agregar gasto
    setTimeout(function() {
        var modalGasto = new bootstrap.Modal(document.getElementById('agregarGastoModal'));
        modalGasto.show();
    }, 300);
}

function agregarGastoAjax() {
    var insumoSelect = document.getElementById('gasto_insumo_id');
    var cantidad = document.getElementById('gasto_cantidad').value;
    var motivo = document.getElementById('gasto_motivo').value;
    
    if (!insumoSelect.value || !cantidad || cantidad <= 0) {
        alert('Seleccione un insumo y cantidad válida');
        return;
    }
    
    var insumoId = insumoSelect.value;
    var insumoNombre = insumoSelect.options[insumoSelect.selectedIndex].dataset.nombre;
    var insumoUnidad = insumoSelect.options[insumoSelect.selectedIndex].dataset.unidad;
    
    document.getElementById('gastoLoading').style.display = 'inline';
    document.getElementById('gastoMensaje').innerHTML = '';
    
    // Enviar por AJAX
    var formData = new FormData();
    formData.append('agregar_gasto_ajax', '1');
    formData.append('insumo_id', insumoId);
    formData.append('cantidad', cantidad);
    formData.append('motivo', motivo || 'Gasto adicional');
    formData.append('orden_id', '<?= $id ?>');
    
    fetch('ajax_gasto_inventario.php', {
        method: 'POST',
        body: formData
    })
    .then(function(response) {
        return response.text().then(function(text) {
            var data = null;
            try {
                data = JSON.parse(text);
            } catch (e) {
                data = null;
            }

            if (!response.ok) {
                var msg = (data && data.error) ? data.error : (text || 'Error HTTP ' + response.status);
                throw new Error(msg);
            }

            if (!data) {
                throw new Error('Respuesta invalida del servidor');
            }

            return data;
        });
    })
    .then(function(data) {
        document.getElementById('gastoLoading').style.display = 'none';
        
        if (data.success) {
            gastosCount++;
            document.getElementById('contadorGastos').textContent = gastosCount + ' gasto(s) agregado(s)';
            document.getElementById('gastosAgregados').style.display = 'block';
            document.getElementById('separadorGastos').style.display = 'block';
            
            var li = document.createElement('li');
            li.className = 'list-group-item d-flex justify-content-between align-items-center py-1';
            li.innerHTML = '<span>' + insumoNombre + '</span><span class="badge bg-danger">' + cantidad + ' ' + insumoUnidad + '</span>';
            document.getElementById('listaGastosAgregados').appendChild(li);
            
            // Actualizar el stock en el select
            var option = insumoSelect.options[insumoSelect.selectedIndex];
            var nuevoStock = parseFloat(option.dataset.stock) - parseFloat(cantidad);
            option.dataset.stock = nuevoStock;
            option.text = insumoNombre + ' (Stock: ' + nuevoStock.toFixed(2) + ' ' + insumoUnidad + ')';
            
            // Limpiar campos
            insumoSelect.value = '';
            document.getElementById('gasto_cantidad').value = '';
            document.getElementById('gasto_motivo').value = '';
            
            document.getElementById('gastoMensaje').innerHTML = '<span class="text-success"><i class="bi bi-check-circle"></i> Agregado!</span>';
            setTimeout(() => document.getElementById('gastoMensaje').innerHTML = '', 2000);
        } else {
            document.getElementById('gastoMensaje').innerHTML = '<span class="text-danger"><i class="bi bi-x-circle"></i> ' + data.error + '</span>';
        }
    })
    .catch(function(error) {
        document.getElementById('gastoLoading').style.display = 'none';
        document.getElementById('gastoMensaje').innerHTML = '<span class="text-danger"><i class="bi bi-x-circle"></i> ' + error.message + '</span>';
    });
}

// Recargar página al cerrar el modal si se agregaron gastos
document.getElementById('agregarGastoModal').addEventListener('hidden.bs.modal', function () {
    if (gastosCount > 0) {
        location.reload();
    }
});
</script>

<?php require_once __DIR__ . '/../../includes/footer.php'; ?>
