#ifndef TREEVIEWMANAGER_H
#define TREEVIEWMANAGER_H

#include <QWidget>
#include <QTreeView>
#include <QJsonObject>
#include <QStandardItemModel>
#include <QMap>
#include <QCheckBox>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFile>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QRadioButton>
#include <QButtonGroup>
#include <QDebug>
#include <QPushButton>
#include <QStyleFactory>
#include <QTimer>
#include <QPainter>
#include <QEvent>
#include <QStringList>
#include <QSettings>
#include <QSet>
#include <QVariant>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <QTimeEdit>
#include <QHBoxLayout>
#include <QCursor>
#include <QScrollArea>
#include <QToolButton>



class OriginalWnd; // 前向声明


class TreeViewManager : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口
     * @param downView 完整目录树的视图
     * @param widget2 父组件，用于确定导航栏位置
     * @param horizontalLayout2 用于计算导航栏宽度
     */
    explicit TreeViewManager(OriginalWnd* originalWnd, QWidget *widget2, QWidget *parent = nullptr);
    virtual ~TreeViewManager();

    /**
     * @brief 加载并显示三级目录的按钮配置信息
     * @param thirdLevelObj 三级目录的 JSON 对象
     */
    void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj);


    /**
     * @brief 加载 JSON 数据并初始化树视图
     * @param filePath JSON 文件路径
     */
    void loadJsonFromFile(const QString &filePath);

    void loadTreeData(const QJsonDocument &doc);


    void applyCustomStyles();

    /**
     * @brief 更新导航栏内容，根据点击的目录项动态显示
     * @param index 点击的目录项索引
     */
    void updateNavigationBar(const QModelIndex &index);  //导航栏更新
    void  paintAllBranches(const QModelIndex &parentIndex, QPainter &painter);

    //在“父节点 -> 子节点”间画一条“L”型拐角线，仅调整横向线段的长度
    void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter);
    void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter);


private:

    QWidget *widget2;                            // 父组件，用于确定导航栏位置

    QTreeView *treeViewDown;                     // 完整目录树

    QStandardItemModel *downModel;               // 树状结构模型

    QWidget *navigationWidget;                   // 动态导航栏窗口

    QVBoxLayout *navigationLayout;               // 导航栏布局



    QPushButton *buttonOpenFile; // 返回一级菜单
    QPushButton *buttonUp;       // 遍历导航向上
    QPushButton *buttonDown;     // 遍历导航向下
    QPushButton *buttonLeft;     // 进入下一级目录
    QPushButton *buttonRight;    // 返回上一级目录

    OriginalWnd *m_originalWnd; // 声明指向 OriginalWnd 的指针
    QJsonDocument m_jsonDoc;    // 存储已加载的 JSON 文档

    // 用于存储选中路径和展开路径
    QSet<QString> visitedPaths;
    QSet<QString> expandedPaths;
    bool restoring; // 标识当前是否处于“恢复”状态

    /**
     * @brief 保存当前选中与展开路径到 QSettings
     */
    void saveVisitedPaths();

    /**
     * @brief 从 QSettings 中加载上一次的选中与展开路径
     */
    void loadVisitedPaths();

    /**
     * @brief 将某条选中路径添加到 visitedPaths
     * @param path 要记录的路径（分段组成）
     */
    void addVisitedPath(const QStringList &path);

    /**
     * @brief 将某条选中路径从 visitedPaths 中移除
     * @param path 要移除的路径（分段组成）
     */
    void removeVisitedPath(const QStringList &path);

    /**
     * @brief 将某条展开路径添加到 expandedPaths
     * @param path 要记录的路径（分段组成）
     */
    void addExpandedPath(const QStringList &path);

    /**
     * @brief 将某条展开路径从 expandedPaths 中移除
     * @param path 要移除的路径（分段组成）
     */
    void removeExpandedPath(const QStringList &path);

    /**
     * @brief 构建给定 QStandardItem 的路径，如 "一级/二级/三级"
     * @param item 要处理的节点
     * @return 分段组成的路径
     */
    QStringList buildItemPath(QStandardItem *item);

    /**
     * @brief 根据路径查找对应的 QModelIndex
     * @param path 分段路径，如 {"一级目录","二级目录"}
     * @return 若找到，返回有效的 QModelIndex，否则返回无效
     */
    QModelIndex findItemByPath(const QStringList &path);

    /**
     * @brief 递归存储展开状态，可根据需要在各个节点间遍历
     * @param parentItem 父节点
     * @param currentPath 当前节点路径
     * @param expandedPaths 最终输出的所有展开路径
     */
    void storeExpandedItems(QStandardItem *parentItem,
                            const QStringList &currentPath,
                            QStringList &expandedPaths);

    /**
     * @brief 递归查找节点：根据分段路径依次往下层匹配
     * @param parentItem 父节点
     * @param path 分段路径
     * @param depth 当前递归深度
     * @return 匹配到则返回有效 QModelIndex，否则返回无效
     */
    QModelIndex findItemByPathRecursive(QStandardItem *parentItem,
                                        const QStringList &path,
                                        int depth);

    /**
     * @brief 获取当前索引的下一个有效索引
     * @param currentIndex 当前索引
     * @return 下一个索引，如无则返回无效
     */
    QModelIndex getNextIndex(const QModelIndex &currentIndex);

    /**
     * @brief 获取最后一个子节点的索引
     * @param parentIndex 父节点索引
     * @return 若有子节点，则返回最后一个子节点，否则无效
     */
    QModelIndex getLastChildIndex(const QModelIndex &parentIndex);

    void setupButton();     // 创建并初始化按钮

    /**
     * @brief 构建目录树
     * @param jsonObj JSON 数据对象
     * @param parent 父节点
     */
    void buildTree(const QJsonObject &jsonObj, QStandardItem *parent);


    /**
     * @brief 显示三级目录的字段内容（打开新窗口）
     * @param fields 字段数据
     */
    void displayThirdLevelFields(const QJsonObject &fields);

    /**
     * @brief 更新导航栏窗口的几何位置
     */
    void updateNavigationWidgetGeometry();
protected:
    bool eventFilter(QObject *watched, QEvent *event) override;

private slots:
    void onButtonOpenFileClicked(); // 槽函数：返回一级菜单
    void onButtonUpClicked();       // 槽函数：遍历导航向上
    void onButtonDownClicked();     // 槽函数：遍历导航向下
    void onButtonLeftClicked();     // 槽函数：进入下一级目录
    void onButtonRightClicked();    // 槽函数：返回上一级目录

};

#endif // TREEVIEWMANAGER_H
