#pragma once

#include <ReferenceCounter.h>
#include <Vec3.h>
#include <Writer.h>

class Chunk;
class Block;
class Entity;
class Dimension;

class ChatMessage;
class ChatObserver;
class ChunkMap;

class NetworkMessage : public virtual Framework::ReferenceCounter
{
private:
    char* address;
    char addressLength;
    bool broadcast;
    char* message;
    int msgLength;
    bool useBackground;

public:
    NetworkMessage();
    virtual ~NetworkMessage();

    void addressChunck(const Chunk* zChunk);
    void addressEntity(const Entity* zEntity);
    void addressBlock(const Block* zBlock);
    void addressDimension(const Dimension* zDim);
    void openDialog(Framework::Text dialogName);
    void addressGui(Framework::Text elementId);
    void setMessage(char* msg, int length);
    void sendChatMessage(ChatMessage* zMsg);
    void sendChatOptions(ChatObserver* zOptions);
    void sendMap(ChunkMap* zMap);
    void sendPlayerPositions(char *msg, int length);
    void setUseBackground();
    void sendToAll();

    void writeTo(Framework::StreamWriter* zWriter) const;
    bool isBroadcast() const;
    bool isEmpty() const;
    bool isUseBackground() const;
    NetworkMessage* clone() const;
};