from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect,FileResponse
from django.urls import reverse

from .models import *
from .forms import *

from documento.forms import *
from documento.managefile import *

from att.views import *
from comunicazione.views import ServizioMail
from sicurezza.views import getAMP,getAZP,getSEP

from random import randint
from config.views import *
import re

import csv
from io import StringIO

def welcome(request):
  if not 'AdminId' in request.session or 'UserId' in request.session:
    print("Non rilevo presensa UserId e AdminId in request.session")
    return HttpResponseRedirect(reverse("login:start"))

  data = dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')
  data['Navbar']=False

  if not 'AziendaId' in request.session:
    return HttpResponseRedirect(reverse("login:start"))
  else:
    data['AziendaId'] = request.session['AziendaId']
    data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])
    data['utenti'] = data['azienda'].utente_set.all().order_by('nome')
    data['numeroRecordAzienda'] = len(data['utenti'])

  if 'AdminId' in request.session:
    data['AdminId'] = request.session['AdminId']
    admin = Amministratore.objects.get(pk=data['AdminId'])
    data['admin'] = admin
    print('admin',admin.id,admin.nome)

  if 'SedeId' in request.session and request.session['SedeId'] > 0:
    print('presente SedeId',request.session['SedeId'])
    data['SedeId'] = request.session['SedeId']
    data['sede'] = Sede.objects.get(pk=request.session['SedeId'])
    data['utenti'] = data['sede'].utente_set.all().order_by('nome')
  else:
    data['sede'] = None

  if 'UserId' in request.session:
    data['UserId'] = request.session['UserId']

  data['numeroRecordAttuali'] = len(data['utenti'])

  data['permesso_amministratore'] = getAMP(admin)
  data['permesso_azienda'] = getAZP(data['AziendaId'],admin)
  data['permesso_sede'] = getSEP(data['sede'],admin)

  print('permesso_amministratore',data['permesso_amministratore'])
  print('permesso_azienda',data['permesso_azienda'])
  print('permesso_sede',data['permesso_sede'])

  if request.method == 'POST':
    print('qualcuno ha premuto un tasto')

    print("***********")
    print(request.POST)
    print("***********")

    if 'indietro' in request.POST:
      return HttpResponseRedirect(reverse("azienda:welcome"))

    if "UTENTE.CREA" in data['permesso_sede'] or "UTENTE.CREA" in data['permesso_azienda']:
      if 'scelta' in request.POST:
        scelta = request.POST['scelta']
        request.session['UserEditId'] = scelta
        print('scelta effettuata',scelta)
        return HttpResponseRedirect(reverse("utente:edit"))
  
    if "UTENTE.CREA" in data['permesso_sede'] or "UTENTE.CREA" in data['permesso_azienda']:
      if 'CaricaIndice' in request.POST:
        print('request',request.POST)
        print('files',request.FILES)
        fileindicecaricato = formIndiceUpload(request.POST,request.FILES)
        print(fileindicecaricato)
        if fileindicecaricato.is_valid():
          print('record filecaricati validi')
          print('presente file indice')
          fileindiceottenuto = fileindicecaricato.cleaned_data.get('indice')
          save_and_load_file_indice(request,fileindiceottenuto,data['azienda'],data['sede'])
        else:
          print('request non valida')
      if 'select' in request.POST:
        #validiamo i dati passati
        SelectResponse = formMultipleCheckBox(request.POST)
        SelectResponse.c(data['utenti'])
        print("SelectResponse",SelectResponse)

        if SelectResponse.is_valid():
          select = SelectResponse.cleaned_data.get('select')
          print('select',select,type(select))

          tmplist = list()
          tmplist.append(["Codice Fiscale","Nome","Pin"])
          for i in select:
            print("utente",i)
            if i == '0': continue
            u = Utente.objects.get(pk=int(i))
            tmplist.append([u.codicefiscale,u.nome,u.pin])
            print("lunghezza tmplist",len(tmplist))

          f = StringIO()
          csv.writer(f).writerows(tmplist)
          print(f.getvalue())

          # scarica il file
          response =  FileResponse(f.getvalue(),content_type='application/csv',as_attachment=False)
          response['Content-Disposition'] = 'attachment; filename="lista_dipendenti.csv"'
          return response

 
  return render(request,'utente.welcome.html',data)

