<?php
session_start();
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL);

header('Content-Type: application/json');

require_once "../modelos/LabRx.php";

$labRx = new LabRx();

$op          = isset($_GET['op'])          ? $_GET['op']                                        : '';
$idsolicitud = isset($_POST['idsolicitud']) ? intval($_POST['idsolicitud'])                      : 0;
$area        = isset($_POST['area'])        ? strtoupper(limpiarCadena($_POST['area']))          : '';
$observacion = isset($_POST['observacion']) ? limpiarCadena($_POST['observacion'])               : '';
$idusuario   = isset($_SESSION['idusuario']) ? intval($_SESSION['idusuario'])                   : 0;

switch ($op) {

    // ────────────────────────────────────────────────
    // Médico envía la orden a un área (LAB o RX)
    // ────────────────────────────────────────────────
    case 'enviar_area':
        if ($idsolicitud <= 0 || !in_array($area, ['LABORATORIO', 'RX'])) {
            echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
            break;
        }
        $rspta = $labRx->enviarArea($idsolicitud, $area);
        if ($rspta) {
            echo json_encode(['success' => true, 'message' => 'Orden enviada a ' . $area . ' correctamente']);
        } else {
            echo json_encode(['success' => false, 'message' => 'Error al enviar la orden']);
        }
        break;

    // ────────────────────────────────────────────────
    // Listar pendientes para un área (LAB o RX)
    // ────────────────────────────────────────────────
    case 'listar_pendientes':
        if (!in_array($area, ['LABORATORIO', 'RX'])) {
            echo json_encode(['success' => false, 'message' => 'Área no válida']);
            break;
        }
        $rspta = $labRx->listarPendientesPorArea($area);
        $data  = [];
        if ($rspta) {
            while ($reg = $rspta->fetch_object()) {
                $badge_estado = '';
                if ($reg->estado_area == 'PENDIENTE') {
                    $badge_estado = '<span class="label label-warning"><i class="fa fa-clock-o"></i> PENDIENTE</span>';
                } else {
                    $badge_estado = '<span class="label label-info"><i class="fa fa-cog fa-spin"></i> EN PROCESO</span>';
                }
                $nombreMedico = trim($reg->medico_nombre . ' ' . $reg->medico_apaterno . ' ' . $reg->medico_amaterno);
                $acciones = '';
                // Ver documento original
                if (!empty($reg->ruta_pdf_firmado)) {
                    $acciones .= '<a href="../' . htmlspecialchars($reg->ruta_pdf_firmado) . '" target="_blank" class="btn btn-default btn-xs" title="Ver orden original"><i class="fa fa-file-pdf-o"></i> Ver Orden</a> ';
                }
                // Botón en proceso (solo si está PENDIENTE)
                if ($reg->estado_area == 'PENDIENTE') {
                    $acciones .= '<button class="btn btn-info btn-xs" onclick="marcarEnProceso(' . $reg->idsolicitud . ')" title="Marcar en proceso"><i class="fa fa-cog"></i> En Proceso</button> ';
                }
                // Botón subir resultado
                $acciones .= '<button class="btn btn-success btn-xs" onclick="abrirModalResultado(' . $reg->idsolicitud . ')" title="Subir resultado"><i class="fa fa-upload"></i> Subir Resultado</button>';

                $data[] = [
                    "0" => date('d/m/Y', strtotime($reg->fecha_emision)),
                    "1" => strtoupper($reg->paciente) . '<br><small>' . $reg->num_documento . '</small>',
                    "2" => $reg->tipo,
                    "3" => htmlspecialchars($nombreMedico),
                    "4" => $badge_estado,
                    "5" => $acciones
                ];
            }
        }
        echo json_encode([
            "sEcho"                => 1,
            "iTotalRecords"        => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData"               => $data
        ]);
        break;

    // ────────────────────────────────────────────────
    // Listar completados para un área (LAB o RX)
    // ────────────────────────────────────────────────
    case 'listar_completados':
        if (!in_array($area, ['LABORATORIO', 'RX'])) {
            echo json_encode(['success' => false, 'message' => 'Área no válida']);
            break;
        }
        $rspta = $labRx->listarCompletadosPorArea($area);
        $data  = [];
        if ($rspta) {
            while ($reg = $rspta->fetch_object()) {
                $visBadge = $reg->resultado_visto
                    ? '<span class="label label-default"><i class="fa fa-check"></i> Revisado</span>'
                    : '<span class="label label-success"><i class="fa fa-star"></i> Entregado</span>';

                $acciones = '';
                if (!empty($reg->ruta_resultado)) {
                    $acciones .= '<a href="../' . htmlspecialchars($reg->ruta_resultado) . '" target="_blank" class="btn btn-primary btn-xs"><i class="fa fa-eye"></i> Ver Resultado</a>';
                }
                $data[] = [
                    "0" => date('d/m/Y H:i', strtotime($reg->fecha_resultado)),
                    "1" => strtoupper($reg->paciente) . '<br><small>' . $reg->num_documento . '</small>',
                    "2" => $reg->tipo,
                    "3" => $visBadge,
                    "4" => !empty($reg->observacion_lab) ? htmlspecialchars($reg->observacion_lab) : '<em>Sin observación</em>',
                    "5" => $acciones
                ];
            }
        }
        echo json_encode([
            "sEcho"                => 1,
            "iTotalRecords"        => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData"               => $data
        ]);
        break;

    // ────────────────────────────────────────────────
    // Marcar solicitud en proceso
    // ────────────────────────────────────────────────
    case 'marcar_en_proceso':
        if ($idsolicitud <= 0 || $idusuario <= 0) {
            echo json_encode(['success' => false, 'message' => 'Sin sesión válida']);
            break;
        }
        $rspta = $labRx->marcarEnProceso($idsolicitud, $idusuario);
        echo json_encode(['success' => (bool)$rspta, 'message' => $rspta ? 'Marcado en proceso' : 'Error al actualizar']);
        break;

    // ────────────────────────────────────────────────
    // Subir resultado (PDF o imagen)
    // ────────────────────────────────────────────────
    case 'subir_resultado':
        if ($idsolicitud <= 0 || $idusuario <= 0) {
            echo json_encode(['success' => false, 'message' => 'Sin sesión válida o ID inválido']);
            break;
        }

        // Verificar que llegó un archivo
        if (!isset($_FILES['archivo']) || $_FILES['archivo']['error'] !== UPLOAD_ERR_OK) {
            echo json_encode(['success' => false, 'message' => 'No se recibió el archivo o hubo un error en la subida']);
            break;
        }

        $archivo    = $_FILES['archivo'];
        $mime       = mime_content_type($archivo['tmp_name']);
        $ext        = strtolower(pathinfo($archivo['name'], PATHINFO_EXTENSION));
        $tiposValidos = ['pdf' => 'application/pdf', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png'];

        if (!array_key_exists($ext, $tiposValidos)) {
            echo json_encode(['success' => false, 'message' => 'Tipo de archivo no permitido. Solo PDF, JPG o PNG']);
            break;
        }

        // Determinar subcarpeta según área
        $areaPost    = isset($_POST['area']) ? strtolower(limpiarCadena($_POST['area'])) : 'lab';
        $subCarpeta  = ($areaPost == 'rx') ? 'resultados_rx' : 'resultados_lab';

        // Crear directorio si no existe
        $fecha       = date('Y/m/d');
        $dirDestino  = __DIR__ . '/../files/' . $subCarpeta . '/' . $fecha . '/';
        if (!file_exists($dirDestino)) {
            mkdir($dirDestino, 0755, true);
        }

        // Nombre único para el archivo
        $nombreFinal = 'resultado_' . $idsolicitud . '_' . time() . '.' . $ext;
        $rutaFisica  = $dirDestino . $nombreFinal;
        $rutaRelativa = 'files/' . $subCarpeta . '/' . $fecha . '/' . $nombreFinal;
        $tipoResultado = ($ext == 'pdf') ? 'pdf' : 'imagen';

        if (!move_uploaded_file($archivo['tmp_name'], $rutaFisica)) {
            echo json_encode(['success' => false, 'message' => 'Error al guardar el archivo en el servidor']);
            break;
        }

        $rspta = $labRx->subirResultado($idsolicitud, $rutaRelativa, $tipoResultado, $observacion, $idusuario);
        if ($rspta) {
            echo json_encode(['success' => true, 'message' => 'Resultado subido correctamente']);
        } else {
            // Revertir archivo subido si falla la BD
            if (file_exists($rutaFisica)) unlink($rutaFisica);
            echo json_encode(['success' => false, 'message' => 'Error al guardar en base de datos']);
        }
        break;

    // ────────────────────────────────────────────────
    // Médico marca resultado como visto
    // ────────────────────────────────────────────────
    case 'marcar_visto':
        if ($idsolicitud <= 0) {
            echo json_encode(['success' => false, 'message' => 'ID inválido']);
            break;
        }
        $rspta = $labRx->marcarVisto($idsolicitud);
        echo json_encode(['success' => (bool)$rspta]);
        break;

    // ────────────────────────────────────────────────
    // Contar resultados nuevos (para badge del médico)
    // ────────────────────────────────────────────────
    case 'contar_nuevos':
        $idempleado = isset($_SESSION['idempleado']) ? intval($_SESSION['idempleado']) : 0;
        $total = $labRx->contarNuevosResultados($idempleado);
        echo json_encode(['total' => $total]);
        break;

    // ────────────────────────────────────────────────
    // Historial completo para el médico (examen_historial)
    // ────────────────────────────────────────────────
    case 'listar_historial_medico':
        $idempleado = isset($_SESSION['idempleado']) ? intval($_SESSION['idempleado']) : 0;
        $rspta = $labRx->listarHistorialMedico($idempleado);
        $data  = [];
        if ($rspta) {
            while ($reg = $rspta->fetch_object()) {
                // Badge estado firma
                $badgeFirma = ($reg->firmado == 1)
                    ? '<span class="label label-success">Firmado</span>'
                    : '<span class="label label-warning">Borrador</span>';

                // Badge resultado
                $badgeResultado = '';
                if ($reg->area_destino != 'NINGUNO') {
                    if ($reg->estado_area == 'COMPLETADO' && $reg->resultado_visto == 0) {
                        $badgeResultado = ' <span class="label label-resultado-nuevo" style="background:#27ae60;animation:pulsar 1.5s infinite;"><i class="fa fa-star"></i> NUEVO RESULTADO</span>';
                    } elseif ($reg->estado_area == 'COMPLETADO' && $reg->resultado_visto == 1) {
                        $badgeResultado = ' <span class="label label-default"><i class="fa fa-check-circle"></i> Revisado</span>';
                    } elseif ($reg->estado_area == 'EN_PROCESO') {
                        $badgeResultado = ' <span class="label label-info"><i class="fa fa-cog fa-spin"></i> En Proceso</span>';
                    } elseif ($reg->estado_area == 'PENDIENTE') {
                        $badgeResultado = ' <span class="label label-warning"><i class="fa fa-clock-o"></i> Pendiente en ' . $reg->area_destino . '</span>';
                    }
                }

                // Botones de acción
                $botones = '';
                if ($reg->firmado == 1 && !empty($reg->ruta_pdf_firmado)) {
                    $botones .= '<a href="../' . htmlspecialchars($reg->ruta_pdf_firmado) . '" target="_blank" class="btn btn-primary btn-xs" title="Ver Orden"><i class="fa fa-file-pdf-o"></i></a> ';
                }
                if ($reg->estado_area == 'COMPLETADO' && !empty($reg->ruta_resultado)) {
                    $botones .= '<button class="btn btn-success btn-xs" onclick="verResultado(' . $reg->idsolicitud . ',\'' . htmlspecialchars($reg->ruta_resultado) . '\')" title="Ver Resultado"><i class="fa fa-eye"></i> Ver Resultado</button> ';
                }

                $areaLabel = ($reg->area_destino != 'NINGUNO')
                    ? '<span class="label label-default">' . $reg->area_destino . '</span>'
                    : '<span style="color:#aaa;">—</span>';

                $data[] = [
                    "0" => date('d/m/Y H:i', strtotime($reg->fecha_registro)),
                    "1" => strtoupper($reg->paciente) . '<br><small>' . $reg->num_documento . '</small>',
                    "2" => $reg->tipo,
                    "3" => $areaLabel,
                    "4" => $badgeFirma . $badgeResultado,
                    "5" => $botones
                ];
            }
        }
        echo json_encode([
            "sEcho"                => 1,
            "iTotalRecords"        => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData"               => $data
        ]);
        break;

    default:
        echo json_encode(['success' => false, 'message' => 'Operación no reconocida']);
        break;
}
?>
