import os
from django.conf import settings
from django.http import FileResponse, Http404
from django.contrib.admin.views.decorators import staff_member_required
from django.utils._os import safe_join
from django.shortcuts import render
from .models import Member, Group, Halslide, Shared_document, Researchslide, Teachingslide
from django.views import generic
from django.utils import timezone
from home.models import Status, Status_extern
from django.db.models import Q
from django.template.loader import get_template, render_to_string
from django.shortcuts import  get_object_or_404
from external.models import Open_Job
from search_views.search import SearchListView
from search_views.filters import BaseFilter
from .forms import Shared_documentSearchForm
import numpy as np
import qrcode
from nanotud.add_global_context import ContextMixin






@staff_member_required
def protected_file(request, file_path):
    """
    Liefert eine Datei aus dem MEDIA_ROOT aus.
    file_path ist der relative Pfad zur Datei, z.B. 'uploads/members/tac/meinedatei.pdf'
    """
    try:
        full_path = safe_join(settings.MEDIA_ROOT, file_path)
    except ValueError:
        raise Http404("Ungültiger Dateipfad.")

    if not os.path.exists(full_path):
        raise Http404("Datei nicht gefunden.")

    return FileResponse(open(full_path, 'rb'))


# Create your views here.

class VisitorListView(ContextMixin, generic.ListView):
    model = Member
    context_object_name = 'visitor_list'
    template_name = 'visitor.html'
    paginate_by = 350
    queryset=Member.objects.filter(visitor=True).filter(show_public=True).order_by('-exit_date')
    def get_context_data(self,**kwargs):
        context=super().get_context_data(**kwargs)
        return context

class HalwayListView(ContextMixin, generic.ListView):
	model = Halslide
	context_object_name = 'slides'
	template_name = 'halway.html'
	queryset=Halslide.objects.filter(show=True)


class ResslideListView(ContextMixin, generic.ListView):
	model = Researchslide
	context_object_name = 'slides'
	template_name = 'resslides.html'
	queryset=Researchslide.objects.filter(show=True)

class TsslideListView(ContextMixin, generic.ListView):
	model = Teachingslide
	context_object_name = 'slides'
	template_name = 'tsslides.html'
	queryset=Teachingslide.objects.filter(show=True)

class AlumniListView(ContextMixin, generic.ListView):
    model = Member
    context_object_name = 'alumni_list'
    template_name = 'alumni.html'
    paginate_by = 350
    
    def get_queryset(self):
        # organisation_extern = self.request.GET.get('organisation_extern')
        status_extern = self.request.GET.get('status_extern')
        search_query = self.request.GET.get('search')
        # status_extern = self.request.GET.get('status_extern_id')
        if status_extern:
            # queryset=Member.objects.filter(active=False).filter(visitor=False).filter(extern_related=False).filter(show_public=True).filter(status_extern=status_extern).order_by('-exit_date')
            queryset=Member.objects.filter(active=False).filter(visitor=False).filter(extern_related=False).filter(show_public=True).filter(status_extern=status_extern).order_by('-exit_date')
        else:
            queryset=Member.objects.filter(active=False).filter(visitor=False).filter(extern_related=False).filter(show_public=True).order_by('-exit_date')
        if search_query:
            search_terms = search_query.split()
            if len(search_terms) > 1:
                # Suche nach vollständigem Namen
                queryset = queryset.filter(
                    Q(given_name__icontains=search_terms[0]) &
                    Q(last_name__icontains=search_terms[1])
                )
            else:
                queryset = queryset.filter(
                    Q(given_name__icontains=search_query) |
                    Q(last_name__icontains=search_query) 
                )
        return queryset
    

    def get_context_data(self,**kwargs):
        context=super().get_context_data(**kwargs)
        # context['organisations'] = Member.objects.order_by().values_list('organisation_extern', flat=True).distinct()  
        # context['external_stati'] = Member.objects.order_by().values_list('status_extern', flat=True).distinct()  
        context['external_stati'] = Status_extern.objects.all() 
        return context
    
    # def get_context_data(self,**kwargs):
    #     context=super(MemberListView,self).get_context_data(**kwargs)
    #     context['status']=Status.objects.filter()
    #     return context
	
class MemberListView(ContextMixin, generic.ListView):
    model = Member
    context_object_name = 'member_list'
    template_name = 'member.html'
    paginate_by = 350
    queryset=Member.objects.filter(active=True).filter(extern_related=False).filter(show_public=True).order_by('status')
    def get_context_data(self,**kwargs):
        context=super(MemberListView,self).get_context_data(**kwargs)
        context['status']=Status.objects.filter()
        return context


class PosterMemberListView(ContextMixin, generic.ListView):
    model = Member
    context_object_name = 'poster_member_list'
    template_name = 'poster_member.html'
    paginate_by = 350
    queryset=Member.objects.filter(active=True).filter(extern_related=False).filter(show_public=True).order_by('status')
    




