// staff.js - полный код с исправлениями и счетчиком истекающих подписей

// Глобальные переменные
let expirationAlertDays = 0;
let allPractitioners = [];
let availableStaff = [];
let filteredPractitioners = [];
let currentSortField = 'familyName'; // По умолчанию сортируем по фамилии
let currentSortDirection = 'asc';

// Утилиты
function showAlert(message, type = 'success') {
    const alertContainer = document.getElementById('alertContainer');
    const alertId = 'alert-' + Date.now();

    const alertHTML = `
        <div id="${alertId}" class="alert alert-${type} alert-dismissible fade show" role="alert">
            ${message}
            <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        </div>
    `;

    alertContainer.innerHTML = alertHTML;

    if (type === 'success') {
        setTimeout(() => {
            const alert = document.getElementById(alertId);
            if (alert) {
                const bsAlert = new bootstrap.Alert(alert);
                bsAlert.close();
            }
        }, 3000);
    }
}

// Расчет дней до истечения
function getDaysUntilExpiry(expiryDate) {
    const now = new Date();
    const expiry = new Date(expiryDate);
    const diffTime = expiry - now;
    return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
}

// Форматирование даты
function formatDate(dateString) {
    const date = new Date(dateString);
    return date.toLocaleDateString('ru-RU');
}

// Подсчет сотрудников с истекающими подписями
function countExpiringPractitioners() {
    if (!Array.isArray(allPractitioners)) return 0;

    return allPractitioners.filter(practitioner => {
        if (!practitioner.expired_at) return false;
        const daysLeft = getDaysUntilExpiry(practitioner.expired_at);
        return daysLeft <= expirationAlertDays && daysLeft >= 0;
    }).length;
}

// Обновление счетчика истекающих подписей
function updateExpiringCount() {
    const count = countExpiringPractitioners();
    const container = document.getElementById('expiringCountContainer');
    const badge = document.getElementById('expiringCountBadge');

    if (count > 0) {
        badge.textContent = count;
        container.style.display = 'block';

        // Обновляем текст подсказки
        const daysText = expirationAlertDays % 10 === 1 && expirationAlertDays % 100 !== 11 ? 'день' :
            expirationAlertDays % 10 >= 2 && expirationAlertDays % 10 <= 4 &&
                (expirationAlertDays % 100 < 10 || expirationAlertDays % 100 >= 20) ? 'дня' : 'дней';

        const titleText = `${count} ${count === 1 ? 'сотрудник' : 'сотрудников'} с истекающим сроком подписи (менее ${expirationAlertDays} ${daysText})`;

        // Устанавливаем оба атрибута для надежности
        badge.setAttribute('title', titleText);
        badge.setAttribute('data-bs-title', titleText);
        badge.setAttribute('data-bs-original-title', titleText);

        // Обновляем существующий tooltip или создаем новый
        if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {
            let tooltip = bootstrap.Tooltip.getInstance(badge);
            if (tooltip) {
                // Обновляем содержимое существующего tooltip
                tooltip.setContent({ '.tooltip-inner': titleText });
                // Также обновляем title в экземпляре
                tooltip._config.title = titleText;
            } else {
                // Создаем новый tooltip
                new bootstrap.Tooltip(badge);
            }
        }

        // Если есть истекающие сроки, переключаем сортировку на срок действия
        if (currentSortField === 'familyName') {
            currentSortField = 'expired_at';
            currentSortDirection = 'asc';
            applySorting();
        }
    } else {
        container.style.display = 'none';

        // Уничтожаем tooltip при скрытии
        if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {
            const tooltip = bootstrap.Tooltip.getInstance(badge);
            if (tooltip) {
                tooltip.dispose();
            }
        }

        // Удаляем атрибуты tooltip
        badge.removeAttribute('data-bs-title');
        badge.removeAttribute('data-bs-original-title');

        // Если нет истекающих сроков и текущая сортировка по сроку, возвращаем сортировку по фамилии
        if (currentSortField === 'expired_at') {
            currentSortField = 'familyName';
            currentSortDirection = 'asc';
            applySorting();
        }
    }
}

