from django.shortcuts import render
from .models import Seminar,Teaching_course

from django.utils import timezone as timezoneDjango
from django.views import generic
from icalendar import Calendar, Event
from icalendar import vCalAddress, vText
import qrcode
import pytz
from datetime import datetime,timezone,timedelta
import html
from search_views.search import SearchListView
from search_views.filters import BaseFilter
from .forms import SeminarSearchForm
from nanotud.add_global_context import ContextMixin



class SeminarFilter(BaseFilter):
    search_fields = {
        'search_text' :  ['title','speaker_name','speaker_affiliation']
    }


class SeminarSearchListView(ContextMixin, SearchListView):
    model = Seminar
    context_object_name = 'seminar_list'
    queryset = Seminar.objects.filter(showPublic=True).order_by('-start_time')
    template_name = 'seminar_search.html'
    paginate_by = 30
    filter_class = SeminarFilter
    form_class = SeminarSearchForm
    
    def get_context_data(self, **kwargs):
        min_diff = timedelta(days=10000)
        now = timezoneDjango.now()
        context = super(SeminarSearchListView,self).get_context_data(**kwargs)
        seminar_l=context['seminar_list']
        seminar_next = None
        for seminar in seminar_l:
            if seminar.start_time >= now:
                seminar.status = 'upcoming'
                diff = seminar.start_time - now
                # the seminar is in the future and this seminar starts sooner than the current next seminar
                if diff.total_seconds() > 3600 and diff < min_diff:  
                        seminar_next = seminar
                        min_diff = diff
            else:
                seminar.status = 'past'
        context['seminar_next']=seminar_next
        return context



class SeminarALLListView(SearchListView):
    model = Seminar
    context_object_name = 'seminar_list'
    queryset = Seminar.objects.filter(showPublic=True).order_by('-start_time')
    template_name = 'seminar_search.html'
    paginate_by = 100000
    filter_class = SeminarFilter
    form_class = SeminarSearchForm


def create_ics(self,pk):
    file_name_ics = '/var/www/nanotud/uploads/seminar/ics/' + str(pk) + '.ics'
    file_name_ics_download = '/uploads/seminar/ics/' + str(pk) + '.ics'
    cal = Calendar()
    event = Event()
    event.add('summary', 'nanoSEMINAR - '+self.speaker_name+' - '+self.title)
    event.add('dtstart', datetime(self.start_time.year,self.start_time.month,self.start_time.day,self.start_time.hour,self.start_time.minute,0,tzinfo=timezone.utc))
    event.add('dtend', datetime(self.start_time.year,self.start_time.month,self.start_time.day,self.start_time.hour+1,self.start_time.minute,0,tzinfo=timezone.utc))
    # event.add('dtstamp', datetime(self.start_time.year,self.start_time.month,self.start_time.day,self.start_time.hour,self.start_time.minute,0,tzinfo=pytz.timezone('Europe/Berlin')))
    organizer = vCalAddress('MAILTO:'+str(self.organisator_email))
    organizer.params['cn'] = vText(self.organisator_name)
    event['organizer'] = organizer
    if self.room:
        event['location'] = vText(str(self.room)+' Dresden, Germany')
        if self.video_conf:
            event['location'] = vText(str(self.room)+' Dresden, Germany\n'+str(self.video_conf))
    else:
        event['location'] = vText(str(self.video_conf))
    event['description']=vText('More info: https://nano.tu-dresden.de'+str(self.get_absolute_url()))
    event['url']='https://nano.tu-dresden.de'+str(self.get_absolute_url())
    cal.add_component(event)
    f = open((file_name_ics), 'wb')
    data_ical=cal.to_ical()
    f.write(data_ical)
    
    f.close()
    qr = qrcode.QRCode(
        version = 1,
        box_size = 15,
        border = 0
        ) 
    # qr.add_data(cal.to_ical())
    # data_qr='https://nano.tu-dresden.de'+ file_name_ics_download
    qr.add_data(data_ical)
    qr.make(fit=True)
    img = qr.make_image(fill = 'black', back_color = 'white')
    file_name_qr = '/data/uploads/seminar/ics/' + str(pk) + '.png'
    img.save(file_name_qr)
    file_name_qr = '/uploads/seminar/ics/' + str(pk) + '.png'
    return file_name_ics_download,file_name_qr

class SeminarDetailView(ContextMixin, generic.DetailView):
    model = Seminar
    template_name = 'seminar_detail.html'
    # fields = ['recorded_seminar']
    context_object_name = 'seminar_detail'
    queryset = Seminar.objects.filter(showPublic=True)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['ics_file'] = self.get_object().pk
        context['file_name_ics'] = create_ics(self.get_object(),self.get_object().pk)[0]
        # context['qr_code'] = self.get_object().pk
        context['file_name_qr'] = create_ics(self.get_object(),self.get_object().pk)[1]
        return context





class Teaching_courseListView(ContextMixin, generic.ListView):
    model = Teaching_course
    context_object_name = 'teaching_course_list'
    queryset = Teaching_course.objects.filter(show_public=True)
    template_name = 'teaching_course_list.html'
    #paginate_by = 15
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        for course in context['teaching_course_list']:
            teachers = list(course.teacher.all())
            tutors = list(course.tutor.all())
            responsible = list(course.responsible_person.all())
            responsible_pks = {person.pk for person in responsible}
            non_responsible = []
            for person in teachers + tutors:
                if person.pk not in responsible_pks:
                    if person not in non_responsible:
                        non_responsible.append(person)
            unique_responsible = []
            for person in responsible:
                if person not in unique_responsible:
                    unique_responsible.append(person)

            course.all_persons = non_responsible + unique_responsible
        return context

    
class Teaching_courseDetailView(ContextMixin, generic.DetailView):
    model = Teaching_course
    template_name = 'teaching_course_detail.html'
    context_object_name = 'teaching_course_detail'
    # queryset = Teaching_course.objects.filter(show_public=True)
    def get_queryset(self):
        if self.request.user.is_authenticated:
            return Teaching_course.objects.all()
        else:
            return Teaching_course.objects.filter(show_public=True)
        
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        course = self.object
        teachers = list(course.teacher.all())
        tutors = list(course.tutor.all())
        responsible = list(course.responsible_person.all())
        responsible_pks = {person.pk for person in responsible}
        non_responsible = []
        for person in teachers + tutors:
            if person.pk not in responsible_pks and person not in non_responsible:
                non_responsible.append(person)
        unique_responsible = []
        for person in responsible:
            if person not in unique_responsible:
                unique_responsible.append(person)
        all_persons = non_responsible + unique_responsible
        context['all_persons'] = all_persons
        return context