#include "taglistdelegate.h" // 引入自定义的委托头文件
#include "taglistmodel.h" // 引入自定义的模型头文件
#include <QPainter> // 引入QPainter类，用于绘制界面
#include <QPainterPath> // 引入QPainterPath类，用于绘制路径
#include "fontloader.h" // 自定义的字体加载器

// 构造函数，初始化委托的显示字体和标题字体
TagListDelegate::TagListDelegate(QObject *parent)
    : QStyledItemDelegate(parent), // 调用基类构造函数
#ifdef __APPLE__ // 如果是苹果系统
      m_displayFont(QFont(QStringLiteral("SF Pro Text")).exactMatch() // 检查系统字体是否精确匹配
                            ? QStringLiteral("SF Pro Text") // 如果匹配，使用系统字体
                            : QStringLiteral("Roboto")), // 否则使用Roboto字体
#elif _WIN32 // 如果是Windows系统
      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), // 设置标题字体为SF Pro Text，大小13，半粗
#else // 其他系统
      m_titleFont(m_displayFont, 10, QFont::DemiBold), // 设置标题字体为Roboto，大小10，半粗
#endif
      m_titleColor(26, 26, 26), // 设置标题颜色为深灰色
      m_theme(Theme::Light) // 初始化主题为浅色
{
}

// 重写paint函数，用于自定义绘制项
void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const
{
    painter->setRenderHint(QPainter::Antialiasing); // 设置抗锯齿，使绘制更平滑
    auto name = index.data(TagListModel::NameRole).toString(); // 获取模型中的名称数据
    auto color = index.data(TagListModel::ColorRole).toString(); // 获取模型中的颜色数据

    auto rect = option.rect; // 获取绘制区域
    rect.setHeight(20); // 设置绘制区域的高度
    QPainterPath path; // 创建路径对象
    path.addRoundedRect(rect, 10, 10); // 添加圆角矩形路径
    if (m_theme == Theme::Dark) { // 如果主题是深色
        painter->fillPath(path, QColor(76, 85, 97)); // 填充深灰色背景
    } else { // 否则
        painter->fillPath(path, QColor(218, 235, 248)); // 填充浅灰色背景
    }
    auto iconRect =
            QRect(rect.x() + 5, rect.y() + (rect.height() - 12) / 2, 12, 12); // 设置图标区域
    painter->setPen(QColor(color)); // 设置画笔颜色为模型中的颜色
#ifdef __APPLE__ // 如果是苹果系统
    int iconPointSizeOffset = 0; // 图标点大小偏移量为0
#else // 其他系统
    int iconPointSizeOffset = -4; // 图标点大小偏移量为-4
#endif
    painter->setFont(FontLoader::getInstance().loadFont("Font Awesome 6 Free Solid", "", // 加载字体
                                                        12 + iconPointSizeOffset));
    painter->drawText(iconRect, u8"\uf111"); // 绘制图标（一个圆圈）
    painter->setBrush(m_titleColor); // 设置画刷颜色为标题颜色
    painter->setPen(m_titleColor); // 设置画笔颜色为标题颜色

    QRect nameRect(rect); // 创建名称区域
    nameRect.setLeft(iconRect.x() + iconRect.width() + 5); // 设置名称区域的左边距
    painter->setFont(m_titleFont); // 设置字体为标题字体
    painter->drawText(nameRect, Qt::AlignLeft | Qt::AlignVCenter, name); // 绘制名称文本
}

// 重写sizeHint函数，用于自定义项的大小
QSize TagListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(option); // 声明option参数未使用
    QSize size; // 创建大小对象
    size.setHeight(20); // 设置高度为20
    auto name = index.data(TagListModel::NameRole).toString(); // 获取模型中的名称数据
    QFontMetrics fmName(m_titleFont); // 创建字体度量对象
    QRect fmRectName = fmName.boundingRect(name); // 获取名称文本的边界矩形
    size.setWidth(5 + 12 + 5 + fmRectName.width() + 7); // 计算宽度
    return size; // 返回大小
}

// 设置主题，并根据主题改变标题颜色
void TagListDelegate::setTheme(Theme::Value theme)
{
    m_theme = theme; // 设置主题
    switch (m_theme) { // 根据主题进行条件编译
    case Theme::Light: {
        m_titleColor = QColor(26, 26, 26); // 浅色主题下，标题颜色为深灰色
        break;
    }
    case Theme::Dark: {
        m_titleColor = QColor(212, 212, 212); // 深色主题下，标题颜色为浅灰色
        break;
    }
    case Theme::Sepia: {
        m_titleColor = QColor(26, 26, 26); // 棕褐色主题下，标题颜色为深灰色
        break;
    }
    }
}