// Сортировка данных
function sortPractitioners(practitioners, field, direction) {
    return [...practitioners].sort((a, b) => {
        let aValue = a[field];
        let bValue = b[field];

        // Обработка специальных случаев
        if (field === 'expired_at') {
            // Сортировка по дате окончания
            // Пустые даты отправляем в конец списка (максимальная дата)
            aValue = a.expired_at ? new Date(a.expired_at) : new Date(8640000000000000);
            bValue = b.expired_at ? new Date(b.expired_at) : new Date(8640000000000000);

            if (direction === 'asc') {
                return aValue - bValue;
            } else {
                return bValue - aValue;
            }
        } else if (field === 'esiaAuth') {
            // Сортировка по типу подписи (УКЭП -> МЧД)
            aValue = a.esiaAuth ? 1 : 0;
            bValue = b.esiaAuth ? 1 : 0;
        } else if (field === 'familyName' || field === 'givenName' || field === 'middleName') {
            // Сортировка по ФИО (с учетом возможных null)
            aValue = aValue || '';
            bValue = bValue || '';
        }

        // Сравнение для не-датовых полей
        if (field !== 'expired_at') {
            if (aValue < bValue) return direction === 'asc' ? -1 : 1;
            if (aValue > bValue) return direction === 'asc' ? 1 : -1;
            return 0;
        }
    });
}

// Обновление иконок сортировки
function updateSortIcons() {
    document.querySelectorAll('#staffTable th[data-sort]').forEach(th => {
        const icon = th.querySelector('.sort-icon');
        const field = th.getAttribute('data-sort');

        if (field === currentSortField) {
            icon.className = currentSortDirection === 'asc'
                ? 'bi bi-arrow-down sort-icon'
                : 'bi bi-arrow-up sort-icon';
        } else {
            icon.className = 'bi bi-arrow-down-up sort-icon';
        }
    });
}

// Загрузка данных
async function loadData() {
    try {
        // Загружаем expirationAlert
        const settingsResponse = await fetch('/settings/get', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });

        if (settingsResponse.ok) {
            const settingsData = await settingsResponse.json();
            expirationAlertDays = settingsData.expirationAlert || 0;
        } else {
            expirationAlertDays = 0;
        }

        // Обновляем отображение настроек
        updateExpirationAlertDisplay();

        // Загружаем сотрудников
        const staffResponse = await fetch('/staff/getAll', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });

        const respJson = await staffResponse.json();
        if (staffResponse.ok && respJson.status === "ok") {
            allPractitioners = respJson.data || [];
            filteredPractitioners = [...allPractitioners];

            // Сбрасываем сортировку на фамилию по умолчанию
            currentSortField = 'familyName';
            currentSortDirection = 'asc';

            applySorting();
        } else {
            allPractitioners = [];
            filteredPractitioners = [];
            console.error('Ошибка при загрузке сотрудников:', respJson.message);
        }

        // Обновляем счетчик истекающих подписей (он сам переключит сортировку если нужно)
        updateExpiringCount();

    } catch (error) {
        console.error('Ошибка при загрузке данных:', error);
        showAlert('Ошибка при загрузке данных', 'danger');
        allPractitioners = [];
        filteredPractitioners = [];
        updateExpirationAlertDisplay();
        updateExpiringCount();
    }
}

// Обновление отображения expirationAlert
function updateExpirationAlertDisplay() {
    const container = document.getElementById('expirationAlertContainer');

    // Восстанавливаем оригинальную структуру
    container.innerHTML = `
        <span id="expirationAlertValue" class="badge bg-secondary fs-6">${expirationAlertDays}</span>
        <button type="button" id="editExpirationAlertBtn" class="btn btn-sm btn-outline-primary ms-2">
            <i class="bi bi-pencil"></i>
        </button>
    `;

    // Перепривязываем обработчик к восстановленной кнопке
    document.getElementById('editExpirationAlertBtn').addEventListener('click', handleEditExpirationAlert);

    // Обновляем счетчик при изменении настроек
    updateExpiringCount();
}

