from django.forms import DateInput
from django.shortcuts import render,get_object_or_404
from rest_framework import viewsets,generics
from .models import *
from .codfis_form import *
from .serializers import *
from django.db import transaction
from django.db.models import Max, Sum
from datetime import date 

from django.http import HttpResponseRedirect, HttpResponse, Http404, JsonResponse
from django.core.exceptions import ObjectDoesNotExist
from .forms import *
from django.conf import settings
from django.contrib.auth import authenticate
from rest_framework import viewsets, generics
from django.utils import timezone
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required, user_passes_test

import json
import os
#password amministratore Pz36H501a@
def is_admin(user):
    return user.is_staff

def init_app(request):


    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    
    if utente == 'admin':    
        return HttpResponseRedirect('/app/listapren_admin/' + str(settings.ANNO_LAVORO))
    
    return HttpResponseRedirect('/app/listapren_libreria/' + str(settings.ANNO_LAVORO))    


def listapren_libreria(request, annoscol): 

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]
          

    dict =  {'pr_annoscol': annoscol, 'pr_libreria':libreriaRec.id}

    righePren = Prenotazione.objects.filter(**dict).order_by('pr_classe', 'pr_codfiscale')
    totale_spesa=0
    presenti_consegnati=0
    #aggiunto parametro idLibreria che serve anche nella lista totale per filtrare per singola libreria
    url_ajax = f"/api/prenLibreria/{annoscol}?format=datatables"            
    context = {'url_ajax': url_ajax, 'annoscol': annoscol, 'libreria': libreriaRec.denominazione, 'totale_spesa': totale_spesa , 'presenti_consegnati':presenti_consegnati}

    if righePren.count() >0:
        totale_spesa=righePren.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
        totale_spesa=round(totale_spesa, 2)
        dict =  {'pr_annoscol':annoscol, 'pr_libreria':libreriaRec.id, 'pr_consegnato': True}

        righeConsegnati = Prenotazione.objects.filter(**dict)
        if righeConsegnati.count() >0:
            presenti_consegnati=True
        else:
            presenti_consegnati=False        
              
        return render(request, 'prenotazlist_htmx.html', context)
    else:
        return render(request, 'prenotazlist_htmx.html', context)
        return HttpResponseRedirect('/app/prenota')


def newlistapren_admin(request, annoscol): 
    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username

    if request.method == 'GET':
        #righePren = Prenotazione.objects.filter(pr_annoscol=annoscol).order_by('pr_classe', 'pr_codfiscale')
        form=FiltraLibreriaForm()
        modo='all'
        url_ajax = f"/api/allprenotazioni/{annoscol}?format=datatables"            
    else:
        modo='filtra'          
        form=FiltraLibreriaForm(request.POST)
        libreria_sel=form.data['sel_libreria']
        url_ajax = f"/api/prenLibreria/{annoscol}/{libreria_sel}?format=datatables"                   
        #righePren = Prenotazione.objects.filter(pr_libreria=libreria_sel, pr_annoscol=annoscol).order_by('pr_classe', 'pr_codfiscale')

    context = {'url_ajax': url_ajax, 'annoscol':annoscol,  'libreria': 'ALL',  'libreriaform':form, 'modo': modo}
    return render(request, 'allprenotazlist_htmx.html', context)

def prenlist(request, annoscol, libreriaId):
    libreriaRec= Libreria.objects.get(pk = libreriaId) 
    prens=Prenotazione.objects.filter(pr_annoscol = annoscol, pr_libreria=libreriaRec)
    context = { 'annoscol':int(annoscol), 'libreria': libreriaRec.denominazione, 'lista': prens}
    return render(request, 'prenlist.html', context)

