# 导入Django站点地图核心类和URL反向解析工具
from django.contrib.sitemaps import Sitemap
from django.urls import reverse

# 导入博客相关模型（文章、分类、标签），用于生成动态页面的站点地图
from blog.models import Article, Category, Tag


class StaticViewSitemap(Sitemap):
    """
    静态页面站点地图类：用于生成网站静态页面（如首页）的Sitemap条目
    Sitemap用于告知搜索引擎网站的页面结构，帮助其抓取和索引
    """
    # 页面优先级（0.0-1.0）：值越高，搜索引擎认为该页面越重要
    priority = 0.5
    # 页面内容更新频率：可选值包括always、hourly、daily、weekly、monthly、yearly、never
    changefreq = 'daily'

    def items(self):
        """
        定义需要包含在站点地图中的静态页面URL名称列表
        返回的是Django URL配置中定义的'name'属性（如'blog:index'对应首页URL）
        """
        return ['blog:index', ]

    def location(self, item):
        """
        为items()返回的每个URL名称，生成对应的绝对URL
        通过reverse()方法解析URL名称，获取实际访问路径（如'blog:index'解析为'/'）
        """
        return reverse(item)


class ArticleSiteMap(Sitemap):
    """
    文章页面站点地图类：用于生成所有已发布文章的Sitemap条目
    """
    # 文章页面更新频率：每月（因单篇文章发布后修改频率较低）
    changefreq = "monthly"
    # 文章页面优先级：0.6（高于分类/标签，低于首页）
    priority = "0.6"

    def items(self):
        """
        返回所有状态为"已发布"（status='p'）的文章对象
        仅包含已发布文章，避免搜索引擎抓取草稿或未公开内容
        """
        return Article.objects.filter(status='p')

    def lastmod(self, obj):
        """
        定义每个文章页面的最后修改时间
        取值为文章的last_modify_time字段（文章最后更新的时间）
        帮助搜索引擎识别页面是否有更新，决定是否重新抓取
        """
        return obj.last_modify_time


class CategorySiteMap(Sitemap):
    """
    分类页面站点地图类：用于生成所有文章分类页面的Sitemap条目
    """
    # 分类页面更新频率：每周（分类下文章新增/删除会影响分类页，频率低于文章）
    changefreq = "Weekly"
    # 分类页面优先级：0.6（与文章同级，高于标签/用户）
    priority = "0.6"

    def items(self):
        """返回所有分类对象，生成每个分类页面的Sitemap条目"""
        return Category.objects.all()

    def lastmod(self, obj):
        """
        分类页面的最后修改时间：取值为分类的last_modify_time字段
        分类信息（如分类名称）修改时，会更新该时间，提示搜索引擎重新抓取
        """
        return obj.last_modify_time


class TagSiteMap(Sitemap):
    """
    标签页面站点地图类：用于生成所有文章标签页面的Sitemap条目
    """
    # 标签页面更新频率：每周（标签下文章增减频率较低）
    changefreq = "Weekly"
    # 标签页面优先级：0.3（低于首页、文章、分类，属于次要导航页面）
    priority = "0.3"

    def items(self):
        """返回所有标签对象，生成每个标签页面的Sitemap条目"""
        return Tag.objects.all()

    def lastmod(self, obj):
        """
        标签页面的最后修改时间：取值为标签的last_modify_time字段
        标签信息（如标签名称）修改时更新，用于搜索引擎判断页面新鲜度
        """
        return obj.last_modify_time


class UserSiteMap(Sitemap):
    """
    用户页面站点地图类：用于生成所有发布过文章的用户主页的Sitemap条目
    """
    # 用户页面更新频率：每周（用户发布新文章或修改资料时才更新）
    changefreq = "Weekly"
    # 用户页面优先级：0.3（与标签同级，属于次要页面）
    priority = "0.3"

    def items(self):
        """
        返回所有发布过文章的独特用户对象
        1. 通过Article.objects.all()获取所有文章，提取每篇文章的author（作者）
        2. 使用map()遍历文章列表，获取作者集合；用set()去重，避免重复用户
        3. 转换为list()，符合items()返回可迭代对象的要求
        """
        return list(set(map(lambda x: x.author, Article.objects.all())))

    def lastmod(self, obj):
        """
        用户页面的最后修改时间：取值为用户的date_joined字段（用户注册时间）
        此处可根据需求调整（如改为用户最后发布文章时间或最后修改资料时间）
        """
        return obj.date_joined