#ifndef types_h
#define types_h

#include "SDL.h"
#include "widgets/console_window.h"
#include "widgets/main_window.h"
#include "widgets/preferences_window.h"
#include "widgets/printer_window.h"
#include "widgets/vram_viewer_window.h"

typedef struct{
	int16_t x, y;
	uint16_t width, height;
} Rect;

typedef struct GuiData {
	struct CliOptionData {
		gchar *config_path;
		gchar *boot_rom_path;
		gboolean fullscreen;
		GB_model_t model;
		gboolean force_software_renderer;
	} cli_options;

	GFile *file;
	gint sample_rate;
	GDateTime *config_modification_date;

	char *battery_save_path;
	char *cheats_save_path;

	GB_model_t prev_model;

	const GThread *main_thread;
	volatile bool running;
	volatile bool stopping;
	volatile bool stopped;

	// GTK pointers
	GtkApplication *main_application;
	GtkBuilder *builder;
	MainWindow *main_window;

	ConsoleWindow *console;
	PreferencesWindow *preferences;
	VramViewerWindow *vram_viewer;
	PrinterWindow *printer;

	GtkWindow *memory_viewer;

	// Audio and video
	bool audio_initialized;
	bool border_mode_changed;
	bool is_fullscreen;
	unsigned last_screen_width;
	unsigned last_screen_height;

	// Fast forward / slow motion
	bool underclock_down;
	bool rewind_down;
	bool do_rewind;
	bool rewind_paused;
	bool turbo_down;
	double clock_mutliplier;
	double analog_clock_multiplier;
	bool analog_clock_multiplier_valid;

	// Input
	uint8_t pressed_buttons;
	struct Controller_t {
		SDL_GameController *controller;
		SDL_Haptic *haptic;
		bool ignore_rumble;
	} *controllers;
	unsigned controller_count;
	struct Controller_t *last_used_controller; // Used for rumble
} GuiData;

typedef enum {
	INPUT_UP,
	INPUT_DOWN,
	INPUT_LEFT,
	INPUT_RIGHT,
	INPUT_A,
	INPUT_B,
	INPUT_START,
	INPUT_SELECT,

	INPUT_TURBO,
	INPUT_REWIND,
	INPUT_SLOWDOWN,

	INPUT_FULLSCREEN,
} input_names_t;

static unsigned key_map[] = {
	[INPUT_UP]     = GDK_KEY_w,
	[INPUT_LEFT]   = GDK_KEY_a,
	[INPUT_DOWN]   = GDK_KEY_s,
	[INPUT_RIGHT]  = GDK_KEY_d,

	[INPUT_A]      = GDK_KEY_l,
	[INPUT_B]      = GDK_KEY_k,

	[INPUT_START]  = GDK_KEY_h,
	[INPUT_SELECT] = GDK_KEY_g,

	[INPUT_TURBO]    = GDK_KEY_space,
	[INPUT_REWIND]   = GDK_KEY_Tab,
	[INPUT_SLOWDOWN] = GDK_KEY_Shift_L,

	[INPUT_FULLSCREEN] = GDK_KEY_F11,
};

#endif