#pragma once
#include <SFML/Graphics/Color.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Text.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <ftxui/component/component.hpp>
#include <ftxui/screen/screen.hpp>
#include <ftxui/dom/canvas.hpp>
#include "ftxui/component/component.hpp"  // for Button, operator|=, Renderer, Vertical, Modal
#include "ftxui/component/screen_interactive.hpp"  // for ScreenInteractive, Component
#include "ftxui/dom/elements.hpp"  // for operator|, separator, text, size, Element, vbox, border, GREATER_THAN, WIDTH, center, HEIGHT
#include <locale>
#include <string>
#include "map.hpp"
#include "dinkyecs.hpp"
#include "components.hpp"
#include "sound.hpp"
#include "render.hpp"
#include "panel.hpp"

using std::string;
using ftxui::Canvas, ftxui::Component, ftxui::Screen, ftxui::Button;

constexpr int SCREEN_WIDTH = 40;
constexpr int SCREEN_HEIGHT = 30;

struct ActionLog {
  std::deque<std::string> messages;

  void log(std::string msg) {
    messages.push_front(msg);
    if(messages.size() > 20) {
      messages.pop_back();
    }
  }
};

const int GAME_MAP_POS = 600;

class GUI {
  sf::RectangleShape $darkness;
  sf::Texture $light_test;
  string $status_text = "NOT DEAD";
  Canvas $canvas;
  Map& $game_map;
  ActionLog $log;
  Panel $status_ui;
  Panel $map_view;
  bool $show_modal = false;
  Component $test_button;
  DinkyECS::World& $world;
  SoundManager $sounds;
  SFMLRender $renderer;

public:
  GUI(DinkyECS::World& world, Map& game_map);
  // disable copying
  GUI(GUI &gui) = delete;

  void resize_map(int new_size);
  void create_renderer();
  void render_scene();
  bool handle_ui_events();
  void handle_world_events();
  void draw_screen(bool clear=true, float map_off_x=0.0f, float map_off_y=0.0f);
  void run_systems();
  void save_world();
  void shake();

  int main();
};
