from django.contrib.syndication.views import Feed
from django.urls import reverse
from django.utils.html import strip_tags
from django.utils.feedgenerator import Atom1Feed
from blog.models import Blog, Cat_Blog


class LatestArticlesFeed(Feed):
    """
    Flux RSS pour les derniers articles du blog
    """
    title = "Blog Duhaz - Derniers articles"
    link = "/blog/"
    description = "Les derniers articles publiés sur le blog Duhaz"
    
    # Métadonnées du flux
    author_name = "Mr Duhaz"
    feed_copyright = "Copyright (c) Duhaz"
    
    # Nombre d'articles dans le flux
    feed_size = 20
    
    def items(self):
        """Retourne les derniers articles publiés"""
        return Blog.objects.filter(b_publier=True).order_by('-b_publdate')[:self.feed_size]
    
    def item_title(self, item):
        """Titre de l'article"""
        return item.b_titre
    
    def item_description(self, item):
        """Description de l'article (sans HTML)"""
        return strip_tags(item.b_description)
    
    def item_link(self, item):
        """Lien vers l'article"""
        return reverse('blog_play', args=[item.b_titre_slugify])
    
    def item_pubdate(self, item):
        """Date de publication"""
        return item.b_publdate
    
    def item_categories(self, item):
        """Catégories de l'article"""
        return [cat.cb_titre for cat in item.b_cat.all()]
    
    def item_author_name(self, item):
        """Auteur de l'article"""
        return "Mr Duhaz"


class LatestArticlesAtomFeed(LatestArticlesFeed):
    """
    Flux Atom pour les derniers articles (alternative au RSS)
    """
    feed_type = Atom1Feed
    subtitle = LatestArticlesFeed.description


class CategoryArticlesFeed(Feed):
    """
    Flux RSS par catégorie
    """
    author_name = "Mr Duhaz"
    feed_copyright = "Copyright (c) Duhaz"
    feed_size = 20
    
    def get_object(self, request, cat_slug):
        """Récupère la catégorie depuis l'URL"""
        return Cat_Blog.objects.get(cb_titre_slgify=cat_slug)
    
    def title(self, obj):
        return f"Blog Duhaz - Articles de la catégorie {obj.cb_titre}"
    
    def link(self, obj):
        return reverse('blog_cat', args=[obj.cb_titre_slgify])
    
    def description(self, obj):
        return f"Les derniers articles de la catégorie {obj.cb_titre}"
    
    def items(self, obj):
        """Retourne les articles de la catégorie"""
        return Blog.objects.filter(
            b_publier=True,
            b_cat=obj
        ).order_by('-b_publdate')[:self.feed_size]
    
    def item_title(self, item):
        return item.b_titre
    
    def item_description(self, item):
        return strip_tags(item.b_description)
    
    def item_link(self, item):
        return reverse('blog_play', args=[item.b_titre_slugify])
    
    def item_pubdate(self, item):
        return item.b_publdate
    
    def item_categories(self, item):
        return [cat.cb_titre for cat in item.b_cat.all()]
