#pragma once

#include <QApplication>
#include <QCheckBox>
#include <QComboBox>
#include <QDialog>
#include <QListWidget>
#include <QPalette>
#include <QStackedWidget>
#include <QTextEdit>
#include <QWidget>
#include <QtWidgets>
#include <array>
#include <functional>
#include <utility>

#include "emulator.hpp"
#include "frontend_settings.hpp"

class ConfigWindow : public QDialog {
	Q_OBJECT

  private:
	using ConfigCallback = std::function<void()>;
	using MainWindowCallback = std::function<QWidget*()>;

	using Theme = FrontendSettings::Theme;
	using WindowIcon = FrontendSettings::WindowIcon;

	QTextEdit* helpText = nullptr;
	QListWidget* widgetList = nullptr;
	QStackedWidget* widgetContainer = nullptr;

	static constexpr size_t settingWidgetCount = 6;
	std::array<QString, settingWidgetCount> helpTexts;

	// The config class holds a copy of the emulator config which it edits and sends
	// over to the emulator in a thread-safe manner
	EmulatorConfig config;

	ConfigCallback updateConfig;
	MainWindowCallback getMainWindow;

	void addWidget(QWidget* widget, QString title, QString icon, QString helpText);
	void setTheme(FrontendSettings::Theme theme);
	void setIcon(FrontendSettings::WindowIcon icon);

  public:
	ConfigWindow(ConfigCallback configCallback, MainWindowCallback windowCallback, const EmulatorConfig& config, QWidget* parent = nullptr);
	~ConfigWindow();

	EmulatorConfig& getConfig() { return config; }

  private:
	Emulator* emu;
};