// Обработчик редактирования expirationAlert
function handleEditExpirationAlert() {
    const container = document.getElementById('expirationAlertContainer');
    const currentValue = expirationAlertDays;

    container.innerHTML = `
        <input type="number" id="editExpirationAlertInput" 
            class="form-control form-control-sm" 
            value="${currentValue}" min="1" max="180" style="width: 80px;">
        <div class="btn-group btn-group-sm ms-2">
            <button type="button" class="btn btn-success" id="saveExpirationAlertBtn">
                <i class="bi bi-check"></i>
            </button>
            <button type="button" class="btn btn-secondary" id="cancelExpirationAlertBtn">
                <i class="bi bi-x"></i>
            </button>
        </div>
    `;

    // Фокус на поле ввода
    setTimeout(() => {
        const input = document.getElementById('editExpirationAlertInput');
        if (input) {
            input.focus();
            input.select();
        }
    }, 100);

    // Обработчик сохранения
    document.getElementById('saveExpirationAlertBtn').addEventListener('click', async function () {
        const input = document.getElementById('editExpirationAlertInput');
        const newValue = parseInt(input.value);

        if (isNaN(newValue) || newValue < 1 || newValue > 180) {
            showAlert('Значение должно быть от 1 до 180 дней', 'warning');
            input.focus();
            return;
        }

        const success = await saveExpirationAlert(newValue);
    });

    // Обработчик отмены
    document.getElementById('cancelExpirationAlertBtn').addEventListener('click', function () {
        updateExpirationAlertDisplay();
    });
}

// Применение сортировки
function applySorting() {
    filteredPractitioners = sortPractitioners(filteredPractitioners, currentSortField, currentSortDirection);
    updateStaffTable();
    updateSortIcons();
}

// Поиск в таблице
function searchInTable(searchTerm) {
    if (!searchTerm.trim()) {
        filteredPractitioners = [...allPractitioners];
    } else {
        const searchLower = searchTerm.toLowerCase();
        filteredPractitioners = allPractitioners.filter(practitioner => {
            // Поиск по ФИО
            const fullName = [
                practitioner.familyName || '',
                practitioner.givenName || '',
                practitioner.middleName || ''
            ].join(' ').toLowerCase();

            // Поиск по типу подписи
            const signatureType = practitioner.esiaAuth ? 'укэп' : 'мчд';

            // Поиск по номеру МЧД
            const attorneyNumber = (practitioner.attorney || '').toLowerCase();

            return fullName.includes(searchLower) ||
                signatureType.includes(searchLower) ||
                attorneyNumber.includes(searchLower);
        });
    }
    applySorting();
}

// Обновление таблицы сотрудников
function updateStaffTable() {
    const tbody = document.getElementById('staffTableBody');

    if (!Array.isArray(filteredPractitioners) || filteredPractitioners.length === 0) {
        tbody.innerHTML = `
            <tr>
                <td colspan="6" class="text-center text-muted py-4">
                    Нет данных о сотрудниках
                </td>
            </tr>
        `;
        return;
    }

    let rows = '';

    filteredPractitioners.forEach(practitioner => {
        // Проверяем, что practitioner - объект
        if (!practitioner || typeof practitioner !== 'object') {
            console.warn('Некорректные данные сотрудника:', practitioner);
            return;
        }

        // Определяем тип подписи
        let signatureTypeHtml;
        if (practitioner.esiaAuth) {
            signatureTypeHtml = '<span class="badge bg-success">УКЭП</span>';
        } else {
            // Экранируем специальные символы в attorney
            const attorney = (practitioner.attorney || '').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
            const eyeIcon = `<button type="button" class="btn btn-sm btn-link p-0 ms-1" 
                onclick="showAttorneyPopup('${attorney}', this)">
                <i class="bi bi-eye"></i>
            </button>`;
            signatureTypeHtml = `<span class="badge bg-warning text-dark">МЧД</span>${eyeIcon}`;
        }

        // Форматируем дату и проверяем срок
        let expiryHtml;
        if (practitioner.expired_at) {
            const daysLeft = getDaysUntilExpiry(practitioner.expired_at);
            const isWarning = daysLeft <= expirationAlertDays && daysLeft >= 0;
            const isExpired = daysLeft < 0;
            const isOk = daysLeft > expirationAlertDays;

            let badgeClass = 'bg-info';
            let textColor = '';

            if (isExpired) {
                badgeClass = 'bg-danger';
                textColor = 'text-danger fw-bold';
            } else if (isWarning) {
                badgeClass = 'bg-warning text-dark';
                textColor = 'text-warning fw-bold';
            } else if (isOk) {
                badgeClass = 'bg-info';
                textColor = 'text-secondary';
            }

            expiryHtml = `
                <div class="d-flex align-items-center justify-content-start">
                    <span class="${textColor}">${formatDate(practitioner.expired_at)}</span>
                    <span class="badge ${badgeClass} ms-2">${daysLeft} дн.</span>
                </div>
            `;
        } else {
            expiryHtml = `
                <div class="d-flex align-items-center justify-content-between">
                    <span class="text-muted">Не установлен</span>
                    <span class="badge bg-secondary ms-2">-</span>
                </div>
            `;
        }

        // Кнопки действий
        const actionsHtml = `
            <div class="btn-group btn-group-sm" role="group">
                <button type="button" class="btn btn-outline-primary" 
                    onclick="editPractitioner('${practitioner.userIdLpu}', ${practitioner.esiaAuth})" title="Изменить">
                    <i class="bi bi-pencil"></i>
                </button>
                <button type="button" class="btn btn-outline-danger" 
                    onclick="confirmDelete('${practitioner.userIdLpu}')" title="Удалить">
                    <i class="bi bi-trash"></i>
                </button>
            </div>
        `;

        rows += `
            <tr>
                <td>${practitioner.familyName || ''}</td>
                <td>${practitioner.givenName || ''}</td>
                <td>${practitioner.middleName || ''}</td>
                <td>${signatureTypeHtml}</td>
                <td>${expiryHtml}</td>
                <td>${actionsHtml}</td>
            </tr>
        `;
    });

    tbody.innerHTML = rows;
}

