#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "qtcommon.h"
#include "host/host.h"
#include <QPlainTextEdit>
#include <QComboBox>
#include <QSettings>

namespace Ui
{
	class MainWindow;
}

Q_DECLARE_METATYPE(std::shared_ptr<TextThread>);

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	explicit MainWindow(QWidget *parent = nullptr);
	~MainWindow();

signals:
	void SigAddProcess(unsigned processId);
	void SigRemoveProcess(unsigned processId);
	void SigAddThread(std::shared_ptr<TextThread>);
	void SigRemoveThread(std::shared_ptr<TextThread>);
	void SigThreadOutput(QString threadString, QString output);

private slots:
	void AddProcess(unsigned processId);
	void RemoveProcess(unsigned processId);
	void AddThread(std::shared_ptr<TextThread> thread);
	void RemoveThread(std::shared_ptr<TextThread> thread);
	void ThreadOutput(QString threadString, QString output); // this function doesn't take TextThread* because it might be destroyed on pipe thread
	void on_attachButton_clicked();
	void on_detachButton_clicked();
	void on_unhookButton_clicked();
	void on_hookButton_clicked();
	void on_saveButton_clicked();
	void on_extenButton_clicked();
	void on_ttCombo_activated(int index);

private:
	bool ProcessThreadOutput(TextThread* thread, std::wstring& output);
	QString TextThreadString(TextThread* thread);
	ThreadParam ParseTextThreadString(QString textThreadString);
	DWORD GetSelectedProcessId();
	std::unordered_map<std::string, int64_t> GetMiscInfo(TextThread* thread);
	QVector<HookParam> GetAllHooks(DWORD processId);
	void closeEvent(QCloseEvent*);

	Ui::MainWindow* ui;
	QSettings settings = QSettings("Textractor.ini", QSettings::IniFormat);
	QComboBox* processCombo;
	QComboBox* ttCombo;
	QPlainTextEdit* textOutput;
	QWidget* extenWindow;
};

#endif // MAINWINDOW_H