from django.views.generic import ListView, DetailView
from django.http import JsonResponse
from django.contrib.admin.views.decorators import staff_member_required
from django.utils import timezone
from apps.core.views import CMSPageMixin, CMSDetailView, CMSListView, CMSObjectMixin
from .models import NewsCategory, NewsArticle, Event
from traduction.helpers import TranslatedViewMixin, prefetch_translations
from config.models import Icon


class NewsListView(CMSPageMixin, TranslatedViewMixin, ListView):
    """
    Liste des actualites avec traduction automatique.

    Utilise le template CMS si une page 'actualites' existe.
    Les champs title, content sont automatiquement traduits
    selon la langue selectionnee par l'utilisateur.
    """
    model = NewsArticle
    template_name = 'news/list.html'
    context_object_name = 'articles'
    paginate_by = 12
    translate_fields = ['title', 'content']
    cms_page_slug = 'actualites'

    def get_queryset(self):
        queryset = NewsArticle.objects.filter(is_published=True).select_related(
            'category', 'author'
        )

        # Filtrage par categorie
        category = self.request.GET.get('category')
        if category:
            queryset = queryset.filter(category__slug=category)

        # Traduire les articles
        articles = self.translate_queryset(queryset)

        # Traduire les categories liees
        lang_code = self.get_current_language_code()
        categories = [a.category for a in articles if a.category]
        if categories:
            unique_cats = list({c.pk: c for c in categories}.values())
            prefetch_translations(unique_cats, language_code=lang_code)
            cat_map = {c.pk: c for c in unique_cats}
            for article in articles:
                if article.category and article.category.pk in cat_map:
                    article.category = cat_map[article.category.pk]

        return articles

    def get_context_data(self, **kwargs):
        # Charger la page CMS
        self._cms_page = self.get_cms_page()
        context = super().get_context_data(**kwargs)
        lang_code = self.get_current_language_code()

        # Ajouter la page CMS au contexte
        if self._cms_page:
            context['page'] = self._cms_page
            context['cms_page'] = self._cms_page

        # Categories avec traductions
        categories = list(NewsCategory.objects.filter(is_active=True))
        prefetch_translations(categories, language_code=lang_code)
        context['categories'] = categories

        # Article a la une avec traductions
        featured = NewsArticle.objects.filter(
            is_published=True, is_featured=True
        ).select_related('category').first()
        if featured:
            prefetch_translations([featured], language_code=lang_code)
            if featured.category:
                prefetch_translations([featured.category], language_code=lang_code)
        context['featured_article'] = featured

        # Evenements a venir avec traductions
        events = list(Event.objects.filter(
            is_active=True,
            event_date__gte=timezone.now()
        ).select_related('event_type')[:5])
        prefetch_translations(events, language_code=lang_code)
        context['upcoming_events'] = events

        context['current_category'] = self.request.GET.get('category', '')
        return context


class NewsDetailView(CMSObjectMixin, TranslatedViewMixin, DetailView):
    """
    Detail d'un article avec traduction automatique.

    Utilise la Page CMS associee a l'article si disponible,
    sinon utilise le template par defaut.
    """
    model = NewsArticle
    template_name = 'news/detail.html'
    context_object_name = 'article'
    translate_fields = ['title', 'content', 'meta_description']

    def get_queryset(self):
        return NewsArticle.objects.filter(is_published=True).select_related(
            'category', 'author', 'cms_page'
        ).prefetch_related('related_projects', 'related_people')

    def get_object(self, queryset=None):
        obj = super().get_object(queryset)
        # Incrementer le compteur de vues
        obj.view_count += 1
        obj.save(update_fields=['view_count'])

        # Traduire l'objet et sa categorie
        lang_code = self.get_current_language_code()
        self.translate_object(obj)
        if obj.category:
            prefetch_translations([obj.category], language_code=lang_code)

        return obj

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        lang_code = self.get_current_language_code()

        # Articles similaires (meme categorie) avec traductions
        related = list(NewsArticle.objects.filter(
            category=self.object.category,
            is_published=True
        ).exclude(pk=self.object.pk).select_related('category')[:3])
        prefetch_translations(related, language_code=lang_code)
        context['related_articles'] = related

        return context


