package server.ws;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.debug.DebugApiConfigurator;
import utils.config.AppConfig;

import java.time.Duration;

/**
 * WsServer — поднимает Jetty WS на /ws.
 *
 * ВАЖНО:
 *  - перед стартом сервера выполняем recovery tmp-блокчейнов.
 *  - если обнаружена несогласованность, которую сервер сам чинить не может —
 *    recovery бросает исключение и сервер не стартует.
 */
public final class WsServer {

    private static final Logger log = LoggerFactory.getLogger(WsServer.class);

    public static void main(String[] args) throws Exception {

        // ============================================================
        // 0) Восстановление консистентности blockchain файлов
        // ============================================================
        try {
            BlockchainTmpRecoveryOnStartup.runRecoveryOrThrow();
        } catch (Exception e) {
            // Уже должно быть “большое” уведомление через BlockchainAdminNotifier,
            // но на всякий случай логируем ещё раз.
            log.error("❌ Сервер НЕ будет запущен: критическая ошибка восстановления blockchain tmp-файлов.", e);
            throw e; // останавливаем запуск
        }

        // ============================================================
        // 1) Настройки порта
        // ============================================================
        AppConfig config = AppConfig.getInstance();
        int port = 7070;
        try {
            String portStr = config.getParam("server.port");
            if (portStr != null && !portStr.isBlank()) {
                port = Integer.parseInt(portStr.trim());
            }
        } catch (Exception e) {
            log.info("Не удалось прочитать параметр server.port, используем порт по умолчанию {}", port);
        }

        // ============================================================
        // 2) Запуск Jetty WS
        // ============================================================
        Server server = new Server(port);

        ServletContextHandler context = new ServletContextHandler();
        context.setContextPath("/");
        server.setHandler(context);

        // HTTP debug API
        DebugApiConfigurator.register(context);

        // Инициализация контейнера WebSocket
        JettyWebSocketServletContainerInitializer.configure(context, (servletContext, wsContainer) -> {
            // Таймаут простоя соединения (Jetty 11 синтаксис)
            wsContainer.setIdleTimeout(Duration.ofMinutes(5));

            // Маппинг эндпоинта
            wsContainer.addMapping("/ws", (req, resp) -> new BlockchainWsEndpoint());
        });

        server.start();
        log.info("✅ WS сервер запущен на ws://localhost:{}/ws", port);
        server.join();
    }
}