#include "tagtreedelegateeditor.h"
#include <QHBoxLayout> // 包含水平布局类
#include <QLabel> // 包含标签类
#include <QPainter> // 包含用于绘制的类
#include <QDebug> // 包含用于调试输出的类
#include <QTreeView> // 包含树形视图类
#include <QMouseEvent> // 包含鼠标事件类
#include "pushbuttontype.h" // 包含自定义按钮类型
#include "nodetreemodel.h" // 包含节点树模型类
#include "nodetreeview.h" // 包含节点树视图类
#include "labeledittype.h" // 包含自定义标签编辑类型
#include "notelistview.h" // 包含笔记列表视图类
#include "fontloader.h" // 包含字体加载器类

// TagTreeDelegateEditor类的构造函数
TagTreeDelegateEditor::TagTreeDelegateEditor(QTreeView *view, const QStyleOptionViewItem &option,
                                             const QModelIndex &index, QListView *listView,
                                             QWidget *parent)
    : QWidget(parent), // 调用父类构造函数
      m_option(option), // 保存样式选项
      m_index(index), // 保存模型索引
      // 根据操作系统设置默认字体
#ifdef __APPLE__
      m_displayFont(QFont(QStringLiteral("SF Pro Text")).exactMatch()
                            ? QStringLiteral("SF Pro Text")
                            : QStringLiteral("Roboto")),
#elif _WIN32
      m_displayFont(QFont(QStringLiteral("Segoe UI")).exactMatch() ? QStringLiteral("Segoe UI")
                                                                   : QStringLiteral("Roboto")),
#else
      m_displayFont(QStringLiteral("Roboto")),
#endif
      // 根据操作系统设置标题字体
#ifdef __APPLE__
      m_titleFont(m_displayFont, 13, QFont::DemiBold),
#else
      m_titleFont(m_displayFont, 10, QFont::DemiBold),
#endif
      m_titleColor(26, 26, 26), // 设置标题颜色
      m_titleSelectedColor(255, 255, 255), // 设置标题选中颜色
      m_activeColor(68, 138, 201), // 设置活动颜色
      m_hoverColor(207, 207, 207), // 设置悬停颜色
      m_view(view), // 保存树形视图指针
      m_listView(listView) // 保存列表视图指针
{
    // 设置布局边距
    setContentsMargins(0, 0, 0, 0);
    auto layout = new QHBoxLayout(this); // 创建水平布局
    layout->setContentsMargins(22, 0, 0, 0); // 设置布局边距
    layout->setSpacing(5); // 设置布局间距
    setLayout(layout); // 设置布局
    layout->addSpacing(27); // 添加间距

    // 创建标签编辑器
    m_label = new LabelEditType(this);
    m_label->setFont(m_titleFont); // 设置标签字体
    // 设置标签大小策略
    QSizePolicy labelPolicy;
    labelPolicy.setVerticalPolicy(QSizePolicy::Expanding);
    labelPolicy.setHorizontalPolicy(QSizePolicy::Expanding);
    m_label->setSizePolicy(labelPolicy);
    m_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); // 设置标签对齐方式
    // 连接信号和槽
    connect(m_label, &LabelEditType::editingStarted, this, [this] {
        auto tree_view = dynamic_cast<NodeTreeView *>(m_view);
        tree_view->setIsEditing(true); // 设置树形视图为编辑状态
    });
    connect(m_label, &LabelEditType::editingFinished, this, [this](const QString &label) {
        auto tree_view = dynamic_cast<NodeTreeView *>(m_view);
        tree_view->onRenameTagFinished(label); // 完成重命名操作
        tree_view->setIsEditing(false); // 设置树形视图为非编辑状态
    });
    connect(dynamic_cast<NodeTreeView *>(m_view), &NodeTreeView::renameTagRequested, m_label,
            &LabelEditType::openEditor); // 连接重命名请求信号
    layout->addWidget(m_label); // 将标签添加到布局中

    // 创建上下文按钮
    m_contextButton = new PushButtonType(parent);
    m_contextButton->setMaximumSize({ 33, 25 }); // 设置按钮最大尺寸
    m_contextButton->setMinimumSize({ 33, 25 }); // 设置按钮最小尺寸
    m_contextButton->setCursor(QCursor(Qt::PointingHandCursor)); // 设置鼠标样式
    m_contextButton->setFocusPolicy(Qt::TabFocus); // 设置焦点策略
    m_contextButton->setIconSize(QSize(16, 16)); // 设置图标尺寸
    // 根据选中状态设置按钮样式
    if (m_view->selectionModel()->
// ... 继续上面的代码

// 根据选中状态设置按钮样式
if (m_view->selectionModel()->isSelected(m_index)) {
    m_contextButton->setStyleSheet(QStringLiteral(R"(QPushButton { )"
                                                  R"(    border: none; )"
                                                  R"(    padding: 0px; )"
                                                  R"(    color: white; )"
                                                  R"(})"
                                                  R"(QPushButton:pressed { )"
                                                  R"(    border: none; )"
                                                  R"(    padding: 0px; )"
                                                  R"(    color: rgb(210, 210, 210); )"
                                                  R"(})"));
} else {
    m_contextButton->setStyleSheet(QStringLiteral(R"(QPushButton { )"
                                                  R"(    border: none; )"
                                                  R"(    padding: 0px; )"
                                                  R"(    color: rgb(68, 138, 201); )"
                                                  R"(})"
                                                  R"(QPushButton:pressed { )"
                                                  R"(    border: none; )"
                                                  R"(    padding: 0px; )"
                                                  R"(    color: rgb(39, 85, 125); )"
                                                  R"(})"));
}

// 根据操作系统设置字体大小偏移
#ifdef __APPLE__
int pointSizeOffset = 0;
#else
int pointSizeOffset = -4;
#endif
m_contextButton->setFont(FontLoader::getInstance().loadFont("Font Awesome 6 Free Solid", "",
                                                            14 + pointSizeOffset));
m_contextButton->setText(u8"\uf141"); // 设置按钮图标为三条横线

// 连接按钮点击信号到树形视图的上下文菜单槽
connect(m_contextButton, &QPushButton::clicked, m_view, [this](bool) {
    auto tree_view = dynamic_cast<NodeTreeView *>(m_view);
    if (!m_view->selectionModel()->selectedIndexes().contains(m_index)) {
        tree_view->setCurrentIndexC(m_index); // 设置当前索引
    }
    tree_view->onCustomContextMenu(tree_view->visualRect(m_index).topLeft()
                                   + m_contextButton->geometry().bottomLeft()); // 显示上下文菜单
});
layout->addWidget(m_contextButton, 0, Qt::AlignRight); // 将按钮添加到布局中
layout->addSpacing(5); // 添加间距

// 连接树形视图展开信号到更新代理槽
connect(m_view, &QTreeView::expanded, this, [this](const QModelIndex &) { update(); });
}

