#include <fugg.h>

#include <flyff.h>

#include <vector>

#include "Packet.h"

namespace fugg {
    class Client : public flyff::Neuz {
        Client();

    public:
        static Client &instance();

        Client(Client const &) = delete;

        void operator=(Client const &) = delete;

        void send_packet(const uint32_t &id, std::vector<uint8_t> payload) const;

        void send_logout() const;

        void send_move_item_in_inventory(const uint32_t &from_slot, const uint32_t &to_slot) const;

        void send_use_item_in_inventory(const uint32_t &slot) const;

        void send_motion_packet(const uint32_t &action, unsigned long long param0 = 0, unsigned long long param1 = 0,
                                unsigned long long param2 = 0, unsigned long long param3 = 0) const;

        void send_set_target(const unsigned long long &id) const;

        void send_clear_target() const;


        void send_interact_target(const unsigned long long &index) const;

        void send_use_skill(const flyff::SkillID &id, unsigned long long unknown = -1) const;
        void send_follow_target(const unsigned long long &id) const;

        void send_move_to(const double &x, const double &y, const double &z) const;
        void send_chat_message(const std::string &message) const;


    };
}