#include "client/rendering/FontRenderer.h"
#include "gaming-core/wrapper/Attributes.h"
#include "gaming-core/utils/List.h"

FontRenderer::FontRenderer() : tex("resources/font8x8.png") {
    vertexBuffer.setAttributes(Attributes().addFloat(2).addFloat(2).addFloat(3));
    vertexBuffer.setStreamData(256 * 4 * 7 * sizeof(float));
}

void FontRenderer::drawString(float x, float y, const char* text) {
    const int maxIndex = 256;

    List<float, maxIndex * 4 * 7> buffer;

    int index = 0;
    float r = 1.0f;
    float g = 1.0f;
    float b = 1.0f;

    while(text[index] != '\0' && index < maxIndex) {
        char c = text[index];
        if(c == '&') {
            if(text[index + 1] == '\0' || text[index + 2] == '\0' || text[index + 3] == '\0') {
                break;
            }
            r = (text[index + 1] - '0') * (1.0f / 9.0f);
            g = (text[index + 2] - '0') * (1.0f / 9.0f);
            b = (text[index + 3] - '0') * (1.0f / 9.0f);
            index += 4;
            continue;
        }

        float minX = (c & 0xF) * (1.0f / 16.0f) + 1.0f / 128.0f;
        float minY = (c >> 4) * (1.0f / 16.0f);
        float maxX = minX + (1.0f / 16.0f) - 2.0f / 128.0f;
        float maxY = minY + (1.0f / 16.0f);

        buffer.add(x);
        buffer.add(y);
        buffer.add(minX);
        buffer.add(minY);
        buffer.add(r);
        buffer.add(g);
        buffer.add(b);
        buffer.add(x);
        buffer.add(y + 8);
        buffer.add(minX);
        buffer.add(maxY);
        buffer.add(r);
        buffer.add(g);
        buffer.add(b);
        buffer.add(x + 6);
        buffer.add(y);
        buffer.add(maxX);
        buffer.add(minY);
        buffer.add(r);
        buffer.add(g);
        buffer.add(b);
        buffer.add(x + 6);
        buffer.add(y + 8);
        buffer.add(maxX);
        buffer.add(maxY);
        buffer.add(r);
        buffer.add(g);
        buffer.add(b);

        x += 6;
        index++;
    }

    tex.bind(0);
    vertexBuffer.updateData(0, buffer.getLength() * sizeof(float), buffer.begin());
    vertexBuffer.drawStrip(buffer.getLength() / 7);
}