def edit(request):
  if not 'AdminId' in request.session or 'UserId' in request.session:
    print("Non rilevo presensa UserId e AdminId in request.session")
    return HttpResponseRedirect(reverse("login:start"))

  data=dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')

  if 'AdminId' in request.session:
    data['AdminId'] = request.session['AdminId']
    admin = Amministratore.objects.get(pk=data['AdminId'])
    data['admin'] = admin
    print('admin',admin.id,admin.nome)

  if not 'AziendaId' in request.session:
    return HttpResponseRedirect(reverse("login:start"))
  data['AziendaId']=request.session['AziendaId']
  data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])

  sede = None
  if 'SedeId' in request.session:
    SedeId = request.session['SedeId']
    print('SedeId',SedeId)
    try:
      sede = Sede.objects.get(pk=SedeId)
    except Sede.DoesNotExist as dne:
      print("non esiste")
    data['sede'] = sede

  data['permesso_amministratore'] = getAMP(admin)
  data['permesso_azienda'] = getAZP(data['AziendaId'],admin)
  data['permesso_sede'] = getSEP(sede,admin)

  print('permesso_amministratore',data['permesso_amministratore'])
  print('permesso_azienda',data['permesso_azienda'])
  print('permesso_sede',data['permesso_sede'])

  if 'UserId' in request.session:
    data['UserId'] = request.session['UserId']

  if not'UserEditId' in request.session:
    return HttpResponseRedirect(reverse("login:start"))
  data['UserEditId'] = request.session['UserEditId']

  #filtro:
  # selezionare tutti gli utenti per AziendaId
  data['admin'] = Amministratore.objects.get(pk=data['AdminId'])
  data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])
  data['listasede'] = data['azienda'].sede_set.all().order_by('nome')
  print('quante sedi ci sono',len(data['listasede']))

  utente = None
  if data['UserEditId'] == "Nuovo Dipendente":
    utente = Utente()
    utente.pin = str(randint(100000,999999))
    utente.azienda = data['azienda']
    utente.azienda.forzanuovapassword
    if 'sede' in data:
      utente.sede = data['sede']
  else:
    try:
      utente = Utente.objects.get(pk=data['UserEditId'])
      #data['documentiUtente'] = utente.documento_set.all()
      data['ElencoDocumenti'] = utente.documento_set.all()
      data['listaAttivita'] = getLogxAmministrazione(utente)
      data['uid']=utente.id
    except Utente.DoesNotExist as dne:
      print('strana richiesta, utente inesistente')
      flagDne=True
      utente=None
      print("Non ci siamo, manca l'utente")
  
  if request.method == 'POST':

    if "indietro" in request.POST:
      return HttpResponseRedirect(reverse("utente:welcome"))    
    print('request.method x edit utente')

    if 'DeleteDocument' in request.POST:
      documento = request.POST['DeleteDocument']
      print('documento da rimuovere',documento)
      d = Documento.objects.get(pk=documento)
      if d:
       delete_file(d) #rimozione fisica del documento
       d.delete()

    fu = formUtente(request.POST)
    if fu.is_valid():
      print('form valida')
      cancellautente = fu.cleaned_data.get('cancellautente')
      if cancellautente:
        print('richiesta cancellazione utente, passo la chiamata')
        return HttpResponseRedirect(reverse("utente:cancellautente")) 

      print('i dati sono grosso modo coerenti, salviamoli')
      utente.nome = fu.cleaned_data['nome'].title()
      utente.codicefiscale = fu.cleaned_data['codicefiscale'].upper()
      utente.luogonascita = fu.cleaned_data['luogonascita'].title()
      utente.datanascita = fu.cleaned_data['datanascita']
      utente.mail = fu.cleaned_data['mail'].lower()
      utente.pin = fu.cleaned_data['pin']
      utente.cambiopassword = fu.cleaned_data['cambiopassword']
      utente.forzanuovapassword = fu.cleaned_data['forzanuovapassword']
      utente.otppassword = fu.cleaned_data['otppassword']
      tmp_sede = fu.cleaned_data['sede']
      print('tmp_sede',tmp_sede)
      try:
        cercasede = Sede.objects.get(pk=tmp_sede)
        utente.sede = cercasede
      except Sede.DoesNotExist as dne:
        print('sede non valida',tmp_sede)
      print('utente da registrare',utente.nome,utente.sede_id)
      setLog(7,utente=utente)
      utente.save()
      return HttpResponseRedirect(reverse("utente:welcome"))

    print('Form non valida')
    tmp = dict()
    tmp['nome'] = utente.nome
    tmp['codicefiscale'] = utente.codicefiscale
    tmp['datanascita'] = utente.datanascita
    tmp['luogonascita'] = utente.luogonascita
    tmp['sede'] = utente.sede_id
    tmp['mail'] = utente.mail
    tmp['pin'] = utente.pin
    tmp['cambiopassword'] = utente.cambiopassword
    tmp['forzanuovapassword'] = utente.forzanuovapassword
    tmp['otppassword'] = utente.otppassword
    print('utente.sede_id',utente.sede_id)
    tmp['sede'] = utente.sede_id
    print('tmp su form non valida',tmp)
    data['utente'] = formUtente(tmp)

    filecaricati = AdminUpload(request.POST,request.FILES)
     
    if filecaricati.is_valid():
      flagcomunicazione = filecaricati.cleaned_data.get('comunicazione')
      if filecaricati.cleaned_data.get('allegati'):
        print('presenti documenti da allegare')
        listadocumenti = filecaricati.cleaned_data['allegati']
        print(listadocumenti)
        print('descrizione',filecaricati.cleaned_data['descrizione'])
        listaok,listanotok = save_and_load_file_single(listadocumenti,request,utente,data['azienda'],data['sede'],filecaricati.cleaned_data['descrizione'],data['admin'])
        print('stato caricamenti',listaok,listanotok)
        data['listaok'] = listaok
        data['listnotok'] = listaok
        data['documentiUtente'] = utente.documento_set.all()

        print('filecaricati',filecaricati,flagcomunicazione)
        if flagcomunicazione:
          ### comunicazioni ###
          sm = ServizioMail(debug=True)

          try:
            comunicazione = Comunicazione.objects.get(pk=7)
          except Comunicazione.DoesNotExist as dne:
            print("Record comunicazione inesistente",dne)

          sm.set_mailfrom=comunicazione.mittente
          sm.add_to(u.mail)

          sm.set_soggetto(comunicazione.soggetto)
          sm.set_corpo(comunicazione.corpo)

          sm_data = dict()
          utente=dict() #adattamento campo utente

          utente['nome'] = utente.nome
          utente['mail'] = utente.mail
          utente['sito'] = getConfig('DefaultSite')
          utente['titolo'] = getConfig('HeaderTitle')
          sm_data['utente'] = utente

          sm.set_data(sm_data)
          sm.send()
          ### comunicazioni ###
  else:
    print('Request non valida,utente:',utente.id)
    tmp = dict()
    tmp['nome'] = utente.nome
    tmp['codicefiscale'] = utente.codicefiscale
    tmp['datanascita'] = utente.datanascita
    tmp['luogonascita'] = utente.luogonascita
    tmp['mail'] = utente.mail
    tmp['pin'] = utente.pin
    tmp['forzanuovapassword'] = utente.forzanuovapassword
    tmp['cambiopassword'] = utente.cambiopassword
    tmp['otppassword'] = utente.otppassword
    tmp['sede'] = utente.sede_id
    print("tmp su request non valida",tmp)
    data['utente'] = formUtente(tmp)

  # verifica bonta' mail.
  regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
  if(not re.fullmatch(regex, utente.mail)):
    print("Mail non valida")
    data['mailnonvalida']=True

  return render(request,'utente.edit.html',data)

