#pragma once
#include <ftxui/dom/node.hpp>      // for Render
#include <ftxui/component/component.hpp>
#include <ftxui/component/mouse.hpp>
#include <ftxui/dom/canvas.hpp>
#include <ftxui/screen/screen.hpp>
#include <ftxui/dom/canvas.hpp>
#include <ftxui/screen/screen.hpp>
#include <ftxui/dom/canvas.hpp>
#include <SFML/Graphics/Color.hpp>
#include <locale>
#include <codecvt>
#include "color.hpp"
#include "point.hpp"

const int UI_PANEL_BORDER_PX=5;

using ftxui::Renderer, ftxui::Component, ftxui::Element, ftxui::Screen;

class Panel {
public:
  int x;
  int y;
  int width;
  int height;
  bool has_border = false;
  bool must_clear = true;
  bool grid = false;
  sf::Color default_bg = ColorValue::BLACK;
  sf::Color default_fg = ColorValue::LIGHT_LIGHT;
  sf::Color border_color = ColorValue::MID;
  int border_px = UI_PANEL_BORDER_PX;

  bool $dirty = true;
  Component $component = nullptr;
  Screen $screen;
  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
  std::wstring $screenout;

  Panel(int x, int y, int width, int height, bool is_grid=false) :
    x(x),
    y(y),
    width(width),
    height(height),
    grid(is_grid),
    $screen(Screen(width, height))
  {
    must_clear = !is_grid;
  };

  void resize(int width, int height);
  void set_renderer(Component renderer);
  void add(Component child);
  void render();
  void mouse_click(ftxui::Mouse::Button btn, Point pos);
  void mouse_release(ftxui::Mouse::Button btn, Point pos);
  void key_press(ftxui::Event event);
  const std::wstring &to_string();
  const Screen &screen();
};