#pragma once

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

#include "Area.h"
#include "ModelInfo.h"

class Block;

class BlockType : public virtual Framework::ReferenceCounter
{
private:
    const int id;
    bool needsInstance;
    int initialMaxHP;
    bool needModelSubscription;
    bool fluid;
    char maxFlowDistance;
    ModelInfo model;
    Direction defaultFrontDirection;

public:
    BlockType(int id,
        bool needsInstance,
        ModelInfo model,
        int initialMaxHP,
        bool needModelSubscription,
        bool fluid,
        char maxFlowDistance,
        Direction defaultFrontDirection);
    ~BlockType();
    Block* createBlock(Framework::Vec3<int> position,
        bool passable,
        float speedModifier,
        Direction frontDirection);
    bool doesNeedInstance() const;
    bool doesNeedModelSubscription() const;
    bool isFluid() const;
    char getMaxFlowDistance() const;
    Direction getDefaultFrontDirection() const;

    const ModelInfo& getModelInfo() const;

    int getId() const;
};