// Показать попап с номером МЧД
function showAttorneyPopup(attorneyNumber, buttonElement) {
    const popup = document.getElementById('attorneyPopup');
    const attorneyNumberElement = document.getElementById('attorneyNumber');

    attorneyNumberElement.textContent = attorneyNumber;

    // Позиционируем попап рядом с кнопкой
    const rect = buttonElement.getBoundingClientRect();
    popup.style.top = (rect.bottom + 5) + 'px';
    popup.style.left = (rect.left) + 'px';
    popup.style.display = 'block';
}

// Скрыть попап с номером МЧД
function hideAttorneyPopup() {
    const popup = document.getElementById('attorneyPopup');
    popup.style.display = 'none';
}

// Загрузка доступных сотрудников для добавления
async function loadAvailableStaff() {
    try {
        // Показываем индикатор загрузки
        const loadingElement = document.getElementById('staffLoading');
        const tableElement = document.getElementById('availableStaffTableBody');

        loadingElement.style.display = 'block';
        tableElement.innerHTML = '';

        const response = await fetch('/staff/available', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });

        const data = await response.json();
        loadingElement.style.display = 'none';

        if (response.ok && data.status === "ok") {
            availableStaff = data.data || [];
            updateAvailableStaffTable();
        } else {
            console.error('Ошибка при загрузке доступных сотрудников:', data.message);
            showAlert('Ошибка при загрузке доступных сотрудников', 'danger');
            tableElement.innerHTML = `
                <tr>
                    <td colspan="5" class="text-center text-danger py-4">
                        Ошибка при загрузке данных
                    </td>
                </tr>
            `;
        }
    } catch (error) {
        console.error('Ошибка при загрузке доступных сотрудников:', error);
        showAlert('Ошибка при загрузке доступных сотрудников', 'danger');
        document.getElementById('staffLoading').style.display = 'none';
    }
}

