#include <pake/widgets/fixed-text.hpp>

static void draw_if_true(
  daguerre::hilbert_color &out, const bool &in,
  const daguerre::hilbert_color &param) {
  if (in) out = param;
}

namespace pake::widgets {

  fixed_text::fixed_text(
    std::string &&text,
    const daguerre::fixed_font<bool> *font,
    daguerre::hilbert_color bg,
    daguerre::hilbert_color fg,
    halign ha, valign va)
  : font(font), bg(bg), fg(fg),
    text(std::move(text)), ha(ha), va(va) {}

  void fixed_text::render(
    dirtiable_image &onto, int x_off, int y_off, bool force) {

    if (force) {

      //TODO: check overflow

      onto.dirty.fill(true, x_off, y_off, width, height);

      onto.image.fill(  bg, x_off, y_off, width, height);

      switch (ha) {
      case halign::left:
        break;
      case halign::center:
        x_off = width / 2 - text.size() * font->glyph_width / 2;
        break;
      case halign::right:
        x_off = width - text.size() * font->glyph_width;
        break;
      }

      switch (va) {
      case valign::top:
        break;
      case valign::center:
        y_off = height / 2 - font->glyph_height / 2;
        break;
      case valign::bottom:
        y_off = height - font->glyph_width;
        break;
      }

      onto.image.render_text(
        *font, fg, x_off, y_off,
        text.data(), draw_if_true);

    }

  }

  void fixed_text::notify_size(int width, int height) {
    this->width = width; this->height = height;
  }

}
