<?php
$pageTitle = "Ingresar Resultado de Control";
require_once __DIR__ . '/../../config/config.php';
requirePermiso('control_calidad');

$db = Database::getInstance()->getConnection();
$lote_id = $_GET['lote_id'] ?? null;

// Obtener lotes activos
$lotesQuery = "SELECT l.*, 
               (SELECT COUNT(*) FROM cc_lote_parametros WHERE lote_id = l.id) as total_params
               FROM cc_lotes l 
               WHERE l.estado = 'Activo' 
               ORDER BY l.codigo";
$lotes = $db->query($lotesQuery)->fetchAll(PDO::FETCH_ASSOC);

// Si hay lote seleccionado, obtener sus parámetros
$parametros = [];
$loteSeleccionado = null;
if ($lote_id) {
    $stmt = $db->prepare("SELECT * FROM cc_lotes WHERE id = ?");
    $stmt->execute([$lote_id]);
    $loteSeleccionado = $stmt->fetch(PDO::FETCH_ASSOC);
    
    $stmtP = $db->prepare("SELECT lp.*, pe.nombre as parametro_nombre, e.nombre as examen_nombre, e.codigo as examen_codigo
                           FROM cc_lote_parametros lp
                           JOIN parametros_examen pe ON lp.parametro_id = pe.id
                           JOIN examenes e ON pe.examen_id = e.id
                           WHERE lp.lote_id = ? AND lp.activo = 1
                           ORDER BY e.nombre, pe.orden");
    $stmtP->execute([$lote_id]);
    $parametros = $stmtP->fetchAll(PDO::FETCH_ASSOC);
}

// Obtener reglas de control activas
$reglas = $db->query("SELECT * FROM cc_reglas WHERE activa = 1")->fetchAll(PDO::FETCH_ASSOC);

// Procesar ingreso de resultado
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $lote_parametro_id = $_POST['lote_parametro_id'];
    $fecha_analisis = $_POST['fecha_analisis'] . ' ' . $_POST['hora_analisis'];
    $valor_obtenido = $_POST['valor_obtenido'] !== '' ? $_POST['valor_obtenido'] : null;
    $valor_cualitativo = $_POST['valor_cualitativo'] ?? null;
    $equipo = $_POST['equipo'] ?? null;
    $observaciones = $_POST['observaciones'] ?? null;
    
    // Obtener información del parámetro del lote
    $stmtLP = $db->prepare("SELECT * FROM cc_lote_parametros WHERE id = ?");
    $stmtLP->execute([$lote_parametro_id]);
    $loteParam = $stmtLP->fetch(PDO::FETCH_ASSOC);
    
    // Calcular Z-score y desviación
    $z_score = null;
    $desviacion = null;
    $estado = 'Pendiente';
    $reglas_violadas = [];
    
    if ($loteParam['tipo_resultado'] == 'numerico' && $valor_obtenido !== null) {
        $media = floatval($loteParam['valor_asignado']);
        $de = floatval($loteParam['desviacion_estandar']);
        
        if ($de > 0) {
            $z_score = ($valor_obtenido - $media) / $de;
            $desviacion = $valor_obtenido - $media;
            
            // Evaluar reglas de Westgard
            // Regla 1:3s
            if (abs($z_score) > 3) {
                $reglas_violadas[] = '1-3s';
                $estado = 'Rechazado';
            }
            // Regla 1:2s
            elseif (abs($z_score) > 2) {
                $reglas_violadas[] = '1-2s';
                $estado = 'Alerta';
            }
            
            // Verificar reglas que requieren valores históricos
            $stmtHist = $db->prepare("SELECT z_score FROM cc_resultados 
                                      WHERE lote_parametro_id = ? 
                                      ORDER BY fecha_analisis DESC LIMIT 9");
            $stmtHist->execute([$lote_parametro_id]);
            $historico = $stmtHist->fetchAll(PDO::FETCH_COLUMN);
            array_unshift($historico, $z_score); // Agregar valor actual al inicio
            
            if (count($historico) >= 2) {
                // Regla 2:2s - dos consecutivos > 2s mismo lado
                if (($historico[0] > 2 && $historico[1] > 2) || ($historico[0] < -2 && $historico[1] < -2)) {
                    $reglas_violadas[] = '2-2s';
                    $estado = 'Rechazado';
                }
                // Regla R:4s - rango > 4s
                if (abs($historico[0] - $historico[1]) > 4) {
                    $reglas_violadas[] = 'R-4s';
                    $estado = 'Rechazado';
                }
            }
            
            if (count($historico) >= 4) {
                // Regla 4:1s - cuatro consecutivos > 1s mismo lado
                $mismoLado = true;
                $signo = $historico[0] > 0 ? 1 : -1;
                for ($i = 0; $i < 4; $i++) {
                    if (abs($historico[$i]) <= 1 || ($historico[$i] > 0 ? 1 : -1) != $signo) {
                        $mismoLado = false;
                        break;
                    }
                }
                if ($mismoLado) {
                    $reglas_violadas[] = '4-1s';
                    if ($estado != 'Rechazado') $estado = 'Alerta';
                }
            }
            
            if (count($historico) >= 10) {
                // Regla 10x - diez del mismo lado de la media
                $mismoLado = true;
                $signo = $historico[0] > 0 ? 1 : -1;
                for ($i = 0; $i < 10; $i++) {
                    if (($historico[$i] > 0 ? 1 : -1) != $signo) {
                        $mismoLado = false;
                        break;
                    }
                }
                if ($mismoLado) {
                    $reglas_violadas[] = '10x';
                    if ($estado != 'Rechazado') $estado = 'Alerta';
                }
            }
            
            // Si no hay violaciones
            if (empty($reglas_violadas)) {
                $estado = 'Aceptado';
            }
        } else {
            // Sin DE definida, verificar contra rangos
            if ($valor_obtenido >= $loteParam['rango_min'] && $valor_obtenido <= $loteParam['rango_max']) {
                $estado = 'Aceptado';
            } else {
                $estado = 'Rechazado';
            }
        }
    } elseif ($loteParam['tipo_resultado'] == 'cualitativo') {
        // Para cualitativos, comparar con valor esperado
        if ($valor_cualitativo === $loteParam['valor_esperado_cualitativo']) {
            $estado = 'Aceptado';
        } else {
            $estado = 'Rechazado';
            $reglas_violadas[] = 'Discordante';
        }
    }
    
    try {
        $stmt = $db->prepare("INSERT INTO cc_resultados 
            (lote_parametro_id, fecha_analisis, valor_obtenido, valor_cualitativo, 
             desviacion, z_score, estado, reglas_violadas, analista_id, equipo, observaciones)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        $stmt->execute([
            $lote_parametro_id, $fecha_analisis, $valor_obtenido, $valor_cualitativo,
            $desviacion, $z_score, $estado, implode(',', $reglas_violadas),
            $_SESSION['user_id'], $equipo, $observaciones
        ]);
        
        $mensaje = "Resultado registrado: <strong>$estado</strong>";
        if (!empty($reglas_violadas)) {
            $mensaje .= " (Reglas: " . implode(', ', $reglas_violadas) . ")";
        }
        setAlert($estado == 'Rechazado' ? 'danger' : ($estado == 'Alerta' ? 'warning' : 'success'), $mensaje);
        
    } catch (PDOException $e) {
        setAlert('danger', 'Error: ' . $e->getMessage());
    }
    
    header("Location: ingresar.php?lote_id=$lote_id");
    exit;
}

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

<div class="row mb-4">
    <div class="col-12">
        <nav aria-label="breadcrumb">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="list.php">Control de Calidad</a></li>
                <li class="breadcrumb-item active">Ingresar Resultado</li>
            </ol>
        </nav>
        <h2><i class="bi bi-journal-plus me-2"></i>Ingresar Resultado de Control</h2>
    </div>
</div>

<div class="row">
    <div class="col-md-4">
        <!-- Selección de lote -->
        <div class="card mb-3">
            <div class="card-header">
                <h5 class="mb-0"><i class="bi bi-box-seam me-2"></i>Seleccionar Lote</h5>
            </div>
            <div class="card-body">
                <form method="GET">
                    <select name="lote_id" class="form-select" onchange="this.form.submit()">
                        <option value="">-- Seleccione un lote --</option>
                        <?php foreach ($lotes as $lote): ?>
                        <option value="<?= $lote['id'] ?>" <?= $lote_id == $lote['id'] ? 'selected' : '' ?>
                                <?= $lote['total_params'] == 0 ? 'disabled' : '' ?>>
                            <?= htmlspecialchars($lote['codigo']) ?> - <?= htmlspecialchars($lote['nombre']) ?>
                            (<?= $lote['nivel'] ?>) <?= $lote['total_params'] == 0 ? '[Sin parámetros]' : '' ?>
                        </option>
                        <?php endforeach; ?>
                    </select>
                </form>
                
                <?php if ($loteSeleccionado): ?>
                <div class="mt-3 p-3 bg-light rounded">
                    <h6><?= htmlspecialchars($loteSeleccionado['nombre']) ?></h6>
                    <small class="text-muted">
                        <strong>Fabricante:</strong> <?= htmlspecialchars($loteSeleccionado['fabricante'] ?? 'N/A') ?><br>
                        <strong>Nivel:</strong> <?= $loteSeleccionado['nivel'] ?><br>
                        <strong>Vencimiento:</strong> <?= date('d/m/Y', strtotime($loteSeleccionado['fecha_vencimiento'])) ?>
                    </small>
                </div>
                <?php endif; ?>
            </div>
        </div>
        
        <!-- Reglas de Westgard -->
        <div class="card">
            <div class="card-header">
                <h6 class="mb-0"><i class="bi bi-shield-check me-2"></i>Reglas de Westgard</h6>
            </div>
            <div class="card-body p-2">
                <ul class="list-group list-group-flush small">
                    <?php foreach ($reglas as $regla): ?>
                    <li class="list-group-item d-flex justify-content-between align-items-center py-1">
                        <span><strong><?= $regla['codigo'] ?></strong> - <?= $regla['nombre'] ?></span>
                        <span class="badge bg-<?= $regla['tipo'] == 'Rechazo' ? 'danger' : 'warning' ?>">
                            <?= $regla['tipo'] ?>
                        </span>
                    </li>
                    <?php endforeach; ?>
                </ul>
            </div>
        </div>
    </div>
    
    <div class="col-md-8">
        <?php if ($loteSeleccionado && !empty($parametros)): ?>
        <!-- Formulario de ingreso -->
        <div class="card">
            <div class="card-header">
                <h5 class="mb-0"><i class="bi bi-pencil-square me-2"></i>Registrar Control</h5>
            </div>
            <div class="card-body">
                <form method="POST" class="needs-validation" novalidate>
                    <div class="row">
                        <div class="col-md-4 mb-3">
                            <label class="form-label">Fecha <span class="text-danger">*</span></label>
                            <input type="date" name="fecha_analisis" class="form-control" 
                                   value="<?= date('Y-m-d') ?>" required>
                        </div>
                        <div class="col-md-4 mb-3">
                            <label class="form-label">Hora <span class="text-danger">*</span></label>
                            <input type="time" name="hora_analisis" class="form-control" 
                                   value="<?= date('H:i') ?>" required>
                        </div>
                        <div class="col-md-4 mb-3">
                            <label class="form-label">Equipo/Instrumento</label>
                            <input type="text" name="equipo" class="form-control" placeholder="Ej: Analizador XYZ">
                        </div>
                    </div>
                    
                    <div class="mb-3">
                        <label class="form-label">Parámetro <span class="text-danger">*</span></label>
                        <select name="lote_parametro_id" id="selectParametro" class="form-select" required>
                            <option value="">-- Seleccione parámetro --</option>
                            <?php 
                            $examenActual = '';
                            foreach ($parametros as $p): 
                                if ($p['examen_nombre'] != $examenActual):
                                    if ($examenActual != '') echo '</optgroup>';
                                    $examenActual = $p['examen_nombre'];
                                    echo '<optgroup label="' . htmlspecialchars($p['examen_codigo'] . ' - ' . $examenActual) . '">';
                                endif;
                            ?>
                            <option value="<?= $p['id'] ?>" 
                                    data-tipo="<?= $p['tipo_resultado'] ?>"
                                    data-media="<?= $p['valor_asignado'] ?>"
                                    data-de="<?= $p['desviacion_estandar'] ?>"
                                    data-min="<?= $p['rango_min'] ?>"
                                    data-max="<?= $p['rango_max'] ?>"
                                    data-unidad="<?= htmlspecialchars($p['unidad']) ?>"
                                    data-esperado="<?= htmlspecialchars($p['valor_esperado_cualitativo'] ?? '') ?>">
                                <?= htmlspecialchars($p['parametro_nombre']) ?>
                                <?php if ($p['tipo_resultado'] == 'numerico' && $p['valor_asignado']): ?>
                                    (Media: <?= number_format($p['valor_asignado'], 2) ?> <?= $p['unidad'] ?>)
                                <?php endif; ?>
                            </option>
                            <?php endforeach; ?>
                            <?php if ($examenActual != '') echo '</optgroup>'; ?>
                        </select>
                    </div>
                    
                    <!-- Info del parámetro seleccionado -->
                    <div id="infoParametro" class="alert alert-info mb-3" style="display: none;">
                        <div class="row">
                            <div class="col-md-3"><strong>Media:</strong> <span id="infoMedia">-</span></div>
                            <div class="col-md-3"><strong>DE:</strong> <span id="infoDE">-</span></div>
                            <div class="col-md-3"><strong>-2DE:</strong> <span id="infoMin">-</span></div>
                            <div class="col-md-3"><strong>+2DE:</strong> <span id="infoMax">-</span></div>
                        </div>
                    </div>
                    
                    <!-- Campo para valor numérico -->
                    <div id="campoNumerico" class="mb-3">
                        <label class="form-label">Valor Obtenido <span class="text-danger">*</span></label>
                        <div class="input-group">
                            <input type="number" step="0.0001" name="valor_obtenido" id="valorObtenido" 
                                   class="form-control form-control-lg" placeholder="Ingrese el valor">
                            <span class="input-group-text" id="unidadSpan">-</span>
                        </div>
                        <div id="feedbackValor" class="form-text"></div>
                    </div>
                    
                    <!-- Campo para valor cualitativo -->
                    <div id="campoCualitativo" class="mb-3" style="display: none;">
                        <label class="form-label">Resultado Obtenido <span class="text-danger">*</span></label>
                        <div class="btn-group w-100" role="group">
                            <input type="radio" class="btn-check" name="valor_cualitativo" value="Positivo" id="btnPositivo">
                            <label class="btn btn-outline-danger" for="btnPositivo">Positivo</label>
                            
                            <input type="radio" class="btn-check" name="valor_cualitativo" value="Negativo" id="btnNegativo">
                            <label class="btn btn-outline-success" for="btnNegativo">Negativo</label>
                            
                            <input type="radio" class="btn-check" name="valor_cualitativo" value="Reactivo" id="btnReactivo">
                            <label class="btn btn-outline-warning" for="btnReactivo">Reactivo</label>
                            
                            <input type="radio" class="btn-check" name="valor_cualitativo" value="No Reactivo" id="btnNoReactivo">
                            <label class="btn btn-outline-info" for="btnNoReactivo">No Reactivo</label>
                        </div>
                        <div id="feedbackCualitativo" class="form-text mt-2"></div>
                    </div>
                    
                    <div class="mb-3">
                        <label class="form-label">Observaciones</label>
                        <textarea name="observaciones" class="form-control" rows="2" 
                                  placeholder="Observaciones adicionales..."></textarea>
                    </div>
                    
                    <button type="submit" class="btn btn-primary btn-lg w-100">
                        <i class="bi bi-check-circle me-2"></i>Registrar Resultado
                    </button>
                </form>
            </div>
        </div>
        
        <!-- Últimos resultados del lote -->
        <div class="card mt-3">
            <div class="card-header">
                <h6 class="mb-0"><i class="bi bi-clock-history me-2"></i>Últimos Resultados</h6>
            </div>
            <div class="card-body p-0">
                <?php
                $stmtUlt = $db->prepare("SELECT r.*, lp.parametro_id, pe.nombre as param_nombre, e.nombre as exam_nombre
                                         FROM cc_resultados r
                                         JOIN cc_lote_parametros lp ON r.lote_parametro_id = lp.id
                                         JOIN parametros_examen pe ON lp.parametro_id = pe.id
                                         JOIN examenes e ON pe.examen_id = e.id
                                         WHERE lp.lote_id = ?
                                         ORDER BY r.fecha_analisis DESC LIMIT 10");
                $stmtUlt->execute([$lote_id]);
                $ultimos = $stmtUlt->fetchAll(PDO::FETCH_ASSOC);
                ?>
                <?php if (empty($ultimos)): ?>
                <p class="text-muted text-center py-3 mb-0">No hay resultados registrados</p>
                <?php else: ?>
                <table class="table table-sm mb-0">
                    <thead class="table-light">
                        <tr>
                            <th>Fecha/Hora</th>
                            <th>Parámetro</th>
                            <th>Valor</th>
                            <th>Z-Score</th>
                            <th>Estado</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($ultimos as $r): ?>
                        <tr>
                            <td><small><?= date('d/m H:i', strtotime($r['fecha_analisis'])) ?></small></td>
                            <td><small><?= htmlspecialchars($r['param_nombre']) ?></small></td>
                            <td>
                                <?= $r['valor_obtenido'] !== null 
                                    ? number_format($r['valor_obtenido'], 2) 
                                    : htmlspecialchars($r['valor_cualitativo']) ?>
                            </td>
                            <td>
                                <?php if ($r['z_score'] !== null): ?>
                                <span class="badge bg-<?= abs($r['z_score']) > 2 ? 'danger' : (abs($r['z_score']) > 1 ? 'warning' : 'success') ?>">
                                    <?= number_format($r['z_score'], 2) ?>
                                </span>
                                <?php else: ?>
                                -
                                <?php endif; ?>
                            </td>
                            <td>
                                <span class="badge bg-<?= $r['estado'] == 'Aceptado' ? 'success' : ($r['estado'] == 'Rechazado' ? 'danger' : 'warning') ?>">
                                    <?= $r['estado'] ?>
                                </span>
                                <?php if ($r['reglas_violadas']): ?>
                                <br><small class="text-danger"><?= $r['reglas_violadas'] ?></small>
                                <?php endif; ?>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
                <?php endif; ?>
            </div>
        </div>
        
        <?php elseif ($loteSeleccionado && empty($parametros)): ?>
        <div class="alert alert-warning">
            <i class="bi bi-exclamation-triangle me-2"></i>
            Este lote no tiene parámetros configurados. 
            <a href="parametros.php?lote_id=<?= $lote_id ?>" class="alert-link">Configure los parámetros primero</a>.
        </div>
        <?php else: ?>
        <div class="card">
            <div class="card-body text-center py-5">
                <i class="bi bi-box-seam fs-1 text-muted"></i>
                <p class="text-muted mt-3">Seleccione un lote de control para ingresar resultados</p>
            </div>
        </div>
        <?php endif; ?>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const selectParam = document.getElementById('selectParametro');
    const infoParam = document.getElementById('infoParametro');
    const campoNum = document.getElementById('campoNumerico');
    const campoCual = document.getElementById('campoCualitativo');
    const valorInput = document.getElementById('valorObtenido');
    const unidadSpan = document.getElementById('unidadSpan');
    const feedbackValor = document.getElementById('feedbackValor');
    const feedbackCual = document.getElementById('feedbackCualitativo');
    
    let paramData = {};
    
    selectParam.addEventListener('change', function() {
        const opt = this.options[this.selectedIndex];
        if (!opt.value) {
            infoParam.style.display = 'none';
            return;
        }
        
        paramData = {
            tipo: opt.dataset.tipo,
            media: parseFloat(opt.dataset.media) || 0,
            de: parseFloat(opt.dataset.de) || 0,
            min: parseFloat(opt.dataset.min) || 0,
            max: parseFloat(opt.dataset.max) || 0,
            unidad: opt.dataset.unidad || '',
            esperado: opt.dataset.esperado
        };
        
        if (paramData.tipo === 'numerico') {
            campoNum.style.display = 'block';
            campoCual.style.display = 'none';
            valorInput.required = true;
            
            if (paramData.media && paramData.de) {
                infoParam.style.display = 'block';
                document.getElementById('infoMedia').textContent = paramData.media.toFixed(2) + ' ' + paramData.unidad;
                document.getElementById('infoDE').textContent = paramData.de.toFixed(4);
                document.getElementById('infoMin').textContent = (paramData.media - 2*paramData.de).toFixed(2);
                document.getElementById('infoMax').textContent = (paramData.media + 2*paramData.de).toFixed(2);
            } else {
                infoParam.style.display = 'none';
            }
            
            unidadSpan.textContent = paramData.unidad || '-';
            valorInput.value = '';
            feedbackValor.innerHTML = '';
        } else {
            campoNum.style.display = 'none';
            campoCual.style.display = 'block';
            valorInput.required = false;
            infoParam.style.display = 'none';
            
            if (paramData.esperado) {
                feedbackCual.innerHTML = '<i class="bi bi-info-circle me-1"></i>Valor esperado: <strong>' + paramData.esperado + '</strong>';
            }
        }
    });
    
    // Feedback en tiempo real para valores numéricos
    valorInput.addEventListener('input', function() {
        if (!paramData.media || !paramData.de) return;
        
        const valor = parseFloat(this.value);
        if (isNaN(valor)) {
            feedbackValor.innerHTML = '';
            return;
        }
        
        const zScore = (valor - paramData.media) / paramData.de;
        let clase = 'text-success';
        let mensaje = 'Dentro de rango aceptable';
        
        if (Math.abs(zScore) > 3) {
            clase = 'text-danger';
            mensaje = '⚠️ RECHAZADO - Viola regla 1:3s (Z = ' + zScore.toFixed(2) + ')';
        } else if (Math.abs(zScore) > 2) {
            clase = 'text-warning';
            mensaje = '⚡ ALERTA - Viola regla 1:2s (Z = ' + zScore.toFixed(2) + ')';
        } else {
            mensaje = '✓ Aceptable (Z = ' + zScore.toFixed(2) + ')';
        }
        
        feedbackValor.innerHTML = '<span class="' + clase + '">' + mensaje + '</span>';
    });
});
</script>

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