// Обновление таблицы доступных сотрудников
function updateAvailableStaffTable(searchTerm = '') {
    const tbody = document.getElementById('availableStaffTableBody');

    if (!Array.isArray(availableStaff) || availableStaff.length === 0) {
        tbody.innerHTML = `
            <tr>
                <td colspan="5" class="text-center text-muted py-4">
                    Нет доступных сотрудников для добавления
                </td>
            </tr>
        `;
        return;
    }

    // Фильтрация по поисковому запросу
    let filteredStaff = availableStaff;
    if (searchTerm) {
        const searchLower = searchTerm.toLowerCase();
        filteredStaff = availableStaff.filter(staff =>
            (staff.surname && staff.surname.toLowerCase().includes(searchLower)) ||
            (staff.name && staff.name.toLowerCase().includes(searchLower)) ||
            (staff.secondName && staff.secondName.toLowerCase().includes(searchLower))
        );
    }

    if (filteredStaff.length === 0) {
        tbody.innerHTML = `
            <tr>
                <td colspan="5" class="text-center text-muted py-4">
                    По запросу "${searchTerm}" ничего не найдено
                </td>
            </tr>
        `;
        return;
    }

    let rows = '';

    filteredStaff.forEach(staff => {
        // Форматируем специальности
        const specialties = (staff.specialties || [])
            .map(s => s.title)
            .join(', ');

        // Проверяем, добавлен ли уже сотрудник по userIdLpu
        const isAdded = allPractitioners.some(p => p.userIdLpu === staff.id.toString());

        let addButtonsHtml;
        if (isAdded) {
            addButtonsHtml = '<span class="badge bg-secondary">Уже добавлен</span>';
        } else {
            addButtonsHtml = `
                <div class="d-flex">
                    <button type="button" class="btn btn-outline-success btn-sm me-2" 
                        onclick="prepareAddUKEP('${staff.id}')" title="Добавить как УКЭП">
                        УКЭП
                    </button>
                    <button type="button" class="btn btn-outline-secondary btn-sm" 
                        onclick="prepareAddMCHD('${staff.id}')" title="Добавить как МЧД">
                        МЧД
                    </button>
                </div>
            `;
        }

        rows += `
            <tr>
                <td>${staff.surname || ''}</td>
                <td>${staff.name || ''}</td>
                <td>${staff.secondName || ''}</td>
                <td>${specialties}</td>
                <td>${addButtonsHtml}</td>
            </tr>
        `;
    });

    tbody.innerHTML = rows;
}

// Подготовка к добавлению УКЭП
function prepareAddUKEP(staffId) {
    const staff = availableStaff.find(s => s.id.toString() === staffId);
    if (!staff) return;

    // Сохраняем данные сотрудника в data-атрибутах для использования при сохранении
    const modal = document.getElementById('editUKEPModal');
    modal.dataset.staffId = staffId;
    modal.dataset.staffSurname = staff.surname || '';
    modal.dataset.staffName = staff.name || '';
    modal.dataset.staffSecondName = staff.secondName || '';

    document.getElementById('ukepPractitionerId').value = staffId;
    document.getElementById('ukepForm').reset();
    document.getElementById('ukepFile').required = true;

    const bsModal = new bootstrap.Modal(modal);
    bsModal.show();
}

// Подготовка к добавлению МЧД
function prepareAddMCHD(staffId) {
    const staff = availableStaff.find(s => s.id.toString() === staffId);
    if (!staff) return;

    // Сохраняем данные сотрудника в data-атрибутах для использования при сохранении
    const modal = document.getElementById('editMCHDModal');
    modal.dataset.staffId = staffId;
    modal.dataset.staffSurname = staff.surname || '';
    modal.dataset.staffName = staff.name || '';
    modal.dataset.staffSecondName = staff.secondName || '';

    document.getElementById('mchdPractitionerId').value = staffId;
    document.getElementById('mchdForm').reset();

    const bsModal = new bootstrap.Modal(modal);
    bsModal.show();
}

// Редактирование существующего сотрудника
function editPractitioner(userIdLpu, isEsiaAuth) {
    const practitioner = allPractitioners.find(p => p.userIdLpu === userIdLpu);
    if (!practitioner) return;

    if (isEsiaAuth) {
        // Редактирование УКЭП
        document.getElementById('ukepPractitionerId').value = userIdLpu;
        document.getElementById('ukepFile').required = false;

        // Очищаем data-атрибуты модального окна
        const modal = document.getElementById('editUKEPModal');
        delete modal.dataset.staffId;
        delete modal.dataset.staffSurname;
        delete modal.dataset.staffName;
        delete modal.dataset.staffSecondName;

        if (practitioner.expired_at) {
            // Прямое преобразование даты без корректировки часового пояса
            const date = new Date(practitioner.expired_at);
            document.getElementById('ukepExpiryDate').value = date.toISOString().split('T')[0];
        }

        const bsModal = new bootstrap.Modal(modal);
        bsModal.show();
    } else {
        // Редактирование МЧД
        document.getElementById('mchdPractitionerId').value = userIdLpu;
        document.getElementById('mchdNumber').value = practitioner.attorney || '';

        // Очищаем data-атрибуты модального окна
        const modal = document.getElementById('editMCHDModal');
        delete modal.dataset.staffId;
        delete modal.dataset.staffSurname;
        delete modal.dataset.staffName;
        delete modal.dataset.staffSecondName;

        if (practitioner.expired_at) {
            // Прямое преобразование даты без корректировки часового пояса
            const date = new Date(practitioner.expired_at);
            document.getElementById('mchdExpiryDate').value = date.toISOString().split('T')[0];
        }

        const bsModal = new bootstrap.Modal(modal);
        bsModal.show();
    }
}

