(function () {
    const modForm = document.getElementById('server-mod-form');
    const modResult = document.getElementById('server-mod-result');
    const actionResult = document.getElementById('server-action-result');
    const serverId = document.getElementById('server-id')?.value;
    const card = document.querySelector(`[data-server-id="${serverId}"]`);
    const telemetryStatus = document.getElementById('telemetry-status');
    const telemetryTime = document.getElementById('telemetry-time');
    const telemetryLog = document.getElementById('telemetry-log');
    const restartBtn = () => document.querySelector('.action-btn[data-action="restart"]');
    const startBtn = () => document.querySelector('.action-btn[data-action="start"]');

    if (modForm) {
        modForm.addEventListener('submit', async (event) => {
            event.preventDefault();
            if (modResult) {
                modResult.textContent = 'Подгружаем мод...';
            }

            const payload = {
                server_id: serverId,
                url: document.getElementById('server-mod-url').value
            };

            try {
                const res = await fetch('/add_mods', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify(payload)
                });

                const data = await res.json();
                if (res.ok) {
                    modResult.textContent = `Загружено: ${data.preview.slice(0, 200)}`;
                } else {
                    modResult.textContent = data.message || 'Не удалось загрузить мод.';
                }
            } catch (err) {
                modResult.textContent = 'Модуль загрузки недоступен.';
            }
        });
    }

    function bindActionButtons() {
        document.querySelectorAll('.action-btn').forEach((btn) => {
            if (btn.dataset.bound === '1') return;
            btn.dataset.bound = '1';
        btn.addEventListener('click', async () => {
            const action = btn.getAttribute('data-action');
            if (actionResult) {
                actionResult.textContent = 'Отправляем команду...';
            }

            try {
                const res = await fetch(`/server/${serverId}/action/${action}`, {
                    method: 'POST'
                });
                const data = await res.json();
                if (res.ok) {
                    actionResult.textContent = data.message || 'Команда выполнена.';
                    if (action === 'start' && btn) {
                        btn.setAttribute('data-action', 'restart');
                        btn.textContent = 'Перезапустить';
                    }
                } else {
                    actionResult.textContent = 'Команда отклонена.';
                }
            } catch (err) {
                actionResult.textContent = 'Оркестратор недоступен.';
            }
        });
        });
    }

    function ensureStopButton(show) {
        const group = document.querySelector('.button-group');
        if (!group) return;
        let stopBtn = group.querySelector('.action-btn[data-action="stop"]');
        if (show) {
            if (!stopBtn) {
                stopBtn = document.createElement('button');
                stopBtn.className = 'btn btn-secondary action-btn';
                stopBtn.setAttribute('data-action', 'stop');
                stopBtn.textContent = 'Остановить сервер';
                group.prepend(stopBtn);
                bindActionButtons();
            }
        } else if (stopBtn) {
            stopBtn.remove();
        }
    }

    bindActionButtons();

    const wsProtocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
    const wsUrl = `${wsProtocol}://${window.location.host}/ws`;
    const socket = new WebSocket(wsUrl);

    socket.addEventListener('open', () => {
        if (telemetryStatus) {
            telemetryStatus.textContent = 'Подключение к потоку...';
        }
        if (card) {
            const pill = card.querySelector('.status-pill');
            const label = card.querySelector('.status-text');
            if (pill && label) {
                pill.classList.remove('status-online', 'status-stopped');
                pill.classList.add('status-connecting');
                label.textContent = 'Подключение...';
            }
        }
    });

    socket.addEventListener('message', (event) => {
        try {
            const data = JSON.parse(event.data);
            if (!data.servers || !card) return;
            const server = data.servers.find((s) => s.id === serverId);
            if (!server) return;

            const onlineEl = card.querySelector('.metric-online');
            const maxEl = card.querySelector('.metric-max');
            const tpsEl = card.querySelector('.metric-tps');
            const msptEl = card.querySelector('.metric-mspt');
            const progress = card.querySelector('.progress-fill');
            const statusPill = card.querySelector('.status-pill');
            const statusText = card.querySelector('.status-text');

            if (onlineEl) onlineEl.textContent = server.online;
            if (maxEl) maxEl.textContent = server.max_players;
            if (tpsEl) tpsEl.textContent = server.tps.toFixed(1);
            if (msptEl) msptEl.textContent = server.mspt.toFixed(1);
            if (progress) {
                const percent = Math.round((server.online / server.max_players) * 100);
                progress.style.width = `${percent}%`;
            }
            if (statusPill && statusText) {
                if (server.status === 'stopped') {
                    statusPill.classList.remove('status-online');
                    statusPill.classList.remove('status-connecting', 'status-restarting');
                    statusPill.classList.add('status-stopped');
                    statusText.textContent = 'Остановлен';
                    ensureStopButton(false);
                    const restartButton = restartBtn();
                    const startButton = startBtn();
                    if (restartButton && !startButton) {
                        restartButton.setAttribute('data-action', 'start');
                        restartButton.textContent = 'Запустить';
                    } else if (startButton) {
                        startButton.textContent = 'Запустить';
                    }
                } else if (server.status === 'restarting') {
                    statusPill.classList.remove('status-online', 'status-stopped', 'status-connecting');
                    statusPill.classList.add('status-restarting');
                    statusText.textContent = 'Перезапуск';
                    ensureStopButton(true);
                    const restartButton = restartBtn();
                    if (restartButton) restartButton.textContent = 'Перезапускается...';
                } else {
                    statusPill.classList.remove('status-stopped', 'status-connecting', 'status-restarting');
                    statusPill.classList.add('status-online');
                    statusText.textContent = 'Онлайн';
                    ensureStopButton(true);
                    const startButton = startBtn();
                    if (startButton) {
                        startButton.setAttribute('data-action', 'restart');
                        startButton.textContent = 'Перезапустить';
                    } else {
                        const restartButton = restartBtn();
                        if (restartButton) restartButton.textContent = 'Перезапустить';
                    }
                }
            }

            if (telemetryStatus && telemetryTime) {
                telemetryTime.textContent = new Date(data.ts * 1000).toLocaleString('ru-RU');
                telemetryStatus.textContent = 'Последний срез получен.';
            }

            if (telemetryLog) {
                const line = document.createElement('div');
                line.className = 'log-line';
                line.textContent = `${server.name}: игроков ${server.online}/${server.max_players}, TPS ${server.tps.toFixed(2)}, MSPT ${server.mspt.toFixed(1)}`;
                telemetryLog.prepend(line);
                while (telemetryLog.children.length > 6) {
                    telemetryLog.removeChild(telemetryLog.lastChild);
                }
            }
        } catch (err) {
        }
    });

    socket.addEventListener('close', () => {
        if (telemetryStatus) {
            telemetryStatus.textContent = 'Нет соединения с телеметрией.';
        }
        if (card) {
            const pill = card.querySelector('.status-pill');
            const label = card.querySelector('.status-text');
            if (pill && label) {
                pill.classList.remove('status-online');
                pill.classList.add('status-stopped');
                label.textContent = 'Нет связи';
            }
        }
    });
})();