def create_noppenQR(pk):
    qr = qrcode.QRCode(
        version = 1,
        box_size = 15,
        border = 10
        )
    data = 'https://nano.tu-dresden.de/special_view/' + str(pk) + '.vcf/'
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill = 'black', back_color = 'white')
    file_name = '/var/www/nanotud/uploads/img/QR-code/' + str(pk) + '.png'
    img.save(file_name)
    file_name = '/uploads/img/QR-code/' + str(pk) + '.png'
    return file_name


def create_vcard_qr(member):
    email = f"{member.job_mail}" if member.job_mail else ""
    title_short = f"{member.title.title_short};" if member.title is not None else ""
    vcard_data = f"""BEGIN:VCARD
VERSION:3.0
EMAIL:{email}
TEL;TYPE=WORK:{member.job_phone}
NOTE;CHARSET=utf-8:
TITLE;CHARSET=utf-8:{member.status}
N;CHARSET=utf-8:{member.last_name};{member.given_name};;{title_short};
FN;CHARSET=utf-8:{member.given_name} {member.last_name}
ORG;CHARSET=utf-8:Technische Universität Dresden;Chair of Materials Science and Nanotechnology
END:VCARD"""

    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(vcard_data)
    qr.make(fit=True)

    img = qr.make_image(fill_color="black", back_color="white")
    file_name = f'/var/www/nanotud/uploads/img/QR-code/{member.pk}.png'
    img.save(file_name)
    return f'/uploads/img/QR-code/{member.pk}.png'

class MemberDetailView(ContextMixin, generic.DetailView):
    model = Member
    context_object_name = 'member_detail'
    template_name = 'member_detail.html'
    # test = context_object_name.kwargs.get('pk')
    queryset=Member.objects.filter(show_public=True)
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['qr_code'] = self.get_object().pk
        # context['file_name'] = create_noppenQR(self.get_object().pk)
        context['file_name_qr_code'] = create_vcard_qr(self.get_object())
        return context

        
    

def special_view(request, pk):
    configs = get_object_or_404(Member, pk=pk)
    return render(request, 'vcard_export.vcf', {'member': configs}, content_type='text/x-vcard; charset=utf-8')


'''def qr_code(request, pk):
    configs = get_object_or_404(Member, pk=pk)
    context = {}
    qr = qrcode.QRCode(
    version = 1,
    box_size = 15,
    border = 10,
    image_factory = qrcode.image.svg.SvgImage
    )
    data =
    img = qr.add_data(, image_factory=factory, box_size=20)
    stream = BytesIO()
    img.save(stream)
    context["svg"] = stream.getvalue().decode()
  return render(request, 'qr_code.png', {'member': configs}, content_type='text/x-vcard; charset=utf-8')    '''




class GroupListView(ContextMixin, generic.ListView):
    model = Group
    context_object_name = 'group_list'
    template_name = 'group.html'
    paginate_by = 50
    active_groups=Group.objects.filter(active=True)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        active_groups=Group.objects.filter(active=True)
        context['active_groups']=active_groups
        context['theory_groups'] = active_groups.filter(
            group_type__in=['theory'],show_public=True
        )
        context['experiment_groups'] = active_groups.filter(
            group_type__in=['experiment'],show_public=True
        )
        context['theory_experiment_groups'] = active_groups.filter(
            group_type__in=['experiment_and_theory'],show_public=True
        )
        context['facility_groups'] = active_groups.filter(group_type='facility',show_public=True)
        context['incubation_groups'] = active_groups.filter(group_type__in=['incubation'],show_public=True)
        context['non_active_groups'] = Group.objects.filter(active=False,show_public=True)
        return context

class GroupDetailView(ContextMixin, generic.DetailView):
    model = Group
    context_object_name = 'group_detail'
    template_name = 'group_detail.html'
    
    def get_queryset(self):
        return super(GroupDetailView, self).get_queryset().filter(show_public=True)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        group = self.object

        # Variante A – simpel:
        context["active_members"]   = group.group_member.filter(active=True)
        context["inactive_members"] = group.group_member.filter(active=False)

        return context


class Shared_documentFilter(BaseFilter):
    search_fields = {
        'search_text' :  ['name','description','pdf_file','editable_file']
    }


class Shared_documentSearchListView(SearchListView):
    model = Shared_document
    context_object_name = 'shared_document_list'
    template_name = 'shared_document_search.html'
    paginate_by = 50
    filter_class = Shared_documentFilter
    form_class = Shared_documentSearchForm



class Shared_documentDetailView(ContextMixin, generic.DetailView):
    model = Shared_document
    context_object_name = 'shared_document_detail'
    template_name = 'shared_document_detail.html'