#pragma once

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

#include "StaticRegistry.h"

class Block;

class BlockType : public virtual Framework::ReferenceCounter
{
private:
    const int id;
    Block* defaultBlock;

protected:
    BlockType( int id );
    virtual ~BlockType();

    virtual void loadSuperBlock( Block* zBlock, Framework::StreamReader* zReader );
    virtual void initializeSuperBlock( Block* zBlock ) = 0;

public:
    virtual Block* createBlock( Framework::Vec3<int> position ) = 0;
    virtual Block* loadBlock( Framework::Vec3<int> position, Framework::StreamReader* zReader );
    virtual void updateBlock( Block* zBlock, Framework::StreamReader* zReader );
    virtual const Block* zDefault();
    virtual bool needsInstance() const = 0;

    int getId() const;
};