#pragma once

#include <Model3D.h>

#include "Area.h"
#include "BlockType.h"
#include "Registries.h"

using namespace Framework;

class BasicBlockItemType;
class Chunk;

class Block : public Model3D
{
protected:
    float hp;
    float maxHP;
    const BlockType* zType;
    bool sideVisible[6];
    Vec3<int> location;
    Framework::Textur* breakTextur;
    unsigned char lightData[6 * 6];
    char lightBuffer[24 * 4];
    char needRequestModelInfo;

    void beforeRender(
        GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader) override;
    void afterRender(
        GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader) override;

public:
    Block(const BlockType* zType,
        Vec3<int> position,
        Model3DData* model,
        Model3DTextur* texture,
        int maxHp,
        bool transparent,
        bool needRequestModelInfo);
    virtual ~Block();

    void api(char* message);
    void setLightData(Direction dir, unsigned char* data);
    bool isVisible() const;

    Vec3<int> getLocation() const;
    const BlockType* zBlockType() const;
    Textur* zEffectTextur() override;
    float getEffectPercentage() override;
    friend Chunk;
    Text printLightInfo();
};