@login_required
@user_passes_test(is_admin)
def listapren_admin(request, annoscol): 


    if request.method == 'GET':
        print("GET all pren")
        righePren = Prenotazione.objects.filter(pr_annoscol=annoscol).order_by('pr_classe', 'pr_codfiscale')
        form=FiltraLibreriaForm()
        modo='all'
    else:
        modo='filtra'          
        form=FiltraLibreriaForm(request.POST)
        libreria_sel=form.data['sel_libreria']
        righePren = Prenotazione.objects.filter(pr_libreria=libreria_sel, pr_annoscol=annoscol).order_by('pr_classe', 'pr_codfiscale')
    if righePren.count()>0:
        totale_spesa=righePren.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
        totale_spesa=round(totale_spesa, 2)
        dict =  {'pr_annoscol':annoscol,'pr_consegnato': True}

        righeConsegnati = Prenotazione.objects.filter(**dict)
        if righeConsegnati.count() >0:
            presenti_consegnati=True
        else:
            presenti_consegnati=False        
    else:
        totale_spesa=0
        presenti_consegnati=False        
    
    context = {'annoscol':annoscol, 'risultati': righePren, 'libreria': 'ALL', 'totale_spesa': totale_spesa , 'presenti_consegnati':presenti_consegnati, 'libreriaform':form, 'modo': modo}
    return render(request, 'allprenotazlist.html', context)

@login_required
@user_passes_test(is_admin)
def get_totali_pren(request, annoscol):
    totali=[]
    tot_gen=0
    npren_tot=0
    idx=0
    libreria_recs=Libreria.objects.all()
    for riga in libreria_recs:

        prenLibreria=Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria=riga)
        num_pren=prenLibreria.count()
        if num_pren>0:
            tot_spesa=prenLibreria.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
            tot_spesa=round(tot_spesa, 2)
        else:
            tot_spesa=0
        
        totali.append({'id': riga.id, 'conta': num_pren , 'nome': riga.denominazione, 'tot_spese':  tot_spesa})
        tot_gen += tot_spesa
        npren_tot += num_pren
        idx += 1
    
    context = {'annoscol':annoscol, 'totali': totali, 'totpren': npren_tot, 'tot_gen': tot_gen}
    return render(request, 'showtotali_all.html', context)

def get_totali_libreria(request, annoscol): 

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]

    totale_spesa=0
    #lista consegnati
    righeConsegnati = Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria = libreriaRec,  pr_consegnato=True).order_by('pr_classe', 'pr_codfiscale')
    #consegnati ancora da fatturare
    prenfatturabili=righeConsegnati.filter(pr_stato__lte=1)
    if prenfatturabili.count()>0:
        tot_fatturabile= round( prenfatturabili.aggregate(Sum('pr_spesa'))['pr_spesa__sum'], 2)  
    else:
        tot_fatturabile = 0        

    #lista fatture già create
    righeFattura = Fattura.objects.filter(fa_annoscol=annoscol, fa_libreria = libreriaRec)
    totali_classe=[]
    #calcolo per classe  da fatturare
    for classe in range(1,6):
        #calcola i totali per classe
        totale_generale=0
        tot_fatturato=0
        tot_fatturabile_classe=0
        #filtro sui consegnati non ancora fatturati della singola classe
        if tot_fatturabile > 0:
            prenfatturabili_classe=prenfatturabili.filter(pr_classe=classe)
            print(f"# da fatturare classe {classe}={prenfatturabili_classe.count()}")
            if prenfatturabili_classe.count()>0:
                tot_fatturabile_classe = prenfatturabili_classe.aggregate(Sum('pr_spesa'))['pr_spesa__sum']  
                tot_fatturabile_classe = round(tot_fatturabile_classe, 2) 

        else:
            tot_fatturabile_classe = 0
        totali_classe.append(tot_fatturabile_classe)

    if righeConsegnati.count() >0:
        # calcola la spesa totale, già fatturata e il residuo da fatturare
        if righeFattura.count()>0: 
            tot_fatturato=righeFattura.aggregate(Sum('fa_importo'))['fa_importo__sum']
            tot_fatturato=round(tot_fatturato, 2)    

    totale_generale = tot_fatturabile + tot_fatturato

    context = {'annoscol': annoscol, 'risultati': righeFattura, 'libreria': libreriaRec.denominazione, 'totali_classe': totali_classe }

    context['tot_fatturabile']       =   tot_fatturabile
    context['tot_fatturato']    =   tot_fatturato
    context['tot_generale']     =   totale_generale

    return render(request, 'tot_libreria_htmx.html', context)

