//
// Created by koncord on 24.04.17.
//

#ifndef OPENMW_QUERYCLIENT_HPP
#define OPENMW_QUERYCLIENT_HPP

#include <string>
#include <RakPeerInterface.h>
#include <components/openmw-mp/Master/PacketMasterQuery.hpp>
#include <components/openmw-mp/Master/PacketMasterUpdate.hpp>
#include <apps/browser/ServerModel.hpp>

class QueryClient
{
private:
    QueryClient(QueryClient const &) = delete;
    QueryClient(QueryClient &&) = delete;
    QueryClient &operator=(QueryClient const &) = delete;
    QueryClient &operator=(QueryClient &&) = delete;
public:
    static QueryClient &Get();
    void SetServer(std::string addr, unsigned short port);
    std::map<RakNet::SystemAddress, QueryData> Query();
    std::pair<RakNet::SystemAddress, QueryData> Update(RakNet::SystemAddress addr);
    int Status();
private:
    RakNet::ConnectionState Connect();
    MASTER_PACKETS GetAnswer();
protected:
    QueryClient();
    ~QueryClient();
private:
    int status;
    RakNet::RakPeerInterface *peer;
    RakNet::SystemAddress masterAddr;
    mwmp::PacketMasterQuery *pmq;
    mwmp::PacketMasterUpdate *pmu;
    std::pair<RakNet::SystemAddress, ServerData> server;

};


#endif //OPENMW_QUERYCLIENT_HPP