#ifndef API_BOT_HPP_
#define API_BOT_HPP_
#include <utils/types.hpp>
#include <string>
#include <exception>
#include <iostream>
#include <tuple>
using std::string;
using std::cout;
using std::endl;
template<typename...Args>
class Bot {
private:
    void initializeNets(const json& data) {
        initializeNetsImpl(data, std::index_sequence_for<Args...>{});
    }
    template<unsigned long... Is>
    void initializeNetsImpl(const json& data, std::index_sequence<Is...>) {
        net = std::make_tuple(std::make_unique<Args>(data)...);
    }
    json data;
public:
    std::tuple<std::unique_ptr<Args>...> net;
    Bot(const json& data) : data(data) {
        initializeNets(data);
    }
};
class BotHandler : Bot<> {
private:
    json data;
public:
    BotHandler(const json& data) : data(data), Bot(data) {};
    string id() {
        return data["d"]["id"];
    }
    bool isBot() {
        try {
            return data["d"]["bot"];
        }
        catch (std::exception& e) {
            return false;
        }
    }
};
#endif