@login_required
@user_passes_test(is_admin)
def listaconsegnati_admin(request, annoscol): 

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username

    if request.method == 'GET':
        form=FiltraLibreriaForm()
        righePren = Prenotazione.objects.filter(pr_annoscol= annoscol, pr_consegnato=True).order_by('pr_classe', 'pr_codfiscale')
        modo='all'
        totale_spesa=0                    
        totali_classe={}
        for classe in range(1,6):
            totali_classe[classe] = 0
            totale_gen=0
            dict= {'pr_consegnato': True, 'pr_classe': classe, 'pr_annoscol':annoscol}
            if Prenotazione.objects.filter(**dict).count():
                totali_classe[classe] = Prenotazione.objects.filter(**dict).aggregate(Sum('pr_spesa'))['pr_spesa__sum']  
                totali_classe[classe] = round(totali_classe[classe], 2)  
        
        if righePren.count() >0:
            totale_spesa=righePren.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
            totale_spesa=round(totale_spesa, 2)    
            totale_gen=totale_gen+totale_spesa
    
        context = {'annoscol': annoscol, 'risultati': righePren, 'libreria': 'ALL', 'libreriaform':form, 'modo': modo, 'totale_spesa': totale_spesa, 'tot1': totali_classe[1], 'tot2': totali_classe[2], 'tot3': totali_classe[3], 'tot4': totali_classe[4], 'tot5': totali_classe[5],'totale_gen':totale_gen }
    else:
        modo='filtra'          
        form=FiltraLibreriaForm(request.POST)
        libreria_sel=form.data['sel_libreria']
        denom_libreria=Libreria.objects.get(pk=libreria_sel).denominazione

        righePren = Prenotazione.objects.filter(pr_libreria=libreria_sel, pr_consegnato=True, pr_annoscol= annoscol).order_by('pr_classe', 'pr_codfiscale')
        totale_spesa=0                    
        totali_classe={}
        for classe in range(1,6):
            totali_classe[classe] = 0
            totale_gen=0
            dict= {'pr_libreria': libreria_sel, 'pr_consegnato': True, 'pr_classe': classe, 'pr_annoscol':annoscol}
            if Prenotazione.objects.filter(**dict).count():
                totali_classe[classe] = Prenotazione.objects.filter(**dict).aggregate(Sum('pr_spesa'))['pr_spesa__sum']  
                totali_classe[classe] = round(totali_classe[classe], 2)  
        
        if righePren.count() >0:
            totale_spesa=righePren.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
            totale_spesa=round(totale_spesa, 2)    
            totale_gen=totale_gen+totale_spesa
    
        context = {'annoscol': annoscol, 'risultati': righePren, 'libreria':denom_libreria, 'libreriaform':form, 'modo': modo, 'totale_spesa': totale_spesa, 'tot1': totali_classe[1], 'tot2': totali_classe[2], 'tot3': totali_classe[3], 'tot4': totali_classe[4], 'tot5': totali_classe[5],'totale_gen':totale_gen }    

    return render(request, 'allconsegnatilist.html', context)

def reset_no_consegnato(request,  id):

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]


    try:
        pren = Prenotazione.objects.get(pk=id)
    except ObjectDoesNotExist:
        raise Http404('Record inesistente')
    
    pren.pr_consegnato = False
    pren.save()
    return HttpResponseRedirect('/app/listapren_libreria/' + str(settings.ANNO_LAVORO))

def move_to_consegnato(request,  id):

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]

    try:
        pren = Prenotazione.objects.get(pk=id)
    except ObjectDoesNotExist:
        raise Http404('Record inesistente')
    
    pren.pr_consegnato = True
    pren.save()
    
    return HttpResponseRedirect('/app/listapren_libreria/'+ str(settings.ANNO_LAVORO))
    
