/*
 *  IXTest.h
 *  Author: Benjamin Sergeant
 *  Copyright (c) 2018 Machine Zone. All rights reserved.
 */

#pragma once

#include <iostream>
#include <ixwebsocket/IXGetFreePort.h>
#include <ixwebsocket/IXSocketTLSOptions.h>
#include <ixwebsocket/IXWebSocketServer.h>
#include <mutex>
#include <spdlog/spdlog.h>
#include <sstream>
#include <string>
#include <vector>

namespace ix
{
    // Sleep for ms milliseconds.
    void msleep(int ms);

    // Generate a relatively random string
    std::string generateSessionId();

    // Record and report websocket traffic
    void setupWebSocketTrafficTrackerCallback();
    void reportWebSocketTraffic();

    struct TLogger
    {
    public:
        template<typename T>
        TLogger& operator<<(T const& obj)
        {
            std::lock_guard<std::mutex> lock(_mutex);

            std::stringstream ss;
            ss << obj;
            spdlog::info(ss.str());
            return *this;
        }

    private:
        static std::mutex _mutex;
    };

    void log(const std::string& msg);

    bool startWebSocketEchoServer(ix::WebSocketServer& server);

    SocketTLSOptions makeClientTLSOptions();
    SocketTLSOptions makeServerTLSOptions(bool preferTLS);
    std::string getHttpScheme();
    std::string getWsScheme(bool preferTLS);
} // namespace ix