// Подтверждение удаления
function confirmDelete(userIdLpu) {
    document.getElementById('deletePractitionerId').value = userIdLpu;
    const modal = new bootstrap.Modal(document.getElementById('confirmDeleteModal'));
    modal.show();
}

// Сохранение expirationAlert
async function saveExpirationAlert(newValue) {
    try {
        const response = await fetch('/settings/update-expiration-alert', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                expirationAlert: newValue
            })
        });

        const data = await response.json();

        if (response.ok && data.status === "ok") {
            expirationAlertDays = newValue;
            updateExpirationAlertDisplay();
            updateStaffTable();
            updateExpiringCount();
            showAlert('Настройка сохранена', 'success');
            return true;
        } else {
            showAlert(data.message || 'Ошибка при сохранении', 'danger');
            updateExpirationAlertDisplay();
            return false;
        }
    } catch (error) {
        console.error('Ошибка:', error);
        showAlert('Ошибка при сохранении', 'danger');
        updateExpirationAlertDisplay();
        return false;
    }
}

// Чтение файла как ArrayBuffer
function readFileAsArrayBuffer(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result);
        reader.onerror = reject;
        reader.readAsArrayBuffer(file);
    });
}

// Инициализация
document.addEventListener('DOMContentLoaded', function () {
    // Инициализируем отображение expirationAlert перед загрузкой данных
    updateExpirationAlertDisplay();

    // Загружаем начальные данные
    loadData();

    // Обработчики сортировки для заголовков таблицы
    document.querySelectorAll('#staffTable th[data-sort]').forEach(th => {
        th.addEventListener('click', function () {
            const field = this.getAttribute('data-sort');

            if (field === currentSortField) {
                currentSortDirection = currentSortDirection === 'asc' ? 'desc' : 'asc';
            } else {
                currentSortField = field;
                currentSortDirection = 'asc';
            }

            applySorting();
        });
    });

    // Обработчик поиска в основной таблице
    document.getElementById('staffTableSearch')?.addEventListener('input', function (e) {
        searchInTable(e.target.value);
    });

    // Обработчик очистки поиска в основной таблице
    document.getElementById('clearTableSearchBtn')?.addEventListener('click', function () {
        document.getElementById('staffTableSearch').value = '';
        searchInTable('');
    });

    // Обработчик кнопки добавления сотрудника
    document.getElementById('addStaffBtn').addEventListener('click', function () {
        loadAvailableStaff();
        const modal = new bootstrap.Modal(document.getElementById('addStaffModal'));
        modal.show();
    });

    // Обработчик поиска в модальном окне
    document.getElementById('staffSearchInput')?.addEventListener('input', function (e) {
        updateAvailableStaffTable(e.target.value);
    });

    // Обработчик очистки поиска
    document.getElementById('clearSearchBtn')?.addEventListener('click', function () {
        document.getElementById('staffSearchInput').value = '';
        updateAvailableStaffTable('');
    });

    // Обработчик сохранения МЧД
    document.getElementById('saveMCHDBtn').addEventListener('click', async function () {
        const userIdLpu = document.getElementById('mchdPractitionerId').value;
        const mchdNumber = document.getElementById('mchdNumber').value.trim();
        const expiryDate = document.getElementById('mchdExpiryDate').value;

        if (!mchdNumber || !expiryDate) {
            showAlert('Заполните все обязательные поля', 'warning');
            return;
        }

        const btn = this;
        const originalText = btn.innerHTML;
        btn.disabled = true;
        btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span>';

        try {
            let requestBody;
            const modal = document.getElementById('editMCHDModal');

            // Проверяем, есть ли data-атрибуты для нового сотрудника
            if (modal.dataset.staffId && modal.dataset.staffId === userIdLpu) {
                // Новый сотрудник из availableStaff
                const staff = availableStaff.find(s => s.id.toString() === userIdLpu);
                if (!staff) {
                    btn.disabled = false;
                    btn.innerHTML = originalText;
                    showAlert('Сотрудник не найден в списке доступных', 'danger');
                    return;
                }

                // Формируем полные данные для нового сотрудника
                requestBody = {
                    familyName: staff.surname,
                    givenName: staff.name,
                    middleName: staff.secondName || '',
                    userIdLpu: userIdLpu,
                    esiaAuth: false,
                    attorney: mchdNumber,
                    expired_at: expiryDate
                };

                const response = await fetch('/staff/add', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(requestBody)
                });

                const data = await response.json();

                btn.disabled = false;
                btn.innerHTML = originalText;

                if (response.ok && data.status === "ok") {
                    showAlert('Сотрудник добавлен', 'success');

                    // Закрываем модальное окно
                    const mchdModal = bootstrap.Modal.getInstance(modal);
                    if (mchdModal) mchdModal.hide();

                    // Очищаем данные в модальном окне
                    delete modal.dataset.staffId;
                    delete modal.dataset.staffSurname;
                    delete modal.dataset.staffName;
                    delete modal.dataset.staffSecondName;

                    // Обновляем данные
                    await loadData();
                    loadAvailableStaff();
                } else {
                    showAlert(data.message || 'Ошибка при добавлении сотрудника', 'danger');
                }
            } else {
                // Редактирование существующего сотрудника
                const existingPractitioner = allPractitioners.find(p => p.userIdLpu === userIdLpu);
                if (!existingPractitioner) {
                    btn.disabled = false;
                    btn.innerHTML = originalText;
                    showAlert('Сотрудник не найден', 'danger');
                    return;
                }

                requestBody = {
                    userIdLpu: userIdLpu,
                    attorney: mchdNumber,
                    expired_at: expiryDate
                };

                const response = await fetch('/staff/update', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(requestBody)
                });

                const data = await response.json();

                btn.disabled = false;
                btn.innerHTML = originalText;

                if (response.ok && data.status === "ok") {
                    showAlert('Данные обновлены', 'success');

                    // Закрываем модальное окно
                    const mchdModal = bootstrap.Modal.getInstance(modal);
                    if (mchdModal) mchdModal.hide();

                    // Обновляем данные
                    await loadData();
                } else {
                    showAlert(data.message || 'Ошибка при обновлении данных', 'danger');
                }
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при сохранении данных', 'danger');
            btn.disabled = false;
            btn.innerHTML = originalText;
        }
    });

    // Обработчик сохранения УКЭП
    document.getElementById('saveUKEPBtn').addEventListener('click', async function () {
        const userIdLpu = document.getElementById('ukepPractitionerId').value;
        const ukepFile = document.getElementById('ukepFile').files[0];
        const expiryDate = document.getElementById('ukepExpiryDate').value;

        if (!expiryDate) {
            showAlert('Заполните дату окончания действия', 'warning');
            return;
        }

        const btn = this;
        const originalText = btn.innerHTML;
        btn.disabled = true;
        btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span>';

        try {
            const modal = document.getElementById('editUKEPModal');

            // Проверяем, есть ли data-атрибуты для нового сотрудника
            if (modal.dataset.staffId && modal.dataset.staffId === userIdLpu) {
                // Новый сотрудник из availableStaff - файл обязателен
                if (!ukepFile) {
                    btn.disabled = false;
                    btn.innerHTML = originalText;
                    showAlert('Выберите файл УКЭП', 'warning');
                    return;
                }

                const staff = availableStaff.find(s => s.id.toString() === userIdLpu);
                if (!staff) {
                    btn.disabled = false;
                    btn.innerHTML = originalText;
                    showAlert('Сотрудник не найден в списке доступных', 'danger');
                    return;
                }

                const staffData = {
                    familyName: staff.surname,
                    givenName: staff.name,
                    middleName: staff.secondName || '',
                    userIdLpu: userIdLpu,
                    esiaAuth: true,
                    attorney: '',
                    expired_at: expiryDate
                };

                const fileBuffer = await readFileAsArrayBuffer(ukepFile);
                const requestBody = {
                    ...staffData,
                    signature: Array.from(new Uint8Array(fileBuffer))
                };

                const response = await fetch('/staff/add', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(requestBody)
                });

                const data = await response.json();

                btn.disabled = false;
                btn.innerHTML = originalText;

                if (response.ok && data.status === "ok") {
                    showAlert('Сотрудник добавлен', 'success');

                    const ukepModal = bootstrap.Modal.getInstance(modal);
                    if (ukepModal) ukepModal.hide();

                    delete modal.dataset.staffId;
                    delete modal.dataset.staffSurname;
                    delete modal.dataset.staffName;
                    delete modal.dataset.staffSecondName;

                    await loadData();
                    loadAvailableStaff();
                } else {
                    showAlert(data.message || 'Ошибка при добавлении сотрудника', 'danger');
                }
            } else {
                const existingPractitioner = allPractitioners.find(p => p.userIdLpu === userIdLpu);
                if (!existingPractitioner) {
                    btn.disabled = false;
                    btn.innerHTML = originalText;
                    showAlert('Сотрудник не найден', 'danger');
                    return;
                }

                const updateData = {
                    userIdLpu: userIdLpu,
                    expired_at: expiryDate
                };

                if (ukepFile) {
                    const fileBuffer = await readFileAsArrayBuffer(ukepFile);
                    updateData.signature = Array.from(new Uint8Array(fileBuffer));
                }

                const response = await fetch('/staff/update', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(updateData)
                });

                const data = await response.json();

                btn.disabled = false;
                btn.innerHTML = originalText;

                if (response.ok && data.status === "ok") {
                    showAlert('Данные обновлены', 'success');

                    const ukepModal = bootstrap.Modal.getInstance(modal);
                    if (ukepModal) ukepModal.hide();

                    await loadData();
                } else {
                    showAlert(data.message || 'Ошибка при обновлении данных', 'danger');
                }
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при сохранении данных', 'danger');
            btn.disabled = false;
            btn.innerHTML = originalText;
        }
    });

    // Обработчик подтверждения удаления
    document.getElementById('confirmDeleteBtn').addEventListener('click', async function () {
        const userIdLpu = document.getElementById('deletePractitionerId').value;

        try {
            const btn = this;
            const originalText = btn.innerHTML;
            btn.disabled = true;
            btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span>';

            const response = await fetch('/staff/delete', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ userIdLpu: userIdLpu })
            });

            const data = await response.json();

            btn.disabled = false;
            btn.innerHTML = originalText;

            if (response.ok && data.status === "ok") {
                showAlert('Сотрудник удален', 'success');

                const modal = bootstrap.Modal.getInstance(document.getElementById('confirmDeleteModal'));
                if (modal) modal.hide();

                await loadData();
                loadAvailableStaff();
            } else {
                showAlert(data.message || 'Ошибка при удалении', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при удалении', 'danger');
        }
    });

    // Обработчики попапа с номером МЧД
    document.getElementById('closeAttorneyPopupBtn').addEventListener('click', hideAttorneyPopup);
    document.getElementById('closeAttorneyBtn').addEventListener('click', hideAttorneyPopup);

    document.getElementById('copyAttorneyBtn').addEventListener('click', function () {
        const attorneyNumber = document.getElementById('attorneyNumber').textContent;
        navigator.clipboard.writeText(attorneyNumber).then(() => {
            showAlert('Номер скопирован в буфер обмена', 'success');
            hideAttorneyPopup();
        }).catch(err => {
            console.error('Ошибка при копировании:', err);
            showAlert('Ошибка при копировании', 'danger');
        });
    });

    // Закрытие попапа при клике вне его
    document.addEventListener('click', function (event) {
        const popup = document.getElementById('attorneyPopup');
        if (popup.style.display === 'block' &&
            !popup.contains(event.target) &&
            !event.target.closest('[onclick*="showAttorneyPopup"]')) {
            hideAttorneyPopup();
        }
    });
});