def prenota_insert(request):
    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]
    
    dict_spesa = {}
    dict_spesa[1]=17.05
    dict_spesa[2]=24.28
    dict_spesa[3]=34.16
    dict_spesa[4]=45.95
    dict_spesa[5]=55.05       
    
    if request.method == 'GET':
        #calcolo del max value matricola  domandarec      

        dict={'pr_annoscol': settings.ANNO_LAVORO,               
              'pr_data_richiesta':date.today, 'pr_libreria': libreriaRec, 
              }
        form = PrenotaForm(initial=dict)      
        
    else: #POST
        # A POST request: Handle Form Upload
        form = PrenotaForm(request.POST) # Bind data from request.POST into a SoggettoEditForm
        if form.is_valid():
            f=form.save(commit=False)
            f.pr_spesa= dict_spesa[int(form.data['pr_classe'])]
            pr_facoltativo = form.data.get('pr_facoltativo', 'off') == 'on'            
            if pr_facoltativo:
                f.pr_spesa +=  8.05
                
            f.save()
            return HttpResponse(
                status=204,
                headers={
                    'HX-Trigger': json.dumps({
                        "PrenChanged": None,
                        "showMessage": f"Prenotazione inserita."
                    })
                }
            )
        else:
            print(form.errors)
            print("errori in form di prenotaz")
    context ={'form': form, 'libreria': libreriaRec.denominazione, 'annoscol': str(settings.ANNO_LAVORO),'add_rec':1}
    return render(request, 'prenota_modal.html',  context )

def prenota_edit(request, id):

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        

    try:
        pren = Prenotazione.objects.get(pk=id)
    except ObjectDoesNotExist:
        raise Http404('Record inesistente')
    
    dict_spesa = {}
    dict_spesa[1]=17.05
    dict_spesa[2]=24.28
    dict_spesa[3]=34.16
    dict_spesa[4]=45.95
    dict_spesa[5]=55.05                          
    
    if request.method == 'GET':
        #dict={'pr_annoscol': pren.pr_annoscol, 'pr_libreria':pren.pr_libreria, 'pr_data_richiesta': pren.pr_data_richiesta,'add_rec':0, 'pr_scuola':pren.pr_scuola, 'pr_classe': pren.pr_classe, 'selscuola': pren.pr_scuola.id,  'pr_codfiscale': pren.pr_codfiscale, 'pr_facoltativo': pren.pr_facoltativo, 'pr_spesa': pren.pr_spesa}
        form = PrenotaForm(instance=pren)                   
    else: #POST
        # A POST request: Handle Form Upload
        form = PrenotaForm(request.POST, instance=pren) # Bind data from request.POST into a SoggettoEditForm
        if form.is_valid():
            f=form.save(commit=False)
            f.pr_spesa= dict_spesa[int(form.data['pr_classe'])]
            #controlla che sia stato checcato
            pr_facoltativo = form.data.get('pr_facoltativo', 'off') == 'on'            
            if pr_facoltativo:
                f.pr_spesa +=  8.05
            #stesso controllo su pr_consegnato
            pr_consegnato = form.data.get('pr_consegnato', 'off') == 'on'   
            f.save()

            return HttpResponse(
                status=204,
                headers={
                    'HX-Trigger': json.dumps({
                        "PrenChanged": None,
                        "showMessage": f"Prenotazione #{id} aggiornata."
                    })
                }
            )        
        else:
            print("errori in form di prenotaz")
    
    context = {'form': form, 'prenId': id,  'annoscol':pren.pr_annoscol,'add_rec':0}
    return render(request, 'prenota_modal.html', context)

def prenota_del(request, id):
    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]

    prenotazione = get_object_or_404(Prenotazione, pk=id)
    prenotazione.delete()
    return HttpResponseRedirect(f"/app/listapren_libreria/{settings.ANNO_LAVORO}/")
    #return JsonResponse({'message': 'Prenotazione cancellata con successo.'}, status=204)

