// Глобальный объект для хранения текущих настроек с сервера
let currentSettings = {
    medods: {
        host: '',
        port: null,
        // apiKey: false,
    },
    n3health: {
        host: '',
        authorization: '',
        xIdLpu: ''
    }
};

// Состояния изменений
let medodsChanged = false;
let n3healthChanged = false;

// Утилиты
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 isMedodsFormValid() {
    const host = document.getElementById('medodsHost').value;
    const port = document.getElementById('medodsPort').value;
    const file = document.getElementById('medodsCsvFile').files[0];

    return host && port && (file || (currentSettings.medods.identityExists && currentSettings.medods.secretKeyExists));
}

// Проверка заполненности формы N3Health
function isN3HealthFormValid() {
    const host = document.getElementById('n3healthHost').value;
    const auth = document.getElementById('n3healthAuthorization').value;
    const lpu = document.getElementById('n3healthXIdLpu').value;

    return host && auth && lpu;
}

// Обновление статусов блоков
function updateStatusIndicators() {
    // Пароль - всегда считаем настроенным если есть соединение с сервером
    document.getElementById('passwordStatus').className = 'badge bg-success';
    document.getElementById('passwordStatus').textContent = 'Настроен';

    // Медодс
    const medodsStatus = document.getElementById('medodsStatus');
    const hasMedodsConfig = currentSettings.medods.host &&
        currentSettings.medods.port &&
        currentSettings.medods.identityExists &&
        currentSettings.medods.secretKeyExists;

    if (hasMedodsConfig) {
        medodsStatus.className = 'badge bg-success';
        medodsStatus.textContent = 'Настроен';
    } else {
        medodsStatus.className = 'badge bg-danger';
        medodsStatus.textContent = 'Требуется настройка';
    }

    // N3Health
    const n3healthStatus = document.getElementById('n3healthStatus');
    const hasN3HealthConfig = currentSettings.n3health.host &&
        currentSettings.n3health.authorization &&
        currentSettings.n3health.xIdLpu;

    if (hasN3HealthConfig) {
        n3healthStatus.className = 'badge bg-success';
        n3healthStatus.textContent = 'Настроен';
    } else {
        n3healthStatus.className = 'badge bg-danger';
        n3healthStatus.textContent = 'Требуется настройка';
    }
}

// Обновление кнопок Медодс
function updateMedodsButtons() {
    const isValid = isMedodsFormValid();
    const testBtn = document.getElementById('testMedodsBtn');
    const saveBtn = document.getElementById('saveMedodsBtn');
    const cancelBtn = document.getElementById('cancelMedodsBtn');

    testBtn.disabled = !isValid || !medodsChanged;
    saveBtn.disabled = true; // Сохранение только после успешной проверки
    cancelBtn.disabled = !medodsChanged;
}

// Обновление кнопок N3Health
function updateN3HealthButtons() {
    const isValid = isN3HealthFormValid();
    const testBtn = document.getElementById('testN3HealthBtn');
    const saveBtn = document.getElementById('saveN3HealthBtn');
    const cancelBtn = document.getElementById('cancelN3HealthBtn');

    testBtn.disabled = !isValid || !n3healthChanged;
    saveBtn.disabled = true; // Сохранение только после успешной проверки
    cancelBtn.disabled = !n3healthChanged;
}

// Чтение CSV файла
function parseCSV(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();

        reader.onload = function (e) {
            try {
                const content = e.target.result.trim();

                // Удаляем BOM если есть
                const cleanContent = content.replace(/^\uFEFF/, '');

                // Ищем все непустые строки
                const lines = cleanContent.split('\n')
                    .map(line => line.trim())
                    .filter(line => line && !line.startsWith('#') && !line.startsWith('//'));


                if (lines.length === 0) {
                    reject(new Error('CSV файл пустой'));
                    return;
                }

                // Берем первую непустую строку
                const dataLine = lines[1];

                // Разделяем по точке с запятой
                const parts = dataLine.split(';').map(part => part.trim());

                if (parts.length >= 2) {
                    const identity = parts[0];
                    const secretKey = parts.slice(1).join(';'); // На случай если есть больше частей


                    if (identity && secretKey) {
                        resolve({ identity, secretKey });
                    } else {
                        reject(new Error('Не удалось извлечь identity и secretKey'));
                    }
                } else {
                    reject(new Error('Формат CSV: значение1;значение2 (разделенные точкой с запятой)'));
                }
            } catch (error) {
                console.error('CSV parsing error:', error);
                reject(error);
            }
        };

        reader.onerror = reject;
        reader.readAsText(file);
    });
}