def download(request):
  '''
  questa funzione permette di fare un po di cose:
  scaricare i documenti
  cambiare la password
  aggiornare la mail
  '''
  print('area download')

  data=dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')

  if not 'UserId' in request.session:
    print("Non rilevo UserId in request.session")
    return HttpResponseRedirect(reverse("login:start"))

  data['UserId'] = request.session['UserId']

  #filtro:
  # avendo il dato utente... vediamo come muoverci
  #data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])

  #recuperiamo i dati dell'utente e i file che puo' scaricare.
  utente = None
  try:
    utente = Utente.objects.get(pk=data['UserId'])
  except Utente.DoesNotExist as dne:
    print('dillo che ci hai provato, fasullo!')
    return HttpResponseRedirect(reverse("login:start"))

  data['utente'] = utente
  data['documentiUtente'] = utente.documento_set.all()
  data['listaAttivita'] = getLogxUtente(utente)

  if request.method == 'POST':
    print('qualcosa è stato richiesto')
    if 'indietro' in request.POST:
      return HttpResponseRedirect(reverse('login:start'))

    pinmail = formPinMail(request.POST)
    if pinmail.is_valid():
      print('pinmail valid')
      utente.pin = pinmail.cleaned_data['pin']
      utente.mail = pinmail.cleaned_data['mail']
      utente.save()
      print('utente aggiornato',utente.id)
      setLog(6,utente=utente)

  # verifica bonta' mail.
  regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
  if(not re.fullmatch(regex, utente.mail)):
    print("Mail non valida")
    data['mailnonvalida']=True
  else:
    print("Mail valida")
 
  return render(request,'utente.download.html',data)