@login_required
@user_passes_test(is_admin)
def admin_addcodfiscale(request):

    # Controlla se il file dei codici fiscali esiste
    filename = settings.BASE_DIR + '/alunni.csv'
    if not os.path.exists(filename):
        msg = "Lista codici fiscali non trovata"
        context = {
            'form': CrispyMinoreForm(),
            'show_toast': True,
            'toast_message': msg,
            'annoscol': settings.ANNO_LAVORO
        }
        return render(request, 'add_cfminore.html', context)

    if request.method == 'GET':
        form = CrispyMinoreForm()
    else:  # POST
        form = CrispyMinoreForm(request.POST)
        if form.is_valid():
            cf_minore = request.POST['cf_minore'].upper()
            # Controlla presenza cf nel file
            with open(filename, "r") as myfile:
                if cf_minore in myfile.read():
                    msg = "Codice fiscale " + cf_minore + " già presente nel file"
                    context = {
                        'form': form,
                        'show_toast': True,
                        'toast_message': msg,
                        'annoscol': settings.ANNO_LAVORO
                    }
                    return render(request, 'add_cfminore.html', context)
            
            # Se il codice fiscale non è presente, lo aggiunge al file
            with open(filename, "a") as myfile:
                myfile.write(cf_minore + "\n")
            
            msg = "Codice fiscale: " + cf_minore + " inserito in elenco"
            context = {
                'form': form,
                'show_toast': True,
                'toast_message': msg,
                'annoscol': settings.ANNO_LAVORO
            }
            return render(request, 'add_cfminore.html', context)

    context = {'form': form, 'annoscol': settings.ANNO_LAVORO}
    return render(request, 'add_cfminore.html', context)

@login_required
def fattura_edit(request, id):
    recFattura = get_object_or_404(Fattura, pk=id)
    utente = request.user
    libreriaRec = Libreria.objects.filter(username=utente.username).first()

    if request.method == 'POST':
        myform = CreafatturaForm(request.POST, instance=recFattura)
        if myform.is_valid():
            myform.save()
            return HttpResponse(
                status=204,
                headers={
                    'HX-Trigger': json.dumps({
                        "FattChanged": None,
                        "showMessage": f"Fattura #{id} aggiornata."
                    })
                }
            )
        else:
            return JsonResponse({
                'success': False,
                'errors': myform.errors
            })

    myform = CreafatturaForm(instance=recFattura)
    context = {'form': myform, 'libreria': libreriaRec, 'fattura_id':id, 'add_rec':0 }
    return render(request, "add_fattura_modal.html", context)

def fattura_del(request, id):
    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        

    fatturaRec= get_object_or_404(Fattura, pk=id)

    # Controlla se ci sono record con pr_fatturanum=200 prima di eseguire l'aggiornamento
    if Prenotazione.objects.filter(pr_fatturanum=id).exists():
        # Aggiorna le prenotazioni solo se ci sono record con pr_fatturanum=200
        Prenotazione.objects.filter(pr_fatturanum=id).update(pr_stato=0)
        print('stato passato a 0')
    else:
        # Se non ci sono record, l'aggiornamento non è necessario, quindi non fare nulla
        pass           
    
    fatturaRec.delete()
    return HttpResponse(
        status=204,
        headers={
            'HX-Trigger': json.dumps({
                "FattChanged": None,
                "showMessage": f"Fattura #{id} eliminata."
            })
        }
    )

def listafatture_libreria(request, annoscol):

    try:
        user_is_authenticated = request.user.is_authenticated()
    except TypeError:
        user_is_authenticated = request.user.is_authenticated

    if not user_is_authenticated:
        return HttpResponseRedirect('/app/login')        
    #ricava la libreria dall'utente loggato
    utente = request.user.username
    libreriaRec = Libreria.objects.filter(username=utente)[0]

    annoscol=settings.ANNO_LAVORO
    fatturelist = Fattura.objects.filter(fa_libreria=libreriaRec, fa_annoscol=annoscol).order_by('fa_data')
    tot_fatturato=fatturelist.aggregate(Sum('fa_importo'))['fa_importo__sum']
    righeFatturabili = Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria = libreriaRec,  pr_consegnato=True, pr_stato__lte=1).order_by('pr_classe', 'pr_codfiscale')    
    totali_classi=[]

    for classe in range(1,6):
        #calcola i totali per classe
    
        totale_gen=0
        dict= {'pr_annoscol': annoscol, 'pr_libreria': libreriaRec, 'pr_consegnato': True, 'pr_classe': classe, 'pr_stato__lte':1}        
        if Prenotazione.objects.filter(**dict).count():
            # calcolo somma delle spese cedola da fatturare per la classe
            totfatturabile_classe = Prenotazione.objects.filter(**dict).aggregate(Sum('pr_spesa'))['pr_spesa__sum']  
            totfatturabile_classe = round(totfatturabile_classe, 2)  
            #aggiunge il totale all'array di tutte le classi
            totali_classi.append(totfatturabile_classe)
        else: #nessuna cedola ancora da fatturare per la classe
            totali_classi.append(0)
        
    context ={ 'risultati':fatturelist, 'annoscol': annoscol , 'totali_classi':totali_classi,'tot_fatturato':tot_fatturato, 'libreria':libreriaRec.denominazione}
    return render(request, 'fatture_libreria.html', context)

