#ifndef TRACKER_FRAME_H_86BD8DFB
#define TRACKER_FRAME_H_86BD8DFB

#include <wx/wxprec.h>

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include <memory>

#include "ap_state.h"
#include "icons.h"
#include "updater.h"

class AchievementsPane;
class ItemsPane;
class LogDialog;
class OptionsPane;
class PaintingsPane;
class SubwayMap;
class TrackerPanel;
class wxBookCtrlEvent;
class wxNotebook;
class wxSplitterEvent;
class wxSplitterWindow;

class ApConnectEvent : public wxEvent {
 public:
  ApConnectEvent(wxEventType eventType, int winid, std::string server,
                 std::string user, std::string pass)
      : wxEvent(winid, eventType),
        ap_server_(std::move(server)),
        ap_user_(std::move(user)),
        ap_pass_(std::move(pass)) {}

  const std::string &GetServer() const { return ap_server_; }

  const std::string &GetUser() const { return ap_user_; }

  const std::string &GetPass() const { return ap_pass_; }

  virtual wxEvent *Clone() const { return new ApConnectEvent(*this); }

 private:
  std::string ap_server_;
  std::string ap_user_;
  std::string ap_pass_;
};

struct StateUpdate {
  std::vector<ItemState> items;
  bool progression_items = false;
  std::vector<std::string> paintings;
  bool achievements = false;
  bool open_panels_tab = false;
  bool cleared_locations = false;
  bool hunt_panels = false;
  bool player_position = false;
  bool changed_settings = false;
};

class StateChangedEvent : public wxEvent {
 public:
  StateChangedEvent(wxEventType eventType, int winid, StateUpdate state)
      : wxEvent(winid, eventType), state_(std::move(state)) {}

  const StateUpdate &GetState() const { return state_; }

  virtual wxEvent *Clone() const { return new StateChangedEvent(*this); }

 private:
  StateUpdate state_;
};

wxDECLARE_EVENT(STATE_RESET, wxCommandEvent);
wxDECLARE_EVENT(STATE_CHANGED, StateChangedEvent);
wxDECLARE_EVENT(STATUS_CHANGED, wxCommandEvent);
wxDECLARE_EVENT(CONNECT_TO_AP, ApConnectEvent);

class TrackerFrame : public wxFrame {
 public:
  TrackerFrame();

  void ConnectToAp(std::string server, std::string user, std::string pass);
  void UpdateStatusMessage();

  void ResetIndicators();
  void UpdateIndicators(StateUpdate state);

 private:
  void OnExit(wxCommandEvent &event);
  void OnAbout(wxCommandEvent &event);
  void OnApConnect(wxCommandEvent &event);
  void OnIpcConnect(wxCommandEvent &event);
  void OnSettings(wxCommandEvent &event);
  void OnCheckForUpdates(wxCommandEvent &event);
  void OnZoomIn(wxCommandEvent &event);
  void OnZoomOut(wxCommandEvent &event);
  void OnOpenLogWindow(wxCommandEvent &event);
  void OnCloseLogWindow(wxCloseEvent &event);
  void OnChangePage(wxBookCtrlEvent &event);
  void OnOpenFile(wxCommandEvent &event);
  void OnSashPositionChanged(wxSplitterEvent &event);

  void OnStateReset(wxCommandEvent &event);
  void OnStateChanged(StateChangedEvent &event);
  void OnStatusChanged(wxCommandEvent &event);
  void OnConnectToAp(ApConnectEvent &event);
  
  std::unique_ptr<Updater> updater_;

  wxSplitterWindow *splitter_window_;
  wxNotebook *notebook_;
  TrackerPanel *tracker_panel_;
  AchievementsPane *achievements_pane_;
  ItemsPane *items_pane_;
  OptionsPane *options_pane_;
  PaintingsPane *paintings_pane_;
  SubwayMap *subway_map_;
  TrackerPanel *panels_panel_ = nullptr;
  LogDialog *log_dialog_ = nullptr;

  wxMenuItem *zoom_in_menu_item_;
  wxMenuItem *zoom_out_menu_item_;

  IconCache icons_;
};

#endif /* end of include guard: TRACKER_FRAME_H_86BD8DFB */