#pragma once
#include "object/outputstream.h"

typedef const unsigned char* glyph_t;

class Framebuffer : public OutputStream
{
	private:
		Framebuffer(Framebuffer& copy);
		const glyph_t *font;
		unsigned int fontX, fontY;
		unsigned char fontSize;
		unsigned char scale;

	public:
		unsigned char *data;

		Framebuffer(unsigned char *data) : font(0), fontX(0), fontY(0), fontSize(1), scale(1), data(data) {}

		constexpr static unsigned int const width = CONFIG_framebuffer_width;
		constexpr static unsigned int const height = CONFIG_framebuffer_height;

		void clear();
		void scroll();
		void fillBox(unsigned int x, unsigned int y, unsigned int w, unsigned int h);
		void drawAt(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *image);
		void drawBattery(unsigned int x, unsigned int y, unsigned char percent, bool charging = false);
		void setFont(const glyph_t *font, unsigned char fontSize = 1) { this->font = font; this->fontSize = fontSize; }
		void setPos(unsigned int newX, unsigned int newY) { fontX = newX; fontY = newY; }
		virtual void put(char c) override;
};

extern Framebuffer fb;