@login_required
@user_passes_test(is_admin)
def listafatture_admin(request, annoscol): 
        try:
            user_is_authenticated = request.user.is_authenticated()
        except TypeError:
            user_is_authenticated = request.user.is_authenticated

        if not user_is_authenticated:
            return HttpResponseRedirect('/app/login')        
        utente = request.user.username

        if request.method == 'GET':

            righeFatt = Fattura.objects.filter(fa_annoscol=annoscol).order_by('fa_libreria', 'fa_data')
            form=FiltraLibreriaForm()
            modo='all'
        else:
            modo='filtra'          
            form=FiltraLibreriaForm(request.POST)
            libreria_sel=form.data['sel_libreria']
            

            righeFatt = Fattura.objects.filter(fa_libreria=libreria_sel, fa_annoscol=annoscol).order_by('fa_data')
            if settings.DEBUG:
                print("Sel libreria:"+libreria_sel+ ' count:' + str(righeFatt.count()))
        
        if righeFatt.count()>0:
            totale_fatture  = righeFatt.aggregate(Sum('fa_importo'))['fa_importo__sum']
            totale_fatture  =   round(totale_fatture, 2)
        else:
            totale_fatture=0
        
        context = {'risultati': righeFatt, 'libreria': 'ALL', 'annoscol':settings.ANNO_LAVORO, 'totale_fatture': totale_fatture , 'libreriaform':form, 'modo': modo}
        return render(request, 'allfatturelist.html', context)

class LibrerieViewSet(viewsets.ModelViewSet):
    queryset = Libreria.objects.all()
    serializer_class = LibrerieSerializer   

class ScuoleViewSet(viewsets.ModelViewSet):
    queryset = Scuola.objects.all()
    serializer_class = ScuoleSerializer   

class AllPrenotazioniViewSet(viewsets.ModelViewSet):
    serializer_class = PrenotazioniSerializer
    
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        annoscol = self.kwargs['annoscol']

        return Prenotazione.objects.filter(pr_annoscol = annoscol).order_by('pr_data_richiesta') 

class PrenLibreriaViewSet(viewsets.ModelViewSet):
    serializer_class = PrenotazioniSerializer
    
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        annoscol = self.kwargs['annoscol']
        # Ottieni l'utente loggato
        utente = self.request.user 
        libreriaRec = Libreria.objects.filter(username=utente)[0]

        return Prenotazione.objects.filter(pr_annoscol = annoscol, pr_libreria = libreriaRec).order_by('pr_data_richiesta') 

class AllConsegnatiViewSet(viewsets.ModelViewSet):
    serializer_class = PrenotazioniSerializer
    
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        annoscol = self.kwargs['annoscol']
        return Prenotazione.objects.filter(pr_annoscol = annoscol, pr_consegnato=True).order_by('pr_data_richiesta') 

class ConsegnatiLibreriaViewSet(viewsets.ModelViewSet):
    serializer_class = PrenotazioniSerializer

    def get_queryset(self):
        annoscol_param = self.kwargs.get('annoscol', None)
        stato_param = self.kwargs.get('stato', None)
        
        # Ottieni l'utente loggato
        utente = self.request.user 
        libreriaRec = Libreria.objects.filter(username=utente.username).first()
        
        # Filtra le prenotazioni per libreria e anno scolastico
        queryset = Prenotazione.objects.filter(
            pr_annoscol=annoscol_param, 
            pr_consegnato=True, 
            pr_libreria=libreriaRec
        )

        # Filtra per stato, se specificato
        if stato_param is not None:
            queryset = queryset.filter(pr_stato=stato_param)
        
        return queryset.order_by('pr_data_richiesta')


class FattureLibreriaViewSet(viewsets.ModelViewSet):

    serializer_class = FattureSerializer
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        annoscol = self.kwargs['annoscol']
        utente = self.request.user 
        libreriaRec=Libreria.objects.filter(username=utente.username)[0]        
        return Fattura.objects.filter(fa_annoscol = annoscol, fa_libreria = libreriaRec).order_by('fa_data')

