# 导入Haystack搜索查询集
from haystack.query import SearchQuerySet

# 导入博客模型
from blog.models import Article, Category


class BlogApi:
    """
    博客API类
    提供博客文章的搜索、分类获取和最近文章等功能
    """
    
    def __init__(self):
        """
        初始化方法
        创建搜索查询集实例并设置最大返回数量
        """
        # 创建搜索查询集实例
        self.searchqueryset = SearchQuerySet()
        # 初始化空查询，准备后续搜索
        self.searchqueryset.auto_query('')
        # 设置最大返回文章数量
        self.__max_takecount__ = 8

    def search_articles(self, query):
        """
        搜索文章方法
        
        Args:
            query (str): 搜索关键词
            
        Returns:
            SearchQuerySet: 包含搜索结果的查询集，最多返回__max_takecount__条结果
        """
        # 使用Haystack进行自动搜索查询
        sqs = self.searchqueryset.auto_query(query)
        # 加载所有相关对象（避免N+1查询问题）
        sqs = sqs.load_all()
        # 返回前__max_takecount__条结果
        return sqs[:self.__max_takecount__]

    def get_category_lists(self):
        """
        获取所有分类列表
        
        Returns:
            QuerySet: 包含所有分类的查询集
        """
        return Category.objects.all()

    def get_category_articles(self, categoryname):
        """
        根据分类名称获取该分类下的文章
        
        Args:
            categoryname (str): 分类名称
            
        Returns:
            QuerySet or None: 包含该分类文章的查询集（最多__max_takecount__条），如果分类不存在返回None
        """
        # 根据分类名称过滤文章
        articles = Article.objects.filter(category__name=categoryname)
        # 如果找到文章，返回前__max_takecount__条
        if articles:
            return articles[:self.__max_takecount__]
        # 没有找到文章返回None
        return None

    def get_recent_articles(self):
        """
        获取最近的文章
        
        Returns:
            QuerySet: 包含最近文章的查询集，最多返回__max_takecount__条
        """
        # 获取所有文章并按时间排序（假设Article模型的默认排序是按时间倒序）
        return Article.objects.all()[:self.__max_takecount__]