<?php
/**
 * POST /api/lab/update_domicilio_enfermero.php
 * El enfermero actualiza el estado de un domicilio asignado.
 *
 * Body JSON:
 *   { domicilio_id, nuevo_estado, notas? }
 *
 * Transiciones permitidas al enfermero:
 *   programado   → confirmado
 *   confirmado   → en_camino
 *   en_camino    → en_domicilio
 *   en_domicilio → completado
 *   cualquiera   → cancelado  (con notas obligatorias)
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');

// Flujo permitido enfermero:  estado_actual => [estados_siguientes_posibles]
const TRANSICIONES_ENFERMERO = [
    'programado'   => ['confirmado'],
    'confirmado'   => ['en_camino', 'cancelado'],
    'en_camino'    => ['en_domicilio', 'cancelado'],
    'en_domicilio' => ['completado',  'cancelado'],
];

try {
    $datos  = inputJson();
    $domId  = (int)($datos['domicilio_id']     ?? 0);
    $estado = trim($datos['nuevo_estado']       ?? '');
    $notas  = trim($datos['notas']              ?? '');
    $tempIn = isset($datos['temperatura_inicio']) ? (float)$datos['temperatura_inicio'] : null;
    $tempOut= isset($datos['temperatura_salida']) ? (float)$datos['temperatura_salida'] : null;

    if (!$domId)   jsonError('domicilio_id requerido');
    if (!$estado)  jsonError('nuevo_estado requerido');

    $db   = Database::getInstance();

    // Verificar domicilio y obtener estado actual
    $dom = $db->fetch(
        'SELECT id, estado, paciente_id FROM lab_domicilios WHERE id = ?',
        [$domId]
    );
    if (!$dom) jsonError('Domicilio no encontrado', 404);

    // Verificar que el enfermero tenga asignación activa
    if (userRole() === 'enfermero') {
        $eid  = enfermeraId();
        $asig = $db->fetch(
            "SELECT a.id FROM lab_asignaciones a
             WHERE a.domicilio_id = ? AND a.enfermera_id = ?
               AND a.estado NOT IN ('liberada','completada')",
            [$domId, $eid]
        );
        if (!$asig) jsonError('No tienes asignación activa para este domicilio', 403);

        // Validar transición
        $estadoActual = $dom['estado'];
        $permitidos   = TRANSICIONES_ENFERMERO[$estadoActual] ?? [];
        if (!in_array($estado, $permitidos)) {
            jsonError("No puedes pasar de '$estadoActual' a '$estado'");
        }
    }

    if ($estado === 'cancelado' && !$notas) {
        jsonError('Las notas son obligatorias al cancelar');
    }

    // Actualizar domicilio
    $campos = ['estado' => $estado];
    if ($notas)    $campos['notas_admin']        = $notas;
    if ($tempIn !== null)  $campos['temperatura_inicio'] = $tempIn;
    if ($tempOut !== null) $campos['temperatura_salida'] = $tempOut;
    if ($estado === 'completado') {
        $campos['hora_salida'] = date('H:i:s');
    }
    if ($estado === 'en_domicilio') {
        $campos['hora_llegada'] = date('H:i:s');
    }
    if ($estado === 'en_camino') {
        $campos['hora_en_camino'] = date('H:i:s');
    }
    $db->update('lab_domicilios', $campos, 'id = ?', [$domId]);

    // Actualizar asignación si completado/cancelado
    if (in_array($estado, ['completado', 'cancelado']) && userRole() === 'enfermero') {
        $estAsig = $estado === 'completado' ? 'completada' : 'liberada';
        $db->update(
            'lab_asignaciones',
            ['estado' => $estAsig],
            'domicilio_id = ? AND enfermera_id = ?',
            [$domId, enfermeraId()]
        );
    }

    jsonOk(['domicilio_id' => $domId, 'estado' => $estado], 'Estado actualizado correctamente');

} catch (Exception $e) {
    jsonError($e->getMessage(), 500);
}
