#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QDir>
#include <QFileDialog>
#include <QLineEdit>
#include <QMessageBox>
#include <QWidget>
#include <filesystem>
#include <string>
#include <vector>

namespace fs = std::filesystem;

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget* parent = nullptr);
    ~MainWidget();

private:
    void connect_operator();
    void control_init();
    void add_env_btn();
    void del_env_btn();
    void generate();
    void simple_log(const QString& info, bool enter = true);
    // 将某个文件夹拷贝到制定目录下
    bool copy_dir(const std::string& source_dir, const std::string& des_dir);
    // 将二进制文件安装到菜单栏
    void install_bin2menu();

private:
    std::vector<std::string> get_depend_on(const std::string& name, const std::vector<std::string>& env);
    std::list<std::string> handle_result(const std::vector<std::string>& vec);

public:
    static QString SelectDirectory(QWidget* parent, QLineEdit* pEdit, const QString& pre_path = "");
    static QString SelectFile(QWidget* parent, QLineEdit* pEdit, const QString& info, const QString& filter);
    static bool    isOk(QWidget* parent, const QString& title, const QString& content);
    static void    message(QWidget* parent, const QString& content);
    static void    cmd_exec(const std::string& cmd);
    static bool    add_run_sh(const std::string& out_dir, const std::string& exe_name);

private:
    Ui::MainWidget* ui;

private:
    QString binary_{};
    std::vector<std::string> envs_{};
    std::vector<std::string> sos_{};
};
#endif   // MAINWIDGET_H