#pragma once

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

#include "ModelInfo.h"
#include "StaticRegistry.h"

class Entity;

class EntityTypeEnum
{
public:
    static const int PLAYER = 0;
    static const int ITEM = 1;
};

class EntityType : public virtual Framework::ReferenceCounter
{
private:
    const int id;
    const ModelInfo model;

protected:
    EntityType(int id, ModelInfo model);

    virtual void loadSuperEntity(
        Entity* zEntity, Framework::StreamReader* zReader) const;
    virtual void saveSuperEntity(
        Entity* zEntity, Framework::StreamWriter* zWriter) const;
    virtual void createSuperEntity(Entity* zEntity) const;

public:
    virtual Entity* loadEntity(Framework::StreamReader* zReader) const;
    virtual void saveEntity(
        Entity* zEntity, Framework::StreamWriter* zWriter) const;
    virtual Entity* createEntityAt(
        Framework::Vec3<float> position, int dimensionId) const;
    virtual Entity* createEntity(Framework::Vec3<float> position,
        int dimensionId,
        int entityId) const = 0;

    int getId() const;
    const ModelInfo& getModel() const;
};