def updatePasswordFromLogin(request,uuid):
  '''
  la form che segue, serve per aggiornare la propria password/pin dal login
  '''
  data = dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')
  data['uuid'] = uuid
  print('uuid',uuid)

  if request.method == 'POST':
    print("***********")
    print(request.POST)
    print("***********")
    formupdatepasswordlogin = formUpdatePasswordLogin(request.POST)
    if formupdatepasswordlogin.is_valid():
      cfisc = formupdatepasswordlogin.cleaned_data.get('cfisc')
      pin1 = formupdatepasswordlogin.cleaned_data.get('pin1')
      pin2 = formupdatepasswordlogin.cleaned_data.get('pin2')
      uuidl = formupdatepasswordlogin.cleaned_data.get('uuid')
      print('stato',cfisc,pin1,pin2,uuidl)

      a = None
      d = None
      # 1 tentativo su codice fiscale
      try: 
        a = Utente.objects.get(codicefiscale=cfisc.upper())
        d = 'u'
      except Utente.DoesNotExist as dne:
        print('informazione non trovata tra i codici fiscali utente')
        try:
          a = Utente.objects.get(mail=cfisc.lower())
          d = 'u'
        except Utente.DoesNotExist as dne:
          print('informazione non trovata tra le email')
          try:
            a = Amministratore.objects.get(login=cfisc.lower())
            d = 'a'
          except Amministratore.DoesNotExist as dne:
            print('informazione non trovata tra i login amministratotore')

      print('record',a.id,a.nome,a.uuid,d)

      if d == 'u':
        print('utente',a.codicefiscale)
      if d == 'a':
        print('amministratore',a.login)

      if uuidl == a.uuid:
        print('uuid corrisponde',uuidl,uuid)
        a.pin = pin1
        a.uuid = ""
        a.lostpin = False
        a.save()

        ### comunicazioni ###
        if len(a.mail) > 0:
          comunicazione = None
          try:
            comunicazione = Comunicazione.objects.get(pk=5)
          except Comunicazione.DoesNotExist as dne:
            print('comunicazione non valida',dne)
          if comunicazione:
            sm = ServizioMail(debug=True)
            sm.set_mailfrom=comunicazione.mittente
            sm.add_to(a.mail)

            sm.set_soggetto(comunicazione.soggetto)
            sm.set_corpo(comunicazione.corpo)

            sm_data = dict()
            sm_data['utente'] = a
            sm.set_data(sm_data)
            sm.send()
          ### comunicazioni ###
      else:
        print('form non valida, errore uuid')
        data['informazione'] = formUpdatePasswordLogin(request.POST)

      return HttpResponseRedirect(reverse("login:start"))
    else:
      print('form not valid')
      data['informazione'] = formUpdatePasswordLogin(request.POST)
  else:
    print('request non valida', request.POST)
    tmp = dict()
    tmp['cfisc'] = ""
    tmp['uuid'] = uuid
    tmp['pin1'] = ""
    tmp['pin2'] = ""
    data['informazione'] = formUpdatePasswordLogin(tmp)
    print(data)

  return render(request,'utente.edit.password.login.html',data)

