<?php
/**
 * modules/registro_exams/api/cambiar_estado_item.php
 * POST — cambia el estado de un ítem, muestra o de la orden entera.
 *
 * Body JSON:
 * {
 *   "tipo":     "item" | "muestra" | "orden",
 *   "id":       int,
 *   "estado":   string,         // valor según ENUM de la tabla
 *   "notas":    string          // opcional, solo para ítem
 * }
 *
 * Adicional para tipo="muestra" (crear muestra si id=null):
 * {
 *   "tipo":          "muestra",
 *   "id":            null,        // null = crear nueva
 *   "orden_id":      int,
 *   "tipo_muestra":  "sangre_venosa" | ...,
 *   "codigo_barras": string,
 *   "estado":        "tomada"
 * }
 */

require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireExams();

$body = inputJson();
$tipo = $body['tipo'] ?? '';

$estadosItem    = ['pendiente','muestra_tomada','en_proceso','resultado_listo','entregado'];
$estadosMuestra = ['pendiente','tomada','procesando','procesada','rechazada'];
$estadosOrden   = ['pendiente','en_proceso','completa','entregada','cancelada'];

$pdo = db();

switch ($tipo) {

    // ── Cambiar estado de un ítem individual ──────────────────────
    case 'item': {
        $id     = isset($body['id']) ? (int) $body['id'] : 0;
        $estado = $body['estado'] ?? '';
        if ($id <= 0 || !in_array($estado, $estadosItem, true)) {
            jsonError('Parámetros inválidos para ítem');
        }
        $notas = isset($body['notas']) && $body['notas'] !== '' ? $body['notas'] : null;

        // Obtener orden_id para actualizar padre si aplica
        $stmtG = $pdo->prepare('SELECT orden_id FROM exam_items WHERE id = ?');
        $stmtG->execute([$id]);
        $item = $stmtG->fetch(PDO::FETCH_ASSOC);
        if (!$item) {
            jsonError('Ítem no encontrado', 404);
        }

        $pdo->prepare(
            'UPDATE exam_items SET estado = ?, notas_tecnico = ?, creado_at = creado_at WHERE id = ?'
        )->execute([$estado, $notas, $id]);

        // Si todos los ítems de la orden están listos → marcar orden como completa
        if ($estado === 'resultado_listo' || $estado === 'entregado') {
            $stmtC = $pdo->prepare(
                "SELECT COUNT(*) FROM exam_items
                  WHERE orden_id = ?
                    AND estado NOT IN ('resultado_listo','entregado')"
            );
            $stmtC->execute([$item['orden_id']]);
            if ((int) $stmtC->fetchColumn() === 0) {
                $pdo->prepare(
                    "UPDATE exam_ordenes SET estado = 'completa', updated_at = NOW() WHERE id = ?"
                )->execute([$item['orden_id']]);
            }
        }

        jsonOk([], 'Estado actualizado');
    }

    // ── Crear o actualizar una muestra ──────────────────────────
    case 'muestra': {
        $id        = isset($body['id']) && $body['id'] !== null ? (int) $body['id'] : null;
        $estado    = $body['estado'] ?? 'tomada';
        $ordenId   = isset($body['orden_id'])      ? (int) $body['orden_id'] : 0;
        $tipoMuest = $body['tipo_muestra'] ?? 'sangre_venosa';
        $barcode   = trim($body['codigo_barras']   ?? '');

        if (!in_array($estado, $estadosMuestra, true)) {
            jsonError('Estado de muestra inválido');
        }

        if ($id === null) {
            // Crear nueva muestra
            if ($ordenId <= 0) {
                jsonError('orden_id requerido para crear muestra');
            }
            $pdo->prepare('
                INSERT INTO exam_muestras
                    (orden_id, tipo_muestra, codigo_barras, tomada_por, tomada_at, estado)
                VALUES (?, ?, ?, ?, NOW(), ?)
            ')->execute([$ordenId, $tipoMuest, $barcode ?: null, adminId(), $estado]);

            $newId = (int) $pdo->lastInsertId();

            // Marcar ítems como muestra_tomada si están pendientes
            $pdo->prepare(
                "UPDATE exam_items SET estado = 'muestra_tomada'
                  WHERE orden_id = ? AND estado = 'pendiente'"
            )->execute([$ordenId]);

            // Actualizar orden a en_proceso si aún está pendiente
            $pdo->prepare(
                "UPDATE exam_ordenes SET estado = 'en_proceso', updated_at = NOW()
                  WHERE id = ? AND estado = 'pendiente'"
            )->execute([$ordenId]);

            jsonOk(['muestra_id' => $newId], 'Muestra registrada');
        } else {
            // Actualizar muestra existente
            $pdo->prepare(
                'UPDATE exam_muestras SET estado = ?, codigo_barras = ? WHERE id = ?'
            )->execute([$estado, $barcode ?: null, $id]);

            jsonOk([], 'Muestra actualizada');
        }
    }

    // ── Cambiar estado de la orden completa ─────────────────────
    case 'orden': {
        $id    = isset($body['id']) ? (int) $body['id'] : 0;
        $estado = $body['estado'] ?? '';
        if ($id <= 0 || !in_array($estado, $estadosOrden, true)) {
            jsonError('Parámetros inválidos para orden');
        }
        $pdo->prepare(
            'UPDATE exam_ordenes SET estado = ?, updated_at = NOW() WHERE id = ?'
        )->execute([$estado, $id]);

        jsonOk([], 'Estado de orden actualizado');
    }

    default:
        jsonError('Tipo de operación desconocido: ' . $tipo);
}