#parte admin
class AllFattureViewSet(viewsets.ModelViewSet):

    serializer_class = FattureSerializer
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        annoscol = self.kwargs['annoscol']
        return Fattura.objects.filter(fa_annoscol = annoscol).order_by('fa_data')

class PrenLibreriaList(generics.ListAPIView):
    serializer_class = PrenotazioniSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        libreriaId = self.kwargs['libreriaId']
        annoscol = self.kwargs['annoscol']
        return Prenotazione.objects.filter(pr_libreria__id = libreriaId, pr_annoscol = annoscol)

@login_required
def selprenxfattura(request):
        
        # Ottieni l'utente loggato
        utente = request.user 
        libreriaRec = Libreria.objects.filter(username=utente.username).first()
        annoscol= str(settings.ANNO_LAVORO)
        # Filtra le prenotazioni per libreria e anno scolastico non ancora fatturate
        recselezionabili = Prenotazione.objects.filter(
            pr_annoscol=annoscol, 
            pr_consegnato=True, 
            pr_libreria=libreriaRec, pr_stato=0
        )

        recselezionate = Prenotazione.objects.filter(
            pr_annoscol=annoscol, 
            pr_consegnato=True, 
            pr_libreria=libreriaRec, pr_stato=1
        )

        context = {'righe_selezionabili': recselezionabili, 'righe_selezionate': recselezionate, 'annoscol':annoscol}
        return render(request, "prepara_fattura.html", context)

def aggiorna_lista_dafatturare(request):
            # Ottieni l'utente loggato
        utente = request.user 
        libreriaRec = Libreria.objects.filter(username=utente.username).first()
        annoscol= str(settings.ANNO_LAVORO)
        # Filtra le prenotazioni per libreria e anno scolastico con stato a 1
        recselezionate = Prenotazione.objects.filter(
            pr_annoscol=annoscol, 
            pr_consegnato=True, 
            pr_libreria=libreriaRec, pr_stato=1
        )
        
        context = {'righe_selezionate': recselezionate, 'annoscol':annoscol}
        return render(request, "prenxfatturare.html", context)
    
@login_required
def selprenxfattura_xclasse(request):
            
    # Ottieni l'utente loggato
    utente = request.user 
    libreriaRec = Libreria.objects.filter(username=utente.username).first()
    annoscol= str(settings.ANNO_LAVORO)

    recselezionate = Prenotazione.objects.filter(
            pr_annoscol=annoscol, 
            pr_consegnato=True, 
            pr_libreria=libreriaRec, pr_stato=1)    
    
    recselezionabiliAll = Prenotazione.objects.filter(
                pr_annoscol=annoscol, 
                pr_consegnato=True, 
                pr_libreria=libreriaRec, pr_stato=0)
    
    if request.method == "POST":
        classe = request.POST.get('classe')
        if classe and classe != 'all':
            # Filtra le prenotazioni per libreria, anno scolastico e classe, non ancora fatturate
            recselezionabili = recselezionabiliAll.filter( pr_classe=classe)
        else:
            recselezionabili = recselezionabiliAll
            classe='all'
    else:
        recselezionabili = recselezionabiliAll
        classe='all'

    context = {'righe_selezionabili': recselezionabili, 'righe_selezionate': recselezionate, 'annoscol':annoscol, 'classe_selezionata':classe}
    return render(request, "prepara_fattura.html", context)

@login_required
def azzera_lista_selezionate(request):
        annoscol = settings.ANNO_LAVORO
        # Ottieni l'utente loggato
        utente = request.user 

        libreriaRec = Libreria.objects.filter(username=utente.username).first()
        try:
            # Fai l'aggiornamento di tutti i record a stato=0
            Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria=libreriaRec.id, pr_consegnato=True, pr_stato=1).update(pr_stato=0)
            return HttpResponseRedirect("/app/selprenxfattura/")

        except Exception as e:
            return HttpResponse(f"Errore durante l'aggiornamento dello stato: {str(e)}", status=500)