// 更新代理的方法
void TagTreeDelegateEditor::updateDelegate()
{
    // 获取显示名称并使用字体度量进行省略
    auto displayName = m_index.data(NodeItem::Roles::DisplayText).toString();
    QFontMetrics fm(m_titleFont);
    displayName = fm.elidedText(displayName, Qt::ElideRight, m_label->contentsRect().width());

    // 根据选中状态设置标签样式
    if (m_view->selectionModel()->selectedIndexes().contains(m_index)) {
        m_label->setStyleSheet(QStringLiteral("QLabel{color: rgb(%1, %2, %3);}")
                                       .arg(QString::number(m_titleSelectedColor.red()),
                                            QString::number(m_titleSelectedColor.green()),
                                            QString::number(m_titleSelectedColor.blue())));
    } else {
        m_label->setStyleSheet(QStringLiteral("QLabel{color: rgb(%1, %2, %3);}")
                                       .arg(QString::number(m_titleColor.red()),
                                            QString::number(m_titleColor.green()),
                                            QString::number(m_titleColor.blue())));
    }
    m_label->setText(displayName); // 设置标签文本
}

// 重写绘制事件
void TagTreeDelegateEditor::paintEvent(QPaintEvent *event)
{
    updateDelegate(); // 更新代理
    QPainter painter(this); // 创建画家对象

    // 根据选中状态绘制背景
    if (m_view->selectionModel()->selectedIndexes().contains(m_index)) {
        painter.fillRect(rect(), QBrush(m_activeColor));
    } else {
        // 根据拖拽状态和主题绘制背景
        auto listView = dynamic_cast<NoteListView *>(m_listView);
        if (listView->isDragging()) {
            if (m_theme == Theme::Dark) {
                painter.fillRect(rect(), QBrush(QColor(35, 52, 69)));
            } else {
                painter.fillRect(rect(), QBrush(QColor(180, 208, 233)));
            }
        } else {
            painter.fillRect(rect(), QBrush(m_hoverColor));
        }
    }

    // 绘制标签颜色图标
    auto iconRect = QRect(rect().x() + 22, rect().y() + (rect().height() - 14) / 2, 16, 16);
    auto tagColor = m_index.data(NodeItem::Roles::TagColor).toString();

    // 继续上面的代码

    // 绘制标签颜色图标
    auto iconRect = QRect(rect().x() + 22, rect().y() + (rect().height() - 14) / 2, 16, 16);
    auto tagColor = m_index.data(NodeItem::Roles::TagColor).toString();
    if (!tagColor.isEmpty()) {
        QColor color(tagColor);
        painter.setPen(Qt::NoPen);
        painter.setBrush(color);
        painter.drawEllipse(iconRect);
    }

    // 绘制标签文本
    auto textRect = QRect(iconRect.right() + 12, rect().y(), rect().width() - iconRect.right() - 12,
                          rect().height());
    QFontMetrics metrics(m_titleFont);
    auto text = metrics.elidedText(m_index.data(NodeItem::Roles::DisplayText).toString(),
                                   Qt::ElideRight, textRect.width());
    painter.setFont(m_titleFont);
    painter.setPen(m_titleColor);
    painter.drawText(textRect, Qt::AlignVCenter, text);

    // 绘制完成后，确保事件被处理
    event->accept();
}

// 重写鼠标双击事件
void TagTreeDelegateEditor::mouseDoubleClickEvent(QMouseEvent *event)
{
    // 检查事件是否是鼠标左键双击
    if (event->button() == Qt::LeftButton) {
        // 这里可以添加双击事件的处理逻辑，例如编辑项
        // ...
    }

    // 确保事件被处理
    event->accept();
}

// 其他可能的类成员和方法声明
// ...

#endif // TAGTREEDELEGATEEDITORH
