#include "display.hpp"

#include "engine/engine.hpp"

using namespace blit;

static void(*orig_render)(uint32_t) = nullptr;

static std::string message;
static uint32_t progress_value = 0, progress_total = 0;
static bool render_flag = false;

static void overlay_render(uint32_t time) {
  // TODO: don't want to do this if we add a menu to avoid the problems the stm32 firmware has...
  if(orig_render)
    orig_render(time);

  if(!message.empty() || progress_total) {
    screen.pen = Pen(0, 0, 0, 150);
    screen.rectangle(Rect(0, screen.bounds.h - 25, screen.bounds.w, 25));
    screen.pen = Pen(255, 255, 255);
    screen.text(message, minimal_font, Point(5, screen.bounds.h - 20));
    uint32_t progress_width = float(progress_value) / progress_total * (screen.bounds.w - 10);
    screen.rectangle(Rect(5, screen.bounds.h - 10, progress_width, 5));
  }

  render_flag = false;
}

void set_render_overlay_enabled(bool enabled) {
  if(enabled && blit::render != overlay_render) {
    orig_render = blit::render;
    blit::render = overlay_render;
  } else if(!enabled && orig_render) {
    blit::render = orig_render;
    orig_render = nullptr;
  }
}

void set_overlay_message(std::string_view text) {
  message = text;
}

void set_overlay_progress(uint32_t value, uint32_t total) {
  progress_value = value;
  progress_total = total;
}

void overlay_try_render(bool force) {
  render_flag = force;
  do {
    update_display(blit::now());
  } while(render_flag);
}
