#include "panel.hpp"
#include "dbc.hpp"

void Panel::resize(int w, int h) {
  $dirty = true;
  width = w;
  height = h;
  $screen = Screen(width, height);
}

void Panel::set_renderer(Component renderer) {
  $dirty = true;
  $component = renderer;
}

void Panel::add(Component child) {
  dbc::pre("must set_renderer first", $component != nullptr);
  $dirty = true;
  $component->Add(child);
}

void Panel::render() {
  $dirty = true;
  if(must_clear) $screen.Clear();
  Render($screen, $component->Render());
}

const std::wstring& Panel::to_string() {
  if($dirty) {
    std::string as_text = $screen.ToString();
    $screenout = $converter.from_bytes(as_text);
    $dirty = false;
  }

  return $screenout;
}

void Panel::mouse_click(ftxui::Mouse::Button btn, Point pos) {
  fmt::println("CLICK AT {},{}", pos.x, pos.y);
  ftxui::Mouse mev{
    .button=btn,
    .motion=ftxui::Mouse::Motion::Pressed,
    .x=int(pos.x), .y=int(pos.y)
  };

  $component->OnEvent(ftxui::Event::Mouse("", mev));
}

void Panel::mouse_release(ftxui::Mouse::Button btn, Point pos) {
  ftxui::Mouse mev{
    .button=btn,
    .motion=ftxui::Mouse::Motion::Released,
    .x=int(pos.x), .y=int(pos.y)
  };

  $component->OnEvent(ftxui::Event::Mouse("", mev));
}

const Screen& Panel::screen() {
  return $screen;
}

void Panel::key_press(ftxui::Event event) {
  $component->OnEvent(event);
}
