#ifndef CUSTOMNAVIGATIONBAR_H
#define CUSTOMNAVIGATIONBAR_H

#include <QWidget>
#include <QIcon>
#include <QTreeWidget>

namespace Ui {
class CustomNavigationBar;
}

/**
 * @class CustomNavigationBar
 * @brief CustomNavigationBar 是一个自定义的导航栏类，继承自 QWidget。
 * 它提供了一个树形结构来展示导航项，并允许用户通过点击或选择来导航。
 * 
 * 核心功能包括：
 * - 添加导航项
 * - 展开或折叠所有导航项
 * - 设置选中的导航项
 * - 处理导航项点击事件
 * 
 * 使用示例：
 * @code
 * CustomNavigationBar *navigationBar = new CustomNavigationBar(parentWidget);
 * navigationBar->addNavigationItem("Home", 1);
 * navigationBar->addNavigationItem("About", 2, navigationBar->rootItem());
 * navigationBar->setSelectItem("Home");
 * @endcode
 * 
 * 构造函数参数：
 * - QWidget *parent: 父窗口部件，默认为 nullptr。
 * 
 * 使用限制：
 * - 本类依赖于 Qt 框架。
 * - 需要确保在调用任何方法之前，导航栏已经正确初始化。
 * 
 * 潜在副作用：
 * - 在调用某些方法时，可能会导致 UI 更新，影响用户体验。
 */
class CustomNavigationBar : public QWidget
{
    Q_OBJECT

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

    /**
     * @brief 添加一个导航项到导航栏。
     * @param text 导航项的文本。
     * @param data 导航项的数据。
     * @param parent 导航项的父项，默认为 nullptr。
     * @return 添加的导航项的指针。
     */
    QTreeWidgetItem* addNavigationItem(const QString &text, const int data, QTreeWidgetItem *parent = nullptr);

    /**
     * @brief 展开所有导航项。
     */
    void expandAll();

    /**
     * @brief 设置选中的导航项，通过文本匹配。
     * @param text 导航项的文本。
     */
    void setSelectItem(const QString& text);

    /**
     * @brief 设置选中的导航项，通过数据匹配。
     * @param data 导航项的数据。
     */
    void setSelectItem(const int& data);

    /**
     * @brief 删除导航项，通过文本匹配。
     * @param text 导航项的文本。
     * @return 是否删除成功。
     */
    bool removeNavigationItem(const QString& text);

    /**
     * @brief 删除导航项，通过数据匹配。
     * @param data 导航项的数据。
     * @return 是否删除成功。
     */
    bool removeNavigationItem(const int& data);

    /**
     * @brief 删除指定的导航项节点。
     * @param item 要删除的导航项节点。
     * @return 是否删除成功。
     */
    bool removeNavigationItem(QTreeWidgetItem* item);

    /**
     * @brief 清空所有导航项。
     */
    void clearNavigationItems();

    /**
     * @brief 查找导航项，通过文本匹配。
     * @param text 导航项的文本。
     * @return 找到的导航项指针，未找到返回nullptr。
     */
    QTreeWidgetItem* findNavigationItem(const QString& text);

    /**
     * @brief 查找导航项，通过数据匹配。
     * @param data 导航项的数据。
     * @return 找到的导航项指针，未找到返回nullptr。
     */
    QTreeWidgetItem* findNavigationItem(const int& data);

private:
    void initTreeWidget();
    bool findAndSelectItem(QTreeWidgetItem* parentItem, const QString& targetText);
    bool findAndSelectItem(QTreeWidgetItem* parentItem, const int& data);
    bool findAndRemoveItem(QTreeWidgetItem* parentItem, const QString& targetText);
    bool findAndRemoveItem(QTreeWidgetItem* parentItem, const int& data);
    QTreeWidgetItem* findItemRecursive(QTreeWidgetItem* parentItem, const QString& targetText);
    QTreeWidgetItem* findItemRecursive(QTreeWidgetItem* parentItem, const int& data);

private slots:
    void slotTreeWidgetItemClicked(const QTreeWidgetItem* item, const int column);

signals:
    void navigationItemClicked(const int& index);
    // void navigationItemClicked(const QString& text);

private:
    Ui::CustomNavigationBar *ui;
};

#endif // CUSTOMNAVIGATIONBAR_H