class EventListView(CMSPageMixin, TranslatedViewMixin, ListView):
    """
    Liste des evenements avec traduction automatique.

    Utilise le template CMS si une page 'evenements' existe.
    """
    model = Event
    template_name = 'news/events.html'
    context_object_name = 'events'
    translate_fields = ['title', 'description', 'short_description', 'location']
    cms_page_slug = 'evenements'

    def get_queryset(self):
        queryset = Event.objects.filter(is_active=True).select_related(
            'host_university', 'event_type'
        )

        # Filtrage par type
        event_type = self.request.GET.get('type')
        if event_type:
            queryset = queryset.filter(event_type=event_type)

        # Filtrage passe/futur
        period = self.request.GET.get('period', 'upcoming')
        if period == 'past':
            queryset = queryset.filter(event_date__lt=timezone.now()).order_by('-event_date')
        else:
            queryset = queryset.filter(event_date__gte=timezone.now()).order_by('event_date')

        # Traduire les evenements
        events = self.translate_queryset(queryset)

        # Traduire les types d'evenements lies
        lang_code = self.get_current_language_code()
        event_types = [e.event_type for e in events if e.event_type]
        if event_types:
            unique_types = list({t.pk: t for t in event_types}.values())
            prefetch_translations(unique_types, language_code=lang_code)
            type_map = {t.pk: t for t in unique_types}
            for event in events:
                if event.event_type and event.event_type.pk in type_map:
                    event.event_type = type_map[event.event_type.pk]

        return events

    def get_context_data(self, **kwargs):
        # Charger la page CMS
        self._cms_page = self.get_cms_page()
        context = super().get_context_data(**kwargs)
        lang_code = self.get_current_language_code()

        # Ajouter la page CMS au contexte
        if self._cms_page:
            context['page'] = self._cms_page
            context['cms_page'] = self._cms_page

        context['current_type'] = self.request.GET.get('type', '')
        context['current_period'] = self.request.GET.get('period', 'upcoming')

        # Evenements mis en avant avec traductions
        featured = list(Event.objects.filter(
            is_active=True,
            is_featured=True,
            event_date__gte=timezone.now()
        ).select_related('event_type')[:3])
        prefetch_translations(featured, language_code=lang_code)
        context['featured_events'] = featured

        return context


class EventDetailView(CMSObjectMixin, TranslatedViewMixin, DetailView):
    """
    Detail d'un evenement avec traduction automatique.

    Utilise la Page CMS associee a l'evenement si disponible.
    """
    model = Event
    template_name = 'news/event_detail.html'
    context_object_name = 'event'
    translate_fields = ['title', 'description', 'short_description', 'location']

    def get_queryset(self):
        return Event.objects.filter(is_active=True).select_related(
            'host_university', 'event_type', 'cms_page'
        )

    def get_object(self, queryset=None):
        obj = super().get_object(queryset)

        # Traduire le type d'evenement
        lang_code = self.get_current_language_code()
        if obj.event_type:
            prefetch_translations([obj.event_type], language_code=lang_code)

        return obj


# =============================================================================
# Vues Admin (AJAX)
# =============================================================================

@staff_member_required
def icon_preview_ajax(request, icon_id):
    """
    Vue AJAX pour recuperer les informations d'une icone.
    Utilisee pour l'apercu dynamique dans l'admin.
    """
    try:
        icon = Icon.objects.select_related('group').get(pk=icon_id)
        return JsonResponse({
            'success': True,
            'icon_class': f'{icon.group.libelle} {icon.libelle}',
            'group': icon.group.libelle,
            'libelle': icon.libelle,
        })
    except Icon.DoesNotExist:
        return JsonResponse({
            'success': False,
            'error': 'Icone introuvable'
        }, status=404)
