from django.views.generic import ListView, DetailView
from apps.core.views import CMSPageMixin, CMSObjectMixin
from traduction.helpers import prefetch_translations
from .models import Person


class TeamListView(CMSPageMixin, ListView):
    """
    Liste des membres de l'equipe.

    Utilise le template CMS si une page 'equipe' existe.
    """
    model = Person
    template_name = 'team/list.html'
    context_object_name = 'members'
    cms_page_slug = 'equipe'

    def get_language_code(self):
        return getattr(self.request, 'current_language_code', 'fr')

    def get_queryset(self):
        queryset = Person.objects.filter(is_active=True).select_related(
            'university', 'professor', 'phd_student', 'master_student'
        )

        # Filtrage par type
        person_type = self.request.GET.get('type')
        if person_type in ['professor', 'phd', 'master']:
            queryset = queryset.filter(person_type=person_type)

        # Filtrage par universite
        university = self.request.GET.get('university')
        if university:
            queryset = queryset.filter(university__slug=university)

        return queryset

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

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

        # Recuperer tous les membres et appliquer les traductions
        all_members = list(self.get_queryset())
        prefetch_translations(all_members, language_code=language_code)

        # Traduire les universites liees
        universities_to_translate = [m.university for m in all_members if m.university]
        if universities_to_translate:
            unique_unis = list({u.pk: u for u in universities_to_translate}.values())
            prefetch_translations(unique_unis, language_code=language_code)
            uni_map = {u.pk: u for u in unique_unis}
            for member in all_members:
                if member.university and member.university.pk in uni_map:
                    member.university = uni_map[member.university.pk]

        # Separer par type pour affichage groupe
        context['professors'] = [m for m in all_members if m.person_type == 'professor']
        context['phd_students'] = [m for m in all_members if m.person_type == 'phd']
        context['master_students'] = [m for m in all_members if m.person_type == 'master']

        # Universites pour le filtre
        from apps.universities.models import University
        filter_universities = list(University.objects.filter(is_active=True))
        prefetch_translations(filter_universities, language_code=language_code)
        context['universities'] = filter_universities

        # Filtres actifs
        context['current_type'] = self.request.GET.get('type', '')
        context['current_university'] = self.request.GET.get('university', '')

        return context


class TeamDetailView(CMSObjectMixin, DetailView):
    """
    Detail d'un membre de l'equipe.

    Utilise la Page CMS associee au membre si disponible.
    """
    model = Person
    template_name = 'team/detail.html'
    context_object_name = 'member'

    def get_language_code(self):
        return getattr(self.request, 'current_language_code', 'fr')

    def get_queryset(self):
        return Person.objects.filter(is_active=True).select_related(
            'university', 'professor', 'phd_student', 'master_student', 'cms_page'
        )

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

        # Traduire le membre
        prefetch_translations([obj], language_code=language_code)

        # Traduire l'universite liee
        if obj.university:
            prefetch_translations([obj.university], language_code=language_code)

        return obj

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        language_code = self.get_language_code()

        # Publications de ce membre
        from apps.research.models import Publication
        publications = list(Publication.objects.filter(
            authors=self.object
        ).order_by('-publication_date')[:5])
        prefetch_translations(publications, language_code=language_code)
        context['publications'] = publications

        # Projets de recherche
        from apps.research.models import ResearchProject
        projects = list(ResearchProject.objects.filter(
            team_members=self.object,
            is_active=True
        ))
        prefetch_translations(projects, language_code=language_code)
        context['projects'] = projects

        return context
