#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QTableWidget>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <unordered_map>
#include "src/xml_opr.h"
#include "src/config.h"
#include "src/attribute_edit.h"

struct SElement_t {
    SElement_t(Element_t* e, std::string& s);
    Element_t*  ele;
    std::string str;
};

enum ReplaceArea { AREA_SELECT, AREA_ALL_PAGE, AREA_CUR_PAGE, AREA_ALL };

struct OperElement {
    OperElement(Element_t* ele, int row);
    Element_t* element_{};
    int        row_{0};
};

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWidget;
}
QT_END_NAMESPACE

using ump_t = std::unordered_map<int, int>;
class MainWidget : public QWidget
{
    Q_OBJECT

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

public:
    void set_work_exe(char* path);
    void generate_table_widget();
    void push_content(const std::vector<Element_t*>& eles, std::size_t page = 1);

private:
    void read(const QString& file_path);
    void search(const QString& key);
    void item_changed_handle(QTableWidgetItem* item);
    void save();
    void copy_select_line();
    void insert_one_line(Element_t* ele, int row);
    void del_select_line();
    void reset();
    void judge_btn_page();
    void copy_key();
    bool edit_property(Element_t* target, int row);
    void init_menu();
    void ele_update_gui(Element_t* target, int row);
    void show_custom_menu();
    void sort_by_repeat(std::vector<Element_t*>& vec);
    void copy_multi_data();
    void replace_content(bool is_common = true);
    void backup_file();

protected:
    void closeEvent(QCloseEvent* event);
    void keyPressEvent(QKeyEvent* event);
    void replace_str(const QString& pre, const QString& after, Element_t* ele);
    void replace_str(Element_t* ele, const QString& rg, const QString& after);

private:
    void get_related_elements(std::vector<OperElement*>& out, ReplaceArea area);

private:
    Element_t*        get_element_by_key(const QString& key);
    Element_t*        get_element_by_row(int row);
    Element_t*        get_current_select_key();
    QTableWidgetItem* get_current_select_item();

private:
    std::shared_ptr<QFontMetrics>   metrics_;

private:
    QMenu*                   menu_simple_{};
    QMenu*                   menu_multi_{};
    QAction*                 ac_edit_property_{};
    QAction*                 ac_copy_curline_{};
    QAction*                 ac_del_curline_{};
    QAction*                 ac_copy_key_{};
    Ui::MainWidget*          ui;
    ConfigIni                ini_{};
    CXmlOpr                  xml_{};
    std::string              exe_path_{};
    QTableWidget*            tab_widget_{};
    std::vector<Element_t*>  vec_{};
    std::vector<Element_t*>  current_{};
    std::vector<std::string> keys_{};
    bool                     auto_add_{false};
    std::size_t              cur_page_{1};
    std::size_t              all_page_{1};
    CAttributeEdit*          attri_edit_{};
    OprBase                  base_{};
    long                     allow_max_with_{500};
    long                     blank_with_{50};
    ump_t                    col_with_{};
};
#endif   // MAINWIDGET_H