from django.contrib.auth import get_user_model
from django.contrib.syndication.views import Feed
from django.utils import timezone
from django.utils.feedgenerator import Rss201rev2Feed

from blog.models import Article
from djangoblog.utils import CommonMarkdown


class DjangoBlogFeed(Feed):
    """
    RSS 订阅源生成器，继承自 Django 的 Feed 类。
    用于为网站提供文章的 RSS 订阅功能，允许用户通过 RSS 阅读器获取最新文章。
    """

    # 指定生成的 RSS 版本格式为 RSS 2.0
    feed_type = Rss201rev2Feed

    # 订阅源的描述信息
    description = '大巧无工,重剑无锋.'

    # 订阅源的标题
    title = "且听风吟 大巧无工,重剑无锋. "

    # 订阅源的相对 URL 路径
    link = "/feed/"

    def author_name(self):
        """
        获取订阅源作者的名称。

        从用户模型中获取第一个用户（通常为站长）的昵称作为作者名。

        返回:
            str: 作者昵称（nickname）
        """
        return get_user_model().objects.first().nickname

    def author_link(self):
        """
        获取订阅源作者的个人主页链接。

        返回第一个用户的绝对 URL（通常是作者页面或主页）。

        返回:
            str: 作者主页的 URL
        """
        return get_user_model().objects.first().get_absolute_url()

    def items(self):
        """
        获取订阅源包含的文章列表。

        查询已发布（status='p'）且类型为文章（type='a'）的文章，
        按发布时间倒序排列，仅返回最新的 5 篇。

        返回:
            QuerySet: 包含最多 5 篇最新文章的查询集
        """
        return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]

    def item_title(self, item):
        """
        获取每篇文章在订阅源中的标题。

        参数:
            item (Article): 文章模型实例

        返回:
            str: 文章标题
        """
        return item.title

    def item_description(self, item):
        """
        获取每篇文章在订阅源中的描述内容。

        将文章正文（body）使用 Markdown 渲染为 HTML 格式后返回，
        以便在 RSS 阅读器中正确显示格式。

        参数:
            item (Article): 文章模型实例

        返回:
            str: 渲染后的 HTML 内容
        """
        return CommonMarkdown.get_markdown(item.body)

    def feed_copyright(self):
        """
        获取订阅源的版权信息。

        动态生成包含当前年份的版权字符串。

        返回:
            str: 版权声明，如 "Copyright© 2025 且听风吟"
        """
        now = timezone.now()
        return "Copyright© {year} 且听风吟".format(year=now.year)

    def item_link(self, item):
        """
        获取每篇文章在订阅源中的链接。

        使用文章自身的 get_absolute_url 方法生成绝对路径 URL。

        参数:
            item (Article): 文章模型实例

        返回:
            str: 文章的绝对 URL
        """
        return item.get_absolute_url()

    def item_guid(self, item):
        """
        获取每篇文章的全局唯一标识符（GUID）。

        GUID 用于 RSS 阅读器识别文章是否为新内容。通常应返回文章的唯一标识，
        例如 ID 或 URL。但此方法当前未完成（缺少返回值），可能导致订阅异常。

        参数:
            item (Article): 文章模型实例

        返回:
            str: 文章的唯一标识（当前未实现，需补充如 return item.id 或 return item.get_absolute_url()）
        """
        # 注意：此方法当前没有 return 语句，是一个不完整的实现！
        # 正确做法应类似：
        # return str(item.id)
        # 或
        # return item.get_absolute_url()
        pass  # 占位符，实际运行会返回 None