// Загрузка текущих настроек
async function loadCurrentSettings() {
    try {
        const response = await fetch('/settings/get', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });

        if (response.ok) {
            const data = await response.json();

            // Сохраняем текущие настройки
            if (data.medodsApiHost) {
                currentSettings.medods.host = data.medodsApiHost;
                document.getElementById('medodsHost').value = data.medodsApiHost;
            }

            if (data.medodsApiPort) {
                currentSettings.medods.port = data.medodsApiPort;
                document.getElementById('medodsPort').value = data.medodsApiPort;
            }

            if (data.medodsApiIdentity && data.medodsApiSecretKey) {
                currentSettings.medods.identityExists = true;
                currentSettings.medods.secretKeyExists = true;
                document.getElementById('medodsApiKeyStatus').className = 'badge bg-success';
                document.getElementById('medodsApiKeyStatus').textContent = 'есть';
            }

            if (data.n3healthHost) {
                currentSettings.n3health.host = data.n3healthHost;
                document.getElementById('n3healthHost').value = data.n3healthHost;
            }

            if (data.n3healthAutorization) {
                currentSettings.n3health.authorization = data.n3healthAutorization;
                document.getElementById('n3healthAuthorization').value = data.n3healthAutorization;
            }

            if (data.n3healthXIdLpu) {
                currentSettings.n3health.xIdLpu = data.n3healthXIdLpu;
                document.getElementById('n3healthXIdLpu').value = data.n3healthXIdLpu;
            }

            updateStatusIndicators();
        }
    } catch (error) {
        console.error('Ошибка при загрузке настроек:', error);
        showAlert('Ошибка при загрузке настроек', 'danger');
    }
}

// Сброс формы Медодс к исходным значениям
function resetMedodsForm() {
    document.getElementById('medodsHost').value = currentSettings.medods.host;
    document.getElementById('medodsPort').value = currentSettings.medods.port;
    document.getElementById('medodsCsvFile').value = '';
    medodsChanged = false;
    updateMedodsButtons();
}

// Сброс формы N3Health к исходным значениям
function resetN3HealthForm() {
    document.getElementById('n3healthHost').value = currentSettings.n3health.host;
    document.getElementById('n3healthAuthorization').value = currentSettings.n3health.authorization;
    document.getElementById('n3healthXIdLpu').value = currentSettings.n3health.xIdLpu;
    n3healthChanged = false;
    updateN3HealthButtons();
}

// Проверка изменений в формах
function setupChangeListeners() {
    // Медодс
    const medodsFields = ['medodsHost', 'medodsPort', 'medodsCsvFile'];
    medodsFields.forEach(fieldId => {
        document.getElementById(fieldId).addEventListener('input', () => {
            medodsChanged = true;
            updateMedodsButtons();
        });
    });

    // N3Health
    const n3healthFields = ['n3healthHost', 'n3healthAuthorization', 'n3healthXIdLpu'];
    n3healthFields.forEach(fieldId => {
        document.getElementById(fieldId).addEventListener('input', () => {
            n3healthChanged = true;
            updateN3HealthButtons();
        });
    });
}

