<?php
/**
 * POST /api/lab/create_enfermero_user.php
 * Crea o actualiza el usuario de acceso al sistema para una enfermera.
 * Solo administradores pueden llamar este endpoint.
 *
 * Body JSON:
 *   { enfermera_id, username, password?, full_name? }
 *   Si el usuario ya existe para esa enfermera_id, actualiza username/password.
 *   Si password viene vacío en actualización, no cambia la contraseña.
 *
 * Returns:
 *   { ok:true, message, user_id }
 */
require_once __DIR__ . '/_helpers.php';
requireAdmin();
requireMethod('POST');

try {
    $datos      = inputJson();
    $enfermeraId = (int)($datos['enfermera_id'] ?? 0);
    $username   = trim($datos['username'] ?? '');
    $password   = $datos['password'] ?? '';
    $fullName   = trim($datos['full_name'] ?? '');

    if (!$enfermeraId) jsonError('enfermera_id es obligatorio');
    if (!$username)    jsonError('username es obligatorio');
    if (strlen($username) < 3) jsonError('El usuario debe tener al menos 3 caracteres');

    $db = Database::getInstance();

    // Verificar que la enfermera existe
    $enf = $db->fetch('SELECT id, nombre_completo FROM lab_enfermeras WHERE id = ?', [$enfermeraId]);
    if (!$enf) jsonError('Enfermera no encontrada', 404);

    if (empty($fullName)) $fullName = $enf['nombre_completo'];

    // ¿Ya existe un usuario vinculado a esta enfermera?
    $existente = $db->fetch(
        'SELECT id, username FROM admin_users WHERE enfermera_id = ? LIMIT 1',
        [$enfermeraId]
    );

    if ($existente) {
        // --- ACTUALIZAR ---
        // Verificar que el nuevo username no esté en uso por OTRO usuario
        $conflicto = $db->fetch(
            'SELECT id FROM admin_users WHERE username = ? AND id != ?',
            [$username, $existente['id']]
        );
        if ($conflicto) jsonError("El usuario '$username' ya está en uso por otra cuenta");

        $sets  = ['username = ?', 'full_name = ?', 'is_active = 1', 'updated_at = NOW()'];
        $vals  = [$username, $fullName];

        if (!empty($password)) {
            if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
            $sets[] = 'password_hash = ?';
            $vals[] = password_hash($password, PASSWORD_DEFAULT);
        }

        $vals[] = $existente['id'];
        $db->execute(
            'UPDATE admin_users SET ' . implode(', ', $sets) . ' WHERE id = ?',
            $vals
        );

        jsonOk(['user_id' => $existente['id']], 'Acceso actualizado correctamente');

    } else {
        // --- CREAR ---
        if (empty($password)) jsonError('La contraseña es obligatoria para crear el acceso');
        if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');

        // Verificar username único
        $conflicto = $db->fetch('SELECT id FROM admin_users WHERE username = ?', [$username]);
        if ($conflicto) jsonError("El usuario '$username' ya está en uso");

        $hash = password_hash($password, PASSWORD_DEFAULT);
        $db->execute(
            "INSERT INTO admin_users (username, password_hash, full_name, role, enfermera_id, is_active, created_at)
             VALUES (?, ?, ?, 'enfermero', ?, 1, NOW())",
            [$username, $hash, $fullName, $enfermeraId]
        );
        $userId = $db->lastInsertId();

        jsonOk(['user_id' => $userId], 'Acceso creado correctamente');
    }

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