# 导入必要的模块和类
from django.contrib.auth import get_user_model  # 用于获取自定义用户模型
from django.contrib.syndication.views import Feed  # Django内置的Feed基类，用于生成RSS/Atom订阅
from django.utils import timezone  # 处理时间相关操作
from django.utils.feedgenerator import Rss201rev2Feed  # RSS 2.0版本的生成器

from blog.models import Article  # 导入博客文章模型
from djangoblog.utils import CommonMarkdown  # 导入Markdown处理工具，用于将文章内容转换为HTML


class DjangoBlogFeed(Feed):
    """
    自定义博客RSS订阅Feed类，继承自Django的Feed基类，用于生成博客文章的RSS订阅源
    """
    # 指定Feed类型为RSS 2.0版本（符合Rss201rev2Feed规范）
    feed_type = Rss201rev2Feed

    # RSS源的描述信息（会显示在订阅源的描述中）
    description = '大巧无工,重剑无锋.'
    # RSS源的标题（订阅源的名称）
    title = "且听风吟 大巧无工,重剑无锋. "
    # RSS源的链接（通常指向网站的订阅页面）
    link = "/feed/"

    def author_name(self):
        """
        定义订阅源的作者名称
        这里取系统中第一个用户的昵称作为作者名
        """
        return get_user_model().objects.first().nickname

    def author_link(self):
        """
        定义订阅源作者的链接
        这里取系统中第一个用户的个人主页链接（需用户模型实现get_absolute_url方法）
        """
        return get_user_model().objects.first().get_absolute_url()

    def items(self):
        """
        定义订阅源包含的项目（即文章列表）
        返回条件：类型为'article'（type='a'）、状态为'已发布'（status='p'）的文章
        排序方式：按发布时间倒序（最新发布的在前）
        数量限制：最多返回5篇文章
        """
        return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]

    def item_title(self, item):
        """
        定义单个项目（文章）的标题
        参数item：从items()方法返回的单个Article对象
        返回文章的标题
        """
        return item.title

    def item_description(self, item):
        """
        定义单个项目（文章）的描述内容
        使用CommonMarkdown工具将文章的Markdown格式正文转换为HTML，作为订阅中的描述
        """
        return CommonMarkdown.get_markdown(item.body)

    def feed_copyright(self):
        """
        定义订阅源的版权信息
        格式为"Copyright© 年份 且听风吟"，年份自动获取当前时间的年份
        """
        now = timezone.now()
        return "Copyright© {year} 且听风吟".format(year=now.year)

    def item_link(self, item):
        """
        定义单个项目（文章）的链接
        返回文章的绝对URL（需Article模型实现get_absolute_url方法）
        """
        return item.get_absolute_url()

    def item_guid(self, item):
        """
        定义单个项目的全局唯一标识符（GUID）
        此处未实现具体逻辑，可根据需求补充（如返回文章ID或唯一URL等）
        """
        return