#ifndef TREEVIEWLOGIC_H
#define TREEVIEWLOGIC_H

#include <QObject>
#include "dbmanager.h"
#include "editorsettingsoptions.h"

class NodeTreeView;
class NodeTreeModel;
class NodeTreeDelegate;
class DBManager;
class CustomApplicationStyle;
class NoteListView;

// TreeViewLogic 类负责管理树形视图的逻辑
class TreeViewLogic : public QObject
{
    Q_OBJECT
public:
    // 构造函数
    explicit TreeViewLogic(NodeTreeView *treeView, NodeTreeModel *treeModel, DBManager *dbManager,
                           NoteListView *listView, QObject *parent = nullptr);
    // 打开文件夹
    void openFolder(int id);
    // 请求移动节点
    void onMoveNodeRequested(int nodeId, int targetId);
    // 设置主题
    void setTheme(Theme::Value theme);
    // 设置最后保存的状态
    void setLastSavedState(bool isLastSelectFolder, const QString &lastSelectFolder,
                           const QSet<int> &lastSelectTag, const QStringList &expandedFolder);

private slots:
    // 更新树视图分隔符
    void updateTreeViewSeparator();
    // 加载树模型
    void loadTreeModel(const NodeTagTreeData &treeData);
    // 请求添加标签
    void onAddTagRequested();
    // 请求重命名树视图中的节点
    void onRenameNodeRequestedFromTreeView(const QModelIndex &index, const QString &newName);
    // 请求删除文件夹
    void onDeleteFolderRequested(const QModelIndex &index);
    // 请求重命名树视图中的标签
    void onRenameTagRequestedFromTreeView(const QModelIndex &index, const QString &newName);
    // 请求更改标签颜色
    void onChangeTagColorRequested(const QModelIndex &index);
    // 请求删除标签
    void onDeleteTagRequested(const QModelIndex &index);
    // 标签的子笔记数量变化
    void onChildNotesCountChangedTag(int tagId, int notesCount);
    // 文件夹的子笔记数量变化
    void onChildNoteCountChangedFolder(int folderId, const QString &absPath, int notesCount);

signals:
    // 请求在数据库中重命名节点
    void requestRenameNodeInDB(int id, const QString &newName);
    // 请求在数据库中重命名标签
    void requestRenameTagInDB(int id, const QString &newName);
    // 请求在数据库中更改标签颜色
    void requestChangeTagColorInDB(int id, const QString &newColor);
    // 请求在数据库中移动节点
    void requestMoveNodeInDB(int id, const NodeData &target);
    // 向标签添加笔记
    void addNoteToTag(int noteId, int tagId);
    // 通知节点已移动
    void noteMoved(int nodeId, int targetId);

private:
    // 请求添加文件夹
    void onAddFolderRequested(bool fromPlusButton);

private:
    // 节点树视图
    NodeTreeView *m_treeView;
    // 节点树模型
    NodeTreeModel *m_treeModel;
    // 笔记列表视图
    NoteListView *m_listView;
    // 节点树代理
    NodeTreeDelegate *m_treeDelegate;
    // 数据库管理器
    DBManager *m_dbManager;
    // 自定义应用样式
    CustomApplicationStyle *m_style;
    // 是否需要加载保存的状态
    bool m_needLoadSavedState;
    // 是否是最后选择的文件夹
    bool m_isLastSelectFolder;
    // 最后选择的文件夹路径
    QString m_lastSelectFolder;
    // 最后选择的标签集合
    QSet<int> m_lastSelectTags;
    // 展开的文件夹列表
    QStringList m_expandedFolder;
};

#endif // TREEVIEWLOGIC_H