def forceUpdatePassword(request,uuid):
  '''
  la form che segue, serve per aggiornare la propria password/pin dal login
  '''
  data = dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')
  data['uuid'] = uuid
  print('uuid',uuid)

  if request.method == 'POST':
    print(request.POST)
    formupdatepasswordlogin = formUpdatePasswordPrimoLogin(request.POST)
    if formupdatepasswordlogin.is_valid():
      cfisc = formupdatepasswordlogin.cleaned_data.get('cfisc')
      pin0 = formupdatepasswordlogin.cleaned_data.get('pin0')
      pin1 = formupdatepasswordlogin.cleaned_data.get('pin1')
      pin2 = formupdatepasswordlogin.cleaned_data.get('pin2')
      print('stato',cfisc,pin1,pin2)

      a = None
      d = None
      # 1 tentativo su codice fiscale
      try: 
        a = Utente.objects.get(codicefiscale=cfisc.upper())
        d = 'u'
      except Utente.DoesNotExist as dne:
        print('informazione non trovata tra i codici fiscali utente')
        try:
          a = Utente.objects.get(mail=cfisc.lower())
          d = 'u'
        except Utente.DoesNotExist as dne:
          print('informazione non trovata tra le email')
          try:
            a = Amministratore.objects.get(login=cfisc.lower())
            d = 'a'
          except Amministratore.DoesNotExist as dne:
            print('informazione non trovata tra i login amministratotore')

      oldpwd = False
      print('record',a.id,a.nome,a.uuid,d)
      if d == 'u':
        print('utente',a.codicefiscale)
        if a.pin == pin0:
          oldpwd = True
          print('verificata la vecchia password')
      if d == 'a':
        print('amministratore',a.login)

      if oldpwd:
        print('password vecchia ok')
        a.pin = pin1
        a.uuid = ""
        a.forzanuovapassword = False
        a.lostpassword = False
        a.save()

        ### comunicazioni ###
        if len(a.mail) > 0:
          comunicazione = None
          try:
            comunicazione = Comunicazione.objects.get(pk=5)
          except Comunicazione.DoesNotExist as dne:
            print('comunicazione non valida',dne)
          if comunicazione:
            sm = ServizioMail(debug=True)
            sm.set_mailfrom=comunicazione.mittente
            sm.add_to(a.mail)
            sm.set_soggetto(comunicazione.soggetto)
            sm.set_corpo(comunicazione.corpo)

            sm_data = dict()
            sm_data['utente'] = a
            sm.set_data(sm_data)
            sm.send()
        ### comunicazioni ###
        return HttpResponseRedirect(reverse("login:start"))
      else:
        print('form not valid nella validazione vecchia password',a.pin,pin0)
        data['informazione'] = formUpdatePasswordPrimoLogin(request.POST)
    else:
      print('form not valid')
      data['informazione'] = formUpdatePasswordPrimoLogin(request.POST)
  else:
    print('request non valida', request.POST)
    tmp = dict()
    tmp['cfisc'] = ""
    tmp['uuid'] = uuid
    tmp['pin0'] = ""
    tmp['pin1'] = ""
    tmp['pin2'] = ""
    data['informazione'] = formUpdatePasswordPrimoLogin(tmp)
    print(data)

  return render(request,'utente.edit.password.primologin.html',data)

def cancellautente(request):
  print('richiesta cancellazione definitiva utente')

  # direi che la funzione lavori in due fasi:
  # 1: viene richiesta conferma della cancellazione
  # 2: in caso di affermazione positiva, si procede

  if not 'AdminId' in request.session or 'UserId' in request.session:
    print("Non rilevo presensa UserId e AdminId in request.session")
    return HttpResponseRedirect(reverse("login:start"))

  data=dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')

  if 'AdminId' in request.session:
    data['AdminId'] = request.session['AdminId']
    admin = Amministratore.objects.get(pk=data['AdminId'])
    data['admin'] = admin
    print('admin',admin.id,admin.nome)

  if not 'AziendaId' in request.session:
    return HttpResponseRedirect(reverse("login:start"))
  data['AziendaId']=request.session['AziendaId']
  data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])

  sede = None
  if 'SedeId' in request.session:
    SedeId = request.session['SedeId']
    print('SedeId',SedeId)
    try:
      sede = Sede.objects.get(pk=SedeId)
    except Sede.DoesNotExist as dne:
      print("non esiste")
    data['sede'] = sede

  if 'UserId' in request.session:
    data['UserId'] = request.session['UserId']

  if not'UserEditId' in request.session:
    return HttpResponseRedirect(reverse("login:start"))

  data['UserEditId'] = request.session['UserEditId']

  if request.method == 'POST':
    cu = formCancellaUtente(request.POST)

    if 'indietro' in request.POST:
      return  HttpResponseRedirect(reverse("utente:welcome"))   

    if cu.is_valid() and cu.cleaned_data.get('ConfermaCancellazioneUtente'):

      #  tutto ok,
      #  procedo alla cancellazione

      utente = Utente.objects.get(pk=data['UserEditId'])
      print('utente',utente.codicefiscale)
      lista_documenti = utente.documento_set.all()
      print('quanti documenti',len(lista_documenti))
  
      # step1 cancellazione dei documenti.
      for i in lista_documenti:
        # rimuove documento fisicamente
        delete_file(i)

        # e poi lo rimuove dall'archivio
        i.delete()
      
      # step2 cancellazione dell'utente
      utente.delete()

    # step3 ritorno alla lista degli utenti
    return  HttpResponseRedirect(reverse("utente:welcome"))

  return render(request,'utente.conferma.cancellazione.html',data)