@login_required
def set_filtrati_selezionati(request):
    annoscol = settings.ANNO_LAVORO
    # Ottieni l'utente loggato
    utente = request.user 

    libreriaRec = Libreria.objects.filter(username=utente.username).first()

    if request.method == 'POST':
        # Esegui l'aggiornamento dello stato per i record filtrati
        classe_selezionata = request.POST.get('classe')
        
        # Esegui il tuo aggiornamento dello stato qui utilizzando il valore di 'classe_selezionata'
        if classe_selezionata != 'all':

            try:
                # Fai l'aggiornamento di tutti i record a stato=0
                recs = Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria=libreriaRec.id, pr_consegnato=True, pr_stato=0, pr_classe=classe_selezionata)
                if recs.count()>0:
                    recs.update(pr_stato=1)

            except Exception as e:
                return HttpResponse(f"Errore durante l'aggiornamento della lista: {str(e)}", status=500)
            # Restituisci una risposta JSON per indicare che l'aggiornamento è stato eseguito con successo
            return JsonResponse({'message': 'Aggiornamento della lista eseguito con successo.'})
        else:
            print
            try:
                # Fai l'aggiornamento di tutti i record a stato=0
                Prenotazione.objects.filter(pr_annoscol=annoscol, pr_libreria=libreriaRec.id, pr_consegnato=True, pr_stato=0).update(pr_stato=1)

            except Exception as e:
                return HttpResponse(f"Errore durante l'aggiornamento della lista: {str(e)}", status=500)
            # Restituisci una risposta JSON per indicare che l'aggiornamento è stato eseguito con successo
            return JsonResponse({'message': 'Aggiornamento della lista eseguito con successo.'})            
    else:
        # Se la richiesta non è POST, restituisci un errore
        return JsonResponse({'error': 'Richiesta non valida.'}, status=400)

@login_required    
def prepara_fattura(request):

    utente = request.user 
    libreriaRec = Libreria.objects.filter(username=utente.username).first()
    annoscol = str(settings.ANNO_LAVORO)
    oggi = timezone.now().date()

    dict = {'pr_annoscol': annoscol, 'pr_libreria': libreriaRec.id, 'pr_consegnato': True, 'pr_stato': 1}
    righexFattura = Prenotazione.objects.filter(**dict)
    importo_fattura = righexFattura.aggregate(Sum('pr_spesa'))['pr_spesa__sum']
    importo_fattura = round(importo_fattura, 2) if importo_fattura else 0.0

    if request.method == 'POST':            
        myform = CreafatturaForm(request.POST)
        if myform.is_valid():
            with transaction.atomic():
                 # Salva la fattura senza committare
                fattura = myform.save(commit=False)
                # Salva l'istanza della fattura nel database per ottenere la pk
                fattura.save()
                # Aggiorna le righe della prenotazione con la pk della fattura
                righexFattura.update(pr_stato=2, pr_fatturanum=fattura.pk)

            return JsonResponse({
                'success': True,
                'message': "Fattura creata."
            })
        else:
            print("errori")
            print(myform.errors)

            return JsonResponse({
                'success': False,
                'errors': myform.errors
            })

    myform = CreafatturaForm(initial={
        'fa_importo': importo_fattura,
        'fa_annoscol': annoscol,
        'fa_libreria': libreriaRec,
        'fa_data': oggi
    })

    context = {'form': myform, 'libreria': libreriaRec}
    return render(request, "add_fattura_modal.html", context)
        
def update_dafatturare_table(request):
    righe_selezionate = Item.objects.filter(stato=2)
    return render(request, 'myapp/right_table.html', {'righe_selezionate': righe_selezionate})

def aggiorna_stato_pren(request):

    if request.method == 'POST':
        record_id = request.POST.get('record_id')
        nuovo_stato = request.POST.get('nuovo_stato')
        # Esegui la logica per aggiornare lo stato nel database
        try:
            mypren = Prenotazione.objects.get(pk=record_id)
        except ObjectDoesNotExist:
            raise Http404('Record inesistente')
        
        mypren.pr_stato = nuovo_stato
        mypren.save()

        return JsonResponse({'message': 'Stato aggiornato con successo'})
    else:
        return JsonResponse({'error': 'Richiesta non valida'}, status=400)