// Инициализация
document.addEventListener('DOMContentLoaded', function () {
    // Загружаем текущие настройки
    loadCurrentSettings();

    // Настраиваем отслеживание изменений
    setupChangeListeners();

    // Обработчик формы пароля
    document.getElementById('passwordForm').addEventListener('submit', async function (e) {
        e.preventDefault();

        const currentPassword = document.getElementById('currentPassword').value;
        const newPassword = document.getElementById('newPassword').value;
        const confirmPassword = document.getElementById('confirmPassword').value;

        if (newPassword !== confirmPassword) {
            showAlert('Новый пароль и подтверждение не совпадают', 'danger');
            return;
        }

        try {
            const response = await fetch('/settings/update-password', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    currentPassword,
                    newPassword
                })
            });

            const data = await response.json();

            if (response.ok && data.status === "ok") {
                showAlert('Пароль успешно изменен. Вы будете перенаправлены на страницу входа.');
                // Редирект на страницу входа через 2 секунды
                setTimeout(() => {
                    window.location.href = '/logout';
                }, 2000);
            } else {
                showAlert(data.error || 'Ошибка при смене пароля', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при смене пароля', 'danger');
        }
    });

    // Обработчик проверки соединения Медодс
    document.getElementById('testMedodsBtn').addEventListener('click', async function () {
        const host = document.getElementById('medodsHost').value;
        const port = document.getElementById('medodsPort').value;
        const file = document.getElementById('medodsCsvFile').files[0];

        let identity, secretKey;

        // Если загружен новый файл - парсим его
        if (file) {
            try {
                const csvData = await parseCSV(file);
                identity = csvData.identity;
                secretKey = csvData.secretKey;
            } catch (error) {
                showAlert(`Ошибка чтения CSV: ${error.message}`, 'danger');
                return;
            }
        }

        try {
            const testBtn = this;
            const originalText = testBtn.textContent;
            testBtn.disabled = true;
            testBtn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status"></span> Проверка...';

            const response = await fetch('/settings/test-medods', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    host,
                    port: parseInt(port),
                    identity,
                    secretKey
                })
            });

            const data = await response.json();

            testBtn.disabled = false;
            testBtn.textContent = originalText;

            if (response.ok && data.status === "ok") {
                showAlert('Соединение с Медодс успешно установлено', 'success');
                // Активируем кнопку сохранения
                document.getElementById('saveMedodsBtn').disabled = false;
            } else {
                showAlert(data.message || 'Ошибка при проверке соединения', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при проверке соединения', 'danger');
        }
    });

    // Обработчик сохранения настроек Медодс
    document.getElementById('medodsForm').addEventListener('submit', async function (e) {
        e.preventDefault();

        const host = document.getElementById('medodsHost').value;
        const port = document.getElementById('medodsPort').value;
        const file = document.getElementById('medodsCsvFile').files[0];

        let identity, secretKey;

        // Если загружен новый файл - парсим его
        if (file) {
            try {
                const csvData = await parseCSV(file);
                identity = csvData.identity;
                secretKey = csvData.secretKey;
            } catch (error) {
                showAlert(`Ошибка чтения CSV: ${error.message}`, 'danger');
                return;
            }
        }

        try {
            const response = await fetch('/settings/save-medods', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    host,
                    port: parseInt(port),
                    identity,
                    secretKey
                })
            });

            const data = await response.json();

            if (response.ok && data.status === "ok") {
                showAlert('Настройки Медодс успешно сохранены', 'success');

                // Обновляем текущие настройки
                currentSettings.medods.host = host;
                currentSettings.medods.port = parseInt(port);
                currentSettings.medods.identityExists = true;
                currentSettings.medods.secretKeyExists = true;

                // Обновляем индикаторы
                document.getElementById('medodsApiKeyStatus').className = 'badge bg-success';
                document.getElementById('medodsApiKeyStatus').textContent = 'есть';

                // Сбрасываем флаги изменений
                medodsChanged = false;

                // Обновляем кнопки и статусы
                updateMedodsButtons();
                updateStatusIndicators();
            } else {
                showAlert(data.message || 'Ошибка при сохранении', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при сохранении', 'danger');
        }
    });

    // Обработчик отмены изменений Медодс
    document.getElementById('cancelMedodsBtn').addEventListener('click', resetMedodsForm);

    // Обработчик проверки соединения N3Health
    document.getElementById('testN3HealthBtn').addEventListener('click', async function () {
        const host = document.getElementById('n3healthHost').value;
        const authorization = document.getElementById('n3healthAuthorization').value;
        const xIdLpu = document.getElementById('n3healthXIdLpu').value;

        try {
            const testBtn = this;
            const originalText = testBtn.textContent;
            testBtn.disabled = true;
            testBtn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status"></span> Проверка...';

            const response = await fetch('/settings/test-n3health', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    host,
                    authorization,
                    xIdLpu
                })
            });

            const data = await response.json();

            testBtn.disabled = false;
            testBtn.textContent = originalText;

            if (response.ok && data.status === "ok") {
                showAlert('Соединение с N3Health успешно установлено', 'success');
                // Активируем кнопку сохранения
                document.getElementById('saveN3HealthBtn').disabled = false;
            } else {
                showAlert(data.message || 'Ошибка при проверке соединения', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при проверке соединения', 'danger');
        }
    });

    // Обработчик сохранения настроек N3Health
    document.getElementById('n3healthForm').addEventListener('submit', async function (e) {
        e.preventDefault();

        const host = document.getElementById('n3healthHost').value;
        const authorization = document.getElementById('n3healthAuthorization').value;
        const xIdLpu = document.getElementById('n3healthXIdLpu').value;

        try {
            const response = await fetch('/settings/save-n3health', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    host,
                    authorization,
                    xIdLpu
                })
            });

            const data = await response.json();

            if (response.ok) {
                showAlert('Настройки N3Health успешно сохранены', 'success');

                // Обновляем текущие настройки
                currentSettings.n3health.host = host;
                currentSettings.n3health.authorization = authorization;
                currentSettings.n3health.xIdLpu = xIdLpu;

                // Сбрасываем флаги изменений
                n3healthChanged = false;

                // Обновляем кнопки и статусы
                updateN3HealthButtons();
                updateStatusIndicators();
            } else {
                showAlert(data.error || 'Ошибка при сохранении', 'danger');
            }
        } catch (error) {
            console.error('Ошибка:', error);
            showAlert('Ошибка при сохранении', 'danger');
        }
    });

    // Обработчик отмены изменений N3Health
    document.getElementById('cancelN3HealthBtn').addEventListener('click', resetN3HealthForm);
});