#ifndef LISTVIEWLOGIC_H
#define LISTVIEWLOGIC_H

#include <QObject>
#include <QVector>
#include "nodedata.h"
#include "dbmanager.h"
#include "editorsettingsoptions.h"
#include <QModelIndex>

class NoteListView;
class NoteListModel;
class TagPool;
class NoteListDelegate;
class QLineEdit;
class QToolButton;
class TagPool;

// 负责笔记列表视图逻辑的类
class ListViewLogic : public QObject
{
    Q_OBJECT
public:
    // 构造函数，初始化笔记视图、笔记模型、搜索框等
    explicit ListViewLogic(NoteListView *noteView, NoteListModel *noteModel, QLineEdit *searchEdit,
                           QToolButton *clearButton, TagPool *tagPool, DBManager *dbManager,
                           QObject *parent = nullptr);
    // 选择指定索引的笔记
    void selectNote(const QModelIndex &noteIndex);

    // 获取当前列表视图的信息
    const ListViewInfo &listViewInfo() const;
    // 选择第一个笔记
    void selectFirstNote();
    // 设置主题
    void setTheme(Theme::Value theme);
    // 检查动画是否正在运行
    bool isAnimationRunning();
    // 设置最后保存的状态
    void setLastSavedState(const QSet<int> &lastSelectedNotes, int needLoadSavedState = 2);
    // 请求加载保存的状态
    void requestLoadSavedState(int needLoadSavedState);
    // 选择所有笔记
    void selectAllNotes();
public slots:
    // 将笔记移动到顶部
    void moveNoteToTop(const NodeData &note);
    // 设置笔记数据
    void setNoteData(const NodeData &note);
    // 笔记编辑关闭后的处理
    void onNoteEditClosed(const NodeData &note, bool selectNext);
    // 请求删除笔记
    void deleteNoteRequested(const NodeData &note);
    // 选择上一个笔记
    void selectNoteUp();
    // 选择下一个笔记
    void selectNoteDown();
    // 搜索框文本改变的处理
    void onSearchEditTextChanged(const QString &keyword);
    // 清除搜索
    void clearSearch(bool createNewNote = false, int scrollToId = SpecialNodeID::InvalidNodeId);
    // 添加标签请求的处理
    void onAddTagRequestD(int noteId, int tagId);
    // 笔记移动事件处理
    void onNoteMovedOut(int nodeId, int targetId);
    // 设置最后选择的笔记
    void setLastSelectedNote();
    // 请求加载最后选择的笔记
    void loadLastSelectedNoteRequested();
    // 请求在文件夹中获取笔记列表
    void onNotesListInFolderRequested(int parentID, bool isRecursive, bool newNote, int scrollToId);
    // 请求通过标签获取笔记列表
    void onNotesListInTagsRequested(const QSet<int> &tagIds, bool newNote, int scrollToId);
    // 选择笔记
    void selectNotes(const QModelIndexList &indexes);
signals:
    // 显示笔记在编辑器中的信号
    void showNotesInEditor(const QVector<NodeData> &notesData);
    // 请求添加标签到数据库的信号
    void requestAddTagDb(int noteId, int tagId);
    // 请求从数据库中移除标签的信号
    void requestRemoveTagDb(int noteId, int tagId);
    // 请求从数据库中移除笔记的信号
    void requestRemoveNoteDb(const NodeData &noteData);
    // 请求将笔记移动到数据库的信号
    void requestMoveNoteDb(int noteId, const NodeData &targetFolder);
    // 请求高亮搜索的信号
    void requestHighlightSearch();
    // 关闭笔记编辑器的信号
    void closeNoteEditor();
    // 笔记标签列表更改的信号
    void noteTagListChanged(int noteId, const QSet<int> &tagIds);
    // 请求在数据库中搜索的信号
    void requestSearchInDb(const QString &keyword, const ListViewInfo &inf);
    // 请求清除数据库中的搜索的信号
    void requestClearSearchDb(const ListViewInfo &inf);
    // 请求清除UI中的搜索的信号
    void requestClearSearchUI();
    // 请求新笔记的信号
    void requestNewNote();
    // 请求移动笔记的信号
    void moveNoteRequested(int id, int target);
    // 列表视图标签改变的信号
    void listViewLabelChanged(const QString &label1, const QString &label2);
    // 设置新笔记按钮可见性的信号
    void setNewNoteButtonVisible(bool visible);
    // 请求在文件夹中获取笔记列表的信号
    void requestNotesListInFolder(int parentID, bool isRecursive, bool newNote, int scrollToId);
    // 请求通过标签获取笔记列表的信号
    void requestNotesListInTags(const QSet<int> &tagIds, bool newNote, int scrollToId);

private slots:
    // 加载笔记列表模型
    void loadNoteListModel(const QVector<NodeData> &noteList, const ListViewInfo &inf);
    // 处理添加标签请求
    void onAddTagRequest(const QModelIndex &index, int tagId);
    // 处理移除标签请求
    void onRemoveTagRequest(const QModelIndex &index, int tagId);
    // 处理笔记按下事件
    void onNotePressed(const QModelIndexList &indexes);
    // 请求删除笔记的处理
    void deleteNoteRequestedI(const QModelIndexList &indexes);
    // 请求恢复笔记的处理
    void restoreNotesRequestedI(const QModelIndexList &indexes);
    // 更新列表视图标签
    void updateListViewLabel();
    // 行数改变的处理
    void onRowCountChanged();
    // 处理双击笔记事件
    void onNoteDoubleClicked(const QModelIndex &index);
    // 请求设置固定笔记的处理
    void onSetPinnedNoteRequested(const QModelIndexList &indexes, bool isPinned);
    // 处理列表视图点击事件
    void onListViewClicked();

private:
    NoteListView *m_listView; // 笔记列表视图
    NoteListModel *m_listModel; // 笔记列表模型
    QLineEdit *m_searchEdit; // 搜索框
    QToolButton *m_clearButton; // 清除按钮
    DBManager *m_dbManager; // 数据库管理器
    NoteListDelegate *m_listDelegate; // 笔记列表委托
    TagPool *m_tagPool; // 标签池
    ListViewInfo m_listViewInfo; // 列表视图信息
    QVector<QModelIndex> m_editorIndexes; // 编辑器索引

    int m_needLoadSavedState; // 需要加载的保存状态
    QSet<int> m_lastSelectedNotes; // 最后选择的笔记集合
};

#endif // LISTVIEWLOGIC_H