#include <csignal>
#include <iostream>

#include "server.h"
#include "version.h"

#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#include <windows.h>
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
#endif

void signal_handler(int signal)
{
    if (signal == SIGINT) {
        fc_recovery_color();
        exit(signal);
    }
}

int main(int argc, char* argv[])
{
    std::signal(SIGINT, signal_handler);

#ifdef _WIN32
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hConsole, &mode);
    mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hConsole, mode);
#endif

    std::shared_ptr<int> deleter(new int(), [](int* p) {
        fc_recovery_color();
        delete p;
    });

    TLOGI("Build At {} {} under {} on {}", __DATE__, __TIME__, VERSION_GIT_COMMIT, VERSION_GIT_BRANCH);
    int port = 9898;
    if (argc < 2) {
        TLOGI("Use Default Port:{}", port);
    } else {
        std::string str_port(argv[1]);
        port = std::stoi(str_port);
        TLOGI("Use Port:{}", port);
    }
    asio::io_context io_context;
    CTcpServer server(io_context);
    if (!server.start(port)) {
        return -1;
    }
    io_context.run();
    return 0;
}