#include "text.hpp"

using namespace blit;

bool variable_width = true;
TextAlign alignment = TextAlign::top_left;

std::string alignment_to_string(TextAlign alignment) {
	switch (alignment) {
		case TextAlign::bottom_left:
			return "align: bottom_left";
		case TextAlign::bottom_right:
			return "align: bottom_right";
		case TextAlign::top_left:
			return "align: top_left";
		case TextAlign::top_right:
			return "align: top_right";
		case TextAlign::center_center:
			return "align: center_center";
		case TextAlign::center_left:
			return "align: center_left";
		case TextAlign::center_right:
			return "align: center_right";
		case TextAlign::top_center:
			return "align: top_center";
		case TextAlign::bottom_center:
			return "align: bottom_center";
	}
	return "";
}

void init() {
    set_screen_mode(ScreenMode::hires);
}

void render(uint32_t time) {
	screen.pen = Pen(0, 0, 0);
	screen.clear();

	screen.alpha = 255;
	screen.pen = Pen(255, 255, 255);
	screen.rectangle(Rect(0, 0, 320, 14));
	screen.pen = Pen(0, 0, 0);
	screen.text("Text Rendering", minimal_font, Point(5, 4));

    // alignment
    Rect text_rect(20, 20, 120, 80);

    screen.pen = Pen(64, 64, 64);
    screen.rectangle(text_rect);

	screen.pen = Pen(255, 255, 255);
    std::string text = "This is some aligned text!\nUse the dpad to change the alignment\nand A to toggle variable-width.";
    text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width);

    screen.pen = Pen(0xFF, 0xFF, 0xFF);
    screen.text(text, minimal_font, text_rect, variable_width, alignment);

	screen.text(alignment_to_string(alignment), minimal_font, Point(80, 102), true, TextAlign::center_h);

    auto size = screen.measure_text(text, minimal_font, variable_width);
    screen.text("bounds: " + std::to_string(size.w) + "x" + std::to_string(size.h), minimal_font, Point(80, 110), true, TextAlign::center_h);

    text_rect.x += 160;

    // clipping
    Rect clip(text_rect.x + 30 + 30 * cosf(time / 1000.0f), text_rect.y, 60, 80);
    screen.pen = Pen(64, 64, 64);
    screen.rectangle(text_rect);

    text = "This text is clipped!\nIt's slightly hard to read since half of it is missing.";
    text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width);

    screen.pen = Pen(0xFF, 0xFF, 0xFF);
    screen.text(text, minimal_font, text_rect, variable_width, TextAlign::center_center, clip);
}

void update(uint32_t time) {
    if (buttons.released & Button::A)
        variable_width = !variable_width;

    alignment = TextAlign::top_left;

	if (buttons & Button::DPAD_DOWN) {
		alignment = (TextAlign)(alignment | TextAlign::bottom);
	}
	else if (!(buttons & Button::DPAD_UP)) {
		alignment = (TextAlign)(alignment | TextAlign::center_v);
	}

	if (buttons & Button::DPAD_RIGHT) {
		alignment = (TextAlign)(alignment | TextAlign::right);
	}
	else if (!(buttons & Button::DPAD_LEFT)) {
		alignment = (TextAlign)(alignment | TextAlign::center_h);
	}
}
