from django.shortcuts import render
from .models import Publication,ResearchEquipment, Equipment_Category, Thesis, Patent, Project, Open_Thesis
from .forms import PublicationSearchForm, ThesisSearchForm
from search_views.search import SearchListView
from search_views.filters import BaseFilter
from django.views import generic
import sys
from django.db.models import F
from nanotud.add_global_context import ContextMixin
from django.db.models import OuterRef, Subquery, Value, Prefetch
from django.db.models.functions import Coalesce



def research(request):
    """View function for research page."""
    # Render the HTML template research.html with the data in the context variable
    num_publication = Publication.objects.all().count()
    
    context = {'num_publication':num_publication}
    return render(request, 'research.html', context=context)

class PublicationFilter(BaseFilter):
    search_fields = {
        'search_text' :  ['title', 'author_list','journal','journal_short','arxiv_url','project__name','project__project_acr']
    }
# class PublicationSearchList(SearchListView):
#     model = Publication
#     context_object_name = 'publication_list'
#     queryset = Publication.objects.filter(chair_pub=True).filter(approved=True)
#     paginate_by = 15
#     template_name = 'publication_search.html'
#     form_class = PublicationSearchForm
#     filter_class = PublicationFilter

class PublicationSearchList(ContextMixin, SearchListView):
    model = Publication
    context_object_name = 'publication_list'
    queryset = Publication.objects.filter(chair_pub=True).filter(approved=True)
    paginate_by = 20
    template_name = 'publication_search.html'
    form_class = PublicationSearchForm
    filter_class = PublicationFilter
    
class PublicationALLList(ContextMixin, SearchListView):
    model = Publication
    context_object_name = 'publication_list'
    queryset = Publication.objects.filter(chair_pub=True).filter(approved=True)
    paginate_by = 100000
    template_name = 'publication_search.html'
    form_class = PublicationSearchForm
    filter_class = PublicationFilter
    
    
    

class ThesisFilter(BaseFilter):
    search_fields = {
        'search_text' :  ['title', 'author_new__given_name','author_new__last_name','author_manual']
    }

class ThesisSearchList(ContextMixin, SearchListView):
    model = Thesis
    context_object_name = 'thesis_list'
    paginate_by = 100
    template_name = 'thesis_search.html'
    form_class = ThesisSearchForm
    filter_class = ThesisFilter
    queryset = Thesis.objects.order_by('-end_date')
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.prefetch_related(
            Prefetch('author_new')   # Bild steckt direkt im Member-Objekt
        ).distinct()
    
    
class ThesisDetailView(ContextMixin, generic.DetailView):
    model = Thesis
    template_name = 'thesis_detail.html'
    context_object_name = 'thesis_detail'


    
class PublicationDetailView(ContextMixin, generic.DetailView):
    model = Publication
    template_name = 'publication_detail.html'
    context_object_name = 'pub_detail'
    

class PatentListView(ContextMixin, generic.ListView):
    model = Patent
    context_object_name = 'patent_list'
    template_name = 'patent_list.html'
    paginate_by = 100

class PatentDetailView(ContextMixin, generic.DetailView):
    model = Patent
    context_object_name = 'patent_detail'
    template_name = 'patent_detail.html'
    
    
    
    
class OpenThesisListView(ContextMixin, generic.ListView):
    model = Open_Thesis
    queryset = Open_Thesis.objects.filter(public=True)
    context_object_name = 'open_thesis_list'
    template_name = 'open_thesis.html'
    paginate_by = 100

class OpenThesisDetailView(ContextMixin, generic.DetailView):
    model = Open_Thesis
    context_object_name = 'thesis_detail'
    template_name = 'open_thesis_detail.html'
    #def get_object(self, queryset=None):
    #    obj = super().get_object(queryset=Open_Thesis.objects.all())
    #    if obj.public or self.request.user.is_authenticated:
    #        return obj




class ResearchEquipmentListView(ContextMixin, generic.ListView):
    model = ResearchEquipment
    subquery = Equipment_Category.objects.filter(
            researchequipment_equipment_category=OuterRef('pk')
        ).order_by('order_index').values('order_index')[:1]
        # Annotate the ResearchEquipment with the minimum order_index
    queryset = ResearchEquipment.objects.annotate(
        min_order_index=Subquery(subquery)
    )
    # Use Coalesce to handle null values and ensure items without a category are at the end
    queryset = queryset.annotate(
        sort_order=Coalesce('min_order_index', Value(999999))
    ).order_by('-price','sort_order').filter(active=True)
    context_object_name = 'research_equipment_list'
    template_name = 'research_equipment.html'
    paginate_by = 200


class ResearchEquipmentDetailView(ContextMixin, generic.DetailView):
    model = ResearchEquipment
    queryset = ResearchEquipment.objects.filter(active=True)
    context_object_name = 'research_equipment_detail'
    template_name = 'research_equipment_detail.html'

class ProjectListView(ContextMixin, generic.ListView):
    model = Project
    queryset = Project.objects.filter(show_public=True).order_by('-end_date')
    context_object_name = 'project_list'
    template_name = 'project.html'
    paginate_by = 100


class ProjectDetailView(ContextMixin, generic.DetailView):
    model = Project
    queryset = Project.objects.filter(show_public=True)
    context_object_name = 'project_detail'
    template_name = 'project_detail.html'
