<?php
/**
 * POST /api/lab/save_servicio_extra.php
 * El enfermero agrega (o actualiza/elimina) un servicio extra a un domicilio.
 *
 * Body JSON:
 *   { domicilio_id, descripcion, tipo, notas?, requiere_pago?, valor? }  -- crear
 *   { id, descripcion?, tipo?, notas?, requiere_pago?, valor? }           -- editar
 *   { id, eliminar: true }                                                -- borrar
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');

$TIPOS_VALIDOS = ['inyeccion','cura','nebulizacion','toma_muestra',
                  'tension_arterial','glucometria','otro'];

try {
    $datos = inputJson();
    $db    = Database::getInstance();

    // ── Eliminar ───────────────────────────────────────────────────────────
    if (!empty($datos['id']) && !empty($datos['eliminar'])) {
        $se = $db->fetch('SELECT * FROM lab_servicios_extra WHERE id = ?', [(int)$datos['id']]);
        if (!$se) jsonError('Servicio no encontrado', 404);
        if (userRole() === 'enfermero') {
            requireEnfermeroAccess((int)$se['realizado_por']);
        }
        $db->delete('lab_servicios_extra', 'id = ?', [(int)$datos['id']]);
        jsonOk(['id' => (int)$datos['id']], 'Servicio eliminado');
    }

    // ── Editar ─────────────────────────────────────────────────────────────
    if (!empty($datos['id'])) {
        $id = (int)$datos['id'];
        $se = $db->fetch('SELECT * FROM lab_servicios_extra WHERE id = ?', [$id]);
        if (!$se) jsonError('Servicio no encontrado', 404);
        if (userRole() === 'enfermero') {
            requireEnfermeroAccess((int)$se['realizado_por']);
        }
        $permitidos = ['descripcion','tipo','notas','requiere_pago','valor'];
        $campos = array_intersect_key($datos, array_flip($permitidos));
        if (isset($campos['tipo']) && !in_array($campos['tipo'], $TIPOS_VALIDOS)) {
            jsonError('Tipo de servicio inválido');
        }
        $db->update('lab_servicios_extra', $campos, 'id = ?', [$id]);
        jsonOk(['id' => $id], 'Servicio actualizado');
    }

    // ── Crear ──────────────────────────────────────────────────────────────
    foreach (['domicilio_id', 'descripcion', 'tipo'] as $req) {
        if (empty($datos[$req])) jsonError("El campo $req es obligatorio");
    }
    if (!in_array($datos['tipo'], $TIPOS_VALIDOS)) {
        jsonError('Tipo de servicio inválido');
    }

    // Verificar que el domicilio existe y que el enfermero le pertenece
    $domId = (int)$datos['domicilio_id'];
    if (userRole() === 'enfermero') {
        $eid = enfermeraId();
        $asig = $db->fetch(
            'SELECT a.id FROM lab_asignaciones a WHERE a.domicilio_id = ? AND a.enfermera_id = ?',
            [$domId, $eid]
        );
        if (!$asig) jsonError('No tienes permiso para este domicilio', 403);
    }

    $id = $db->insert('lab_servicios_extra', [
        'domicilio_id'  => $domId,
        'descripcion'   => trim($datos['descripcion']),
        'tipo'          => $datos['tipo'],
        'notas'         => $datos['notas'] ?? null,
        'requiere_pago' => !empty($datos['requiere_pago']) ? 1 : 0,
        'valor'         => !empty($datos['valor']) ? (float)$datos['valor'] : null,
        'realizado_por' => enfermeraId() ?? (userRole() === 'admin' ? null : null),
    ]);

    jsonOk(['id' => $id], 'Servicio extra registrado');

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