from django.contrib.sitemaps import Sitemap
from django.urls import reverse

from blog.models import Article, Category, Tag

class StaticViewSitemap(Sitemap):
    """
    sh:
    静态页面站点地图类：用于收录网站静态页面（无动态数据的页面）
    """
    priority = 0.5
    changefreq = 'daily'

    def items(self):
        """返回需要收录的静态页面URL名称（对应urls.py中的name属性）"""
        return ['blog:index', ]

    def location(self, item):
        """根据URL名称反向解析出完整URL"""
        return reverse(item)


class ArticleSiteMap(Sitemap):
    """
    文章页面站点地图类：收录所有已发布的博客文章
    """
    changefreq = "monthly"
    priority = "0.6"

    def items(self):
        """返回需要收录的文章：仅筛选状态为已发布（status='p'）的文章"""
        return Article.objects.filter(status='p')

    def lastmod(self, obj):
        """返回文章的最后修改时间，帮助搜索引擎识别更新内容"""
        return obj.last_modify_time


class CategorySiteMap(Sitemap):
    """
    分类页面站点地图类：收录所有文章分类页面
    """
    changefreq = "Weekly"
    priority = "0.6"

    def items(self):
        """返回所有分类实例"""
        return Category.objects.all()

    def lastmod(self, obj):
        """返回分类的最后修改时间"""
        return obj.last_modify_time


class TagSiteMap(Sitemap):
    """
    标签页面站点地图类：收录所有文章标签页面
    """
    changefreq = "Weekly"
    priority = "0.3"

    def items(self):
        """返回所有标签实例"""
        return Tag.objects.all()

    def lastmod(self, obj):
        """返回所有标签实例"""
        return obj.last_modify_time


class UserSiteMap(Sitemap):
    """
    用户页面站点地图类：收录所有发布过文章的作者页面
    """
    changefreq = "Weekly"
    priority = "0.3"

    def items(self):
        """返回所有发布过文章的唯一作者（去重）"""
        return list({x.author for x in Article.objects.all()})

    def lastmod(self, obj):
        """返回作者的注册时间（作为页面更新时间）"""
        return obj.date_joined
