<?php
/**
 * POST /api/lab/save_nota_domicilio.php
 * Crea o actualiza una nota de domicilio.
 *
 * Body JSON:
 *   { domicilio_id, tipo }              — campos comunes (para crear)
 *   { id, tipo, … }                     — actualizar por id
 *
 * Campos tipo='clinica':
 *   antecedentes, medicamentos, acudiente_nombre, acudiente_documento
 *
 * Campos tipo='libre':
 *   titulo (requerido), cuerpo, imagen_path
 *
 * Reglas:
 *   · Solo puede existir UNA nota tipo='clinica' por domicilio.
 *     Si ya existe y no viene `id`, se hace UPSERT automático.
 *   · Las notas 'libre' son ilimitadas.
 *   · Solo el enfermero dueño o un admin puede editar/crear.
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');

// Tags HTML permitidos en el cuerpo de notas libres (desde contenteditable)
const ALLOWED_HTML_TAGS = '<b><i><u><strong><em><s><strike><ul><ol><li><br><p><div>';

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

    $tipo = $datos['tipo'] ?? '';
    if (!in_array($tipo, ['clinica', 'libre'], true)) {
        jsonError('tipo debe ser "clinica" o "libre"');
    }

    // ── Actualizar nota existente ─────────────────────────────────────────
    if (!empty($datos['id'])) {
        $id   = (int)$datos['id'];
        $nota = $db->fetch('SELECT * FROM lab_domicilio_notas WHERE id = ?', [$id]);
        if (!$nota) jsonError('Nota no encontrada', 404);

        // Verificar propiedad
        if (userRole() === 'enfermero' && (int)$nota['enfermera_id'] !== enfermeraId()) {
            jsonError('No puede editar esta nota', 403);
        }

        $campos = _extraerCampos($datos, $tipo);
        $db->update('lab_domicilio_notas', $campos, 'id = ?', [$id]);
        jsonOk(['id' => $id], 'Nota actualizada');
    }

    // ── Crear nota nueva (o upsert clínica) ───────────────────────────────
    $domId = (int)($datos['domicilio_id'] ?? 0);
    if (!$domId) jsonError('domicilio_id requerido');

    // Verificar que el domicilio existe
    $dom = $db->fetch('SELECT id FROM lab_domicilios WHERE id = ?', [$domId]);
    if (!$dom) jsonError('Domicilio no encontrado', 404);

    // Verificar acceso
    if (userRole() === 'enfermero') {
        $enfId = enfermeraId();
        $asig  = $db->fetch(
            "SELECT id FROM lab_asignaciones WHERE domicilio_id = ? AND enfermera_id = ?",
            [$domId, $enfId]
        );
        if (!$asig) jsonError('Sin acceso a este domicilio', 403);
    }

    $enfId = (userRole() === 'enfermero') ? enfermeraId() : (int)($datos['enfermera_id'] ?? 0);

    // Para nota clínica: solo puede haber una por domicilio → UPDATE si ya existe
    if ($tipo === 'clinica') {
        $existente = $db->fetch(
            'SELECT id FROM lab_domicilio_notas WHERE domicilio_id = ? AND tipo = "clinica"',
            [$domId]
        );
        $campos = _extraerCampos($datos, 'clinica');
        if ($existente) {
            $db->update('lab_domicilio_notas', $campos, 'id = ?', [(int)$existente['id']]);
            jsonOk(['id' => (int)$existente['id']], 'Ficha clínica actualizada');
        } else {
            $campos['domicilio_id']  = $domId;
            $campos['enfermera_id']  = $enfId;
            $campos['tipo']          = 'clinica';
            $id = $db->insert('lab_domicilio_notas', $campos);
            jsonOk(['id' => $id], 'Ficha clínica creada');
        }
    }

    // Nota libre
    if (empty(trim($datos['titulo'] ?? ''))) jsonError('El título es obligatorio');
    $campos = _extraerCampos($datos, 'libre');
    $campos['domicilio_id'] = $domId;
    $campos['enfermera_id'] = $enfId;
    $campos['tipo']         = 'libre';
    $id = $db->insert('lab_domicilio_notas', $campos);
    jsonOk(['id' => $id], 'Nota creada');

} catch (Exception $e) {
    error_log('[save_nota_domicilio] ' . $e->getMessage());
    jsonError($e->getMessage(), 500);
}

// ── Helper interno ────────────────────────────────────────────────────────
function _extraerCampos(array $datos, string $tipo): array {
    if ($tipo === 'clinica') {
        return array_filter([
            'antecedentes'        => isset($datos['antecedentes']) ? trim($datos['antecedentes']) : null,
            'medicamentos'        => isset($datos['medicamentos'])  ? trim($datos['medicamentos'])  : null,
            'acudiente_nombre'    => isset($datos['acudiente_nombre'])    ? trim($datos['acudiente_nombre'])    : null,
            'acudiente_documento' => isset($datos['acudiente_documento']) ? trim($datos['acudiente_documento']) : null,
        ], fn($v) => $v !== null);
    }
    // libre
    $cuerpo = isset($datos['cuerpo'])
        ? strip_tags((string)$datos['cuerpo'], ALLOWED_HTML_TAGS)
        : null;

    // Validar y limpiar archivos (array de {nombre,path,mime,size})
    $archivos = null;
    if (!empty($datos['archivos']) && is_array($datos['archivos'])) {
        $limpios = [];
        foreach ($datos['archivos'] as $a) {
            $path = preg_replace('/[^a-zA-Z0-9._\-]/', '', (string)($a['path'] ?? ''));
            if (!$path) continue;
            $limpios[] = [
                'nombre' => mb_substr(strip_tags((string)($a['nombre'] ?? $path)), 0, 100),
                'path'   => $path,
                'mime'   => preg_replace('/[^a-zA-Z0-9\/\-+.]/', '', (string)($a['mime'] ?? '')),
                'size'   => (int)($a['size'] ?? 0),
            ];
        }
        if ($limpios) $archivos = json_encode($limpios, JSON_UNESCAPED_UNICODE);
    }

    return array_filter([
        'titulo'      => isset($datos['titulo']) ? mb_substr(trim($datos['titulo']), 0, 200) : null,
        'cuerpo'      => $cuerpo ?: null,
        'imagen_path' => isset($datos['imagen_path']) ? preg_replace('/[^a-zA-Z0-9._\-]/', '', (string)$datos['imagen_path']) : null,
        'archivos'    => $archivos,
    ], fn($v) => $v !== null);
}
