<?php
$pageTitle = 'Ingresar Resultados';
require_once __DIR__ . '/../../config/config.php';
requireLogin();

$db = getDB();
$orden_id = intval($_GET['orden_id'] ?? 0);

// Obtener orden
$stmt = $db->prepare("
    SELECT o.*, p.nombre, p.apellidos, p.documento_numero, p.sexo, p.fecha_nacimiento
    FROM ordenes o 
    JOIN pacientes p ON o.paciente_id = p.id 
    WHERE o.id = ?
");
$stmt->execute([$orden_id]);
$orden = $stmt->fetch();

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

// Añadir columna prueba_controlada si no existe
try {
    $chkPC = $db->query("SHOW COLUMNS FROM orden_detalle LIKE 'prueba_controlada'")->fetch();
    if (!$chkPC) $db->exec("ALTER TABLE orden_detalle ADD COLUMN prueba_controlada TINYINT(1) NOT NULL DEFAULT 0");
} catch (Exception $e) {}

// 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 con sus parámetros
$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 = ?
    ORDER BY e.nombre
");
$stmt->execute([$orden_id]);
$detalles = $stmt->fetchAll();

// Procesar formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        $db->beginTransaction();
        
        // Actualizar laboratorista si se seleccionó
        if (!empty($_POST['laboratorista_id'])) {
            $stmtLab = $db->prepare("UPDATE ordenes SET laboratorista_id = ? WHERE id = ?");
            $stmtLab->execute([intval($_POST['laboratorista_id']), $orden_id]);
        }

        // Guardar prueba_controlada por examen
        $pruebasControladas = isset($_POST['prueba_controlada']) ? $_POST['prueba_controlada'] : [];
        foreach ($detalles as $det) {
            $esCtrl = isset($pruebasControladas[$det['id']]) ? 1 : 0;
            $stmtCtrl = $db->prepare("UPDATE orden_detalle SET prueba_controlada = ? WHERE id = ?");
            $stmtCtrl->execute([$esCtrl, $det['id']]);
        }
        
        $resultados = $_POST['resultado'] ?? [];
        $observaciones = $_POST['observacion'] ?? [];
        
        foreach ($resultados as $parametro_id => $valor) {
            if ($valor === '') continue;
            
            $parametro_id = intval($parametro_id);
            
            // Obtener info del parámetro
            $stmtParam = $db->prepare("
                SELECT p.*, od.id as orden_detalle_id 
                FROM parametros_examen p
                JOIN orden_detalle od ON od.examen_id = p.examen_id
                WHERE p.id = ? AND od.orden_id = ?
            ");
            $stmtParam->execute([$parametro_id, $orden_id]);
            $paramInfo = $stmtParam->fetch();
            
            if (!$paramInfo) continue;
            
            // Verificar si está fuera de rango
            $fueraRango = 0;
            $valorNumerico = is_numeric($valor) ? floatval($valor) : null;
            
            if ($valorNumerico !== null) {
                // Buscar rango de referencia aplicable
                $stmtRango = $db->prepare("
                    SELECT * FROM rangos_referencia 
                    WHERE parametro_id = ? 
                    AND (sexo = ? OR sexo = 'Ambos')
                    AND ? BETWEEN edad_min AND edad_max
                    LIMIT 1
                ");
                $stmtRango->execute([$parametro_id, $orden['sexo'], $edad ?? 30]);
                $rango = $stmtRango->fetch();
                
                if ($rango) {
                    if (($rango['valor_min'] !== null && $valorNumerico < $rango['valor_min']) ||
                        ($rango['valor_max'] !== null && $valorNumerico > $rango['valor_max'])) {
                        $fueraRango = 1;
                    }
                }
            }
            
            // Verificar si ya existe resultado para este parámetro
            $stmtCheck = $db->prepare("
                SELECT id FROM resultados 
                WHERE orden_detalle_id = ? AND parametro_id = ?
            ");
            $stmtCheck->execute([$paramInfo['orden_detalle_id'], $parametro_id]);
            $existente = $stmtCheck->fetch();
            
            if ($existente) {
                // Actualizar
                $stmtUpdate = $db->prepare("
                    UPDATE resultados SET 
                        valor = ?, valor_numerico = ?, fuera_rango = ?, 
                        observacion = ?, usuario_id = ?, fecha_resultado = NOW()
                    WHERE id = ?
                ");
                $stmtUpdate->execute([
                    $valor,
                    $valorNumerico,
                    $fueraRango,
                    $observaciones[$parametro_id] ?? null,
                    $_SESSION['user_id'],
                    $existente['id']
                ]);
            } else {
                // Insertar
                $stmtInsert = $db->prepare("
                    INSERT INTO resultados 
                    (orden_detalle_id, parametro_id, valor, valor_numerico, fuera_rango, observacion, usuario_id)
                    VALUES (?, ?, ?, ?, ?, ?, ?)
                ");
                $stmtInsert->execute([
                    $paramInfo['orden_detalle_id'],
                    $parametro_id,
                    $valor,
                    $valorNumerico,
                    $fueraRango,
                    $observaciones[$parametro_id] ?? null,
                    $_SESSION['user_id']
                ]);
            }
        }
        
        // Actualizar estado de cada examen según sus resultados
        foreach ($detalles as $det) {
            // Contar parámetros del examen
            $stmtCountParams = $db->prepare("SELECT COUNT(*) FROM parametros_examen WHERE examen_id = ?");
            $stmtCountParams->execute([$det['examen_id']]);
            $totalParams = $stmtCountParams->fetchColumn();
            
            // Contar resultados ingresados
            $stmtCountRes = $db->prepare("SELECT COUNT(*) FROM resultados WHERE orden_detalle_id = ?");
            $stmtCountRes->execute([$det['id']]);
            $totalRes = $stmtCountRes->fetchColumn();
            
            $nuevoEstado = 'pendiente';
            if ($totalRes > 0 && $totalRes < $totalParams) {
                $nuevoEstado = 'en_proceso';
            } elseif ($totalRes >= $totalParams && $totalParams > 0) {
                $nuevoEstado = 'completado';
            }
            
            $stmtUpdateDet = $db->prepare("UPDATE orden_detalle SET estado = ? WHERE id = ?");
            $stmtUpdateDet->execute([$nuevoEstado, $det['id']]);
        }
        
        // Actualizar estado de la orden
        $stmtCheckOrden = $db->prepare("
            SELECT 
                COUNT(*) as total,
                SUM(CASE WHEN estado = 'completado' THEN 1 ELSE 0 END) as completados
            FROM orden_detalle WHERE orden_id = ?
        ");
        $stmtCheckOrden->execute([$orden_id]);
        $estadoOrden = $stmtCheckOrden->fetch();
        
        if ($estadoOrden['completados'] == $estadoOrden['total'] && $estadoOrden['total'] > 0) {
            $db->prepare("UPDATE ordenes SET estado = 'completada' WHERE id = ?")->execute([$orden_id]);
        } elseif ($estadoOrden['completados'] > 0) {
            $db->prepare("UPDATE ordenes SET estado = 'en_proceso' WHERE id = ?")->execute([$orden_id]);
        }
        
        $db->commit();
        showAlert('Resultados guardados correctamente');
        header('Location: edit.php?orden_id=' . $orden_id);
        exit;
        
    } catch (PDOException $e) {
        $db->rollBack();
        showAlert('Error al guardar: ' . $e->getMessage(), 'danger');
    }
}

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

<div class="d-flex justify-content-between align-items-center mt-4 mb-4">
    <div>
        <h2><i class="bi bi-file-earmark-medical"></i> Ingresar Resultados</h2>
        <p class="text-muted mb-0">
            Orden: <strong><?= $orden['codigo'] ?></strong> | 
            Paciente: <strong><?= $orden['nombre'] . ' ' . $orden['apellidos'] ?></strong>
            (<?= $orden['sexo'] == 'M' ? 'M' : 'F' ?><?= $edad ? ", $edad años" : '' ?>)
        </p>
    </div>
    <div>
        <a href="print.php?orden_id=<?= $orden_id ?>" class="btn btn-outline-success" target="_blank">
            <i class="bi bi-printer"></i> Imprimir Resultados
        </a>
        <a href="list.php" class="btn btn-outline-secondary">
            <i class="bi bi-arrow-left"></i> Volver
        </a>
    </div>
</div>

<?php
// Obtener laboratoristas activos
$stmtLabs = $db->prepare("SELECT id, nombre FROM usuarios WHERE rol = 'laboratorista' AND activo = 1 ORDER BY nombre");
$stmtLabs->execute();
$laboratoristas = $stmtLabs->fetchAll();
?>

<form method="POST">
    <?php if (count($laboratoristas) > 0): ?>
    <div class="card mb-3">
        <div class="card-body">
            <div class="row">
                <div class="col-md-6">
                    <label class="form-label">Laboratorista Responsable</label>
                    <select name="laboratorista_id" class="form-select">
                        <option value="">Seleccionar...</option>
                        <?php foreach ($laboratoristas as $lab): ?>
                        <option value="<?= $lab['id'] ?>" <?= ($orden['laboratorista_id'] ?? 0) == $lab['id'] ? 'selected' : '' ?>>
                            <?= htmlspecialchars($lab['nombre']) ?>
                        </option>
                        <?php endforeach; ?>
                    </select>
                </div>
            </div>
        </div>
    </div>
    <?php endif; ?>
    
    <?php foreach ($detalles as $det): ?>
    <?php
    // Obtener parámetros del examen
    $stmtParams = $db->prepare("
        SELECT p.*, 
               (SELECT r.valor FROM resultados r WHERE r.orden_detalle_id = ? AND r.parametro_id = p.id) as valor_resultado,
               (SELECT r.observacion FROM resultados r WHERE r.orden_detalle_id = ? AND r.parametro_id = p.id) as observacion_resultado,
               (SELECT r.fuera_rango FROM resultados r WHERE r.orden_detalle_id = ? AND r.parametro_id = p.id) as fuera_rango
        FROM parametros_examen p
        WHERE p.examen_id = ? AND p.activo = 1
        ORDER BY p.orden, p.nombre
    ");
    $stmtParams->execute([$det['id'], $det['id'], $det['id'], $det['examen_id']]);
    $parametros = $stmtParams->fetchAll();
    ?>
    
    <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> <?= htmlspecialchars($det['examen_nombre']) ?>
                <small class="text-muted">(<?= $det['examen_codigo'] ?>)</small>
            </h5>
            <div class="d-flex align-items-center gap-3">
                <div class="form-check form-check-inline mb-0">
                    <input class="form-check-input" type="checkbox"
                           name="prueba_controlada[<?= $det['id'] ?>]" value="1"
                           id="ctrl_<?= $det['id'] ?>"
                           <?= !empty($det['prueba_controlada']) ? 'checked' : '' ?>>
                    <label class="form-check-label fw-normal small" for="ctrl_<?= $det['id'] ?>">
                        <span class="text-warning">&#9733;</span> Prueba Controlada
                    </label>
                </div>
                <span class="badge <?= $det['estado'] == 'completado' ? 'bg-success' : ($det['estado'] == 'en_proceso' ? 'bg-info' : 'bg-warning') ?>">
                    <?= ucfirst($det['estado']) ?>
                </span>
            </div>
        </div>
        <div class="card-body">
            <?php if (empty($parametros)): ?>
            <div class="alert alert-warning">
                <i class="bi bi-exclamation-triangle"></i> Este examen no tiene parámetros configurados.
                <a href="<?= SITE_URL ?>/modules/examenes/parametros.php?id=<?= $det['examen_id'] ?>">Configurar parámetros</a>
            </div>
            <?php else: ?>
            <table class="table table-bordered">
                <thead class="table-light">
                    <tr>
                        <th width="25%">Parámetro</th>
                        <th width="15%">Resultado</th>
                        <th width="10%">Unidad</th>
                        <th width="25%">Valores de Referencia</th>
                        <th width="25%">Observación</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($parametros as $param): ?>
                    <?php
                    // Obtener tipo de entrada (por defecto numerico si no existe la columna)
                    $tipoEntrada = $param['tipo_entrada'] ?? 'numerico';
                    $opcionesLista = isset($param['opciones_lista']) ? explode('|', $param['opciones_lista']) : [];
                    $esTitulo = isset($param['es_titulo']) && $param['es_titulo'] == 1;
                    
                    // Obtener rango de referencia aplicable
                    $stmtRango = $db->prepare("
                        SELECT * FROM rangos_referencia 
                        WHERE parametro_id = ? 
                        AND (sexo = ? OR sexo = 'Ambos')
                        AND ? BETWEEN edad_min AND edad_max
                        LIMIT 1
                    ");
                    $stmtRango->execute([$param['id'], $orden['sexo'], $edad ?? 30]);
                    $rango = $stmtRango->fetch();
                    ?>
                    
                    <?php if ($esTitulo): ?>
                    <!-- Fila de título/separador -->
                    <tr class="table-secondary">
                        <td colspan="5"><strong><?= htmlspecialchars($param['nombre']) ?></strong></td>
                    </tr>
                    <?php else: ?>
                    <tr class="<?= $param['fuera_rango'] ? 'table-danger' : '' ?>">
                        <td>
                            <strong><?= htmlspecialchars($param['nombre']) ?></strong>
                        </td>
                        <td>
                            <?php if ($tipoEntrada === 'lista' && !empty($opcionesLista)): ?>
                            <!-- SELECTOR DE LISTA -->
                            <select name="resultado[<?= $param['id'] ?>]" 
                                    class="form-select <?= $param['fuera_rango'] ? 'border-danger' : '' ?>">
                                <option value="">Seleccionar...</option>
                                <?php
                                $valActual = (isset($param['valor_resultado']) && $param['valor_resultado'] !== '') ? $param['valor_resultado'] : ($param['valor_default'] ?? '');
                                foreach ($opcionesLista as $opcion):
                                    $opTrim = trim($opcion);
                                ?>
                                <option value="<?= htmlspecialchars($opTrim) ?>"
                                        <?= (trim($valActual) === $opTrim) ? 'selected' : '' ?>>
                                    <?= htmlspecialchars($opTrim) ?>
                                </option>
                                <?php endforeach; ?>
                            </select>
                            <?php elseif ($tipoEntrada === 'booleano'): ?>
                            <!-- CHECKBOX BOOLEANO -->
                            <?php $valorBool = (isset($param['valor_resultado']) && $param['valor_resultado'] !== '') ? $param['valor_resultado'] : ($param['valor_default'] ?? ''); ?>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="resultado[<?= $param['id'] ?>]" 
                                       id="res_<?= $param['id'] ?>_pos" value="Positivo"
                                       <?= ($valorBool === 'Positivo') ? 'checked' : '' ?>>
                                <label class="form-check-label" for="res_<?= $param['id'] ?>_pos">Positivo</label>
                            </div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="resultado[<?= $param['id'] ?>]" 
                                       id="res_<?= $param['id'] ?>_neg" value="Negativo"
                                       <?= ($valorBool === 'Negativo') ? 'checked' : '' ?>>
                                <label class="form-check-label" for="res_<?= $param['id'] ?>_neg">Negativo</label>
                            </div>
                            <?php elseif ($tipoEntrada === 'texto'): ?>
                            <!-- CAMPO DE TEXTO LIBRE -->
                            <input type="text" name="resultado[<?= $param['id'] ?>]" 
                                   class="form-control"
                                   value="<?= htmlspecialchars($param['valor_resultado'] ?? '') ?>"
                                   placeholder="Escribir resultado...">
                            <?php else: ?>
                            <!-- CAMPO NUMÉRICO (default) -->
                            <input type="text" name="resultado[<?= $param['id'] ?>]" 
                                   class="form-control <?= $param['fuera_rango'] ? 'border-danger' : '' ?>"
                                   value="<?= htmlspecialchars($param['valor_resultado'] ?? '') ?>"
                                   placeholder="Valor numérico"
                                   inputmode="decimal">
                            <?php endif; ?>
                        </td>
                        <td class="text-muted"><?= $param['unidad'] ?: '-' ?></td>
                        <td>
                            <?php if ($tipoEntrada === 'numerico'): ?>
                                <?php if ($rango): ?>
                                    <?php if ($rango['valor_min'] !== null && $rango['valor_max'] !== null): ?>
                                        <?= number_format($rango['valor_min'], 2) ?> - <?= number_format($rango['valor_max'], 2) ?> <?= $param['unidad'] ?>
                                    <?php elseif ($rango['valor_texto']): ?>
                                        <?= nl2br(htmlspecialchars($rango['valor_texto'])) ?>
                                    <?php endif; ?>
                                    <?php if ($rango['descripcion']): ?>
                                        <br><small class="text-muted"><?= htmlspecialchars($rango['descripcion']) ?></small>
                                    <?php endif; ?>
                                <?php else: ?>
                                    <span class="text-muted">No definido</span>
                                <?php endif; ?>
                            <?php else: ?>
                                <span class="text-muted fst-italic">No aplica</span>
                            <?php endif; ?>
                        </td>
                        <td>
                            <input type="text" name="observacion[<?= $param['id'] ?>]" 
                                   class="form-control form-control-sm"
                                   value="<?= htmlspecialchars($param['observacion_resultado'] ?? '') ?>"
                                   placeholder="Observación">
                        </td>
                    </tr>
                    <?php endif; ?>
                    <?php endforeach; ?>
                </tbody>
            </table>
            <?php endif; ?>
        </div>
    </div>
    <?php endforeach; ?>

    <div class="d-flex gap-2 mb-4">
        <button type="submit" class="btn btn-primary btn-lg">
            <i class="bi bi-check-lg"></i> Guardar Resultados
        </button>
        <a href="list.php" class="btn btn-outline-secondary btn-lg">Cancelar</a>
    </div>
</form>

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