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

from .forms import *
from config.views import getConfig
from comunicazione.views import ServizioMail
from att.views import *  

import uuid

from utente.models import *
from amministratore.models import *

def start(request):
  '''
  da qui si comincia
  l'utente e' invitato a inserire il suo codice fiscale e la password/pin assegnata in fase di visita medica
  se i dati corrispondono, si forniscono i file e alcune info di servizio
  '''
  request.session.flush()
  request.session.set_expiry(3600)

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

  if request.method=="POST":
    result = LoginUser(request.POST)

    if result.is_valid():
      print('result is valid')

      accesso = result.cleaned_data['cfisc']
      pin = result.cleaned_data['passs']

      #verifica corrispondenza utente
      u = None
      try:
        # verifica che esista un utente ordinario
        u = Utente.objects.get(codicefiscale=accesso.upper())
      except  Utente.DoesNotExist as dne:
        print("utente inesistente a livello dipendente")

      if u: #utente esiste

        ### obbligo cambio password
        ### se è previsto che l'utente a livello di sede cambi la password
        ### al primo ingresso, qui vengono effettuati entrambi i check
   
        # se l'utente non e' associato a una sede torna errore... quindi meglio che la sede ci sia
        if u.sede:
          print('sede',u.sede.nome)
          print('stato possibilita cambio password',u.sede.cambiopassword)
          print('stato forzatura cambio password',u.sede.forzanuovapassword)

        if u.forzanuovapassword:
          print("l'utente deve cambiare obbligatoriamente la password")
          # la sede e' impostata per forza il cambio password al primo login e l'utente e' al primo login

          # forzatura cambio password
          data = dict()
          data['HeaderTitle'] = getConfig('HeaderTitle')
          data['utente'] = u
          uuidres = str(uuid.uuid4())
          print('uuid',uuidres)

          ### comunicazioni ###
          sm = ServizioMail(debug=True)
          comunicazione = None
          try:
            comunicazione = Comunicazione.objects.get(pk=6)
            print('comunicazione',comunicazione.id)
          except Comunicazione.DoesNotExist as dne:
            print("Record comunicazione inesistente",dne)

          if comunicazione: 
            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
            print(reverse('login:ResetPassword',args=[uuidres]))

            utente['link'] = reverse('utente:forceUpdatePassword',args=[uuidres])
            utente['nome'] = u.nome
            utente['mail'] = u.mail
            utente['sito'] = getConfig('DefaultSite')
            utente['titolo'] = getConfig('HeaderTitle')
            sm_data['utente'] = utente
            sm.set_data(sm_data)
            sm.send()
            ### comunicazioni ###

            ### salva uuid
            u.uuid = uuidres
            u.save()

            return render(request,'forzaNuovaPasswordEnd.html',data)
            # richiesta forzata cambio password - fine 

        if u.pin.strip()== pin:
          # password valida
          data = dict()
          data['u'] = u
          #data['settings'] = settings
          #data['static'] = static
          request.session['UserId'] = u.id
          print('utente validato:',u.nome)
          setLog(1,utente=u)
          #setNewLog(1,{'u':u.nome})

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

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

              sm_data = dict()
              sm_data['utente'] = u
              sm.set_data(sm_data)
              sm.send()
          ### comunicazioni ###

          return HttpResponseRedirect(reverse("utente:download"))
      else: # l'utente ordinario non esiste
        print('verifica amministratore')
        
        a = None
        try:
          a = Amministratore.objects.get(login=accesso.strip())
          if a:
            print('login trovato',a.nome)
        except Amministratore.DoesNotExist as dne:
          print('amministratore non trovato',dne)

        if a:
          print(a.id,a.login,a.pin,pin)

          if a.pin.strip()== pin:
            request.session['AdminId'] = a.id
            setLog(1,amministratore=a)

            ### comunicazioni ###
            sm = ServizioMail(debug=True)
            comunicazione = None
            try:
              comunicazione = Comunicazione.objects.get(pk=1)
            except Comunicazione.DoesNotExist as dne:
              print("Record comunicazione inesistente",dne)
            if comunicazione: 
              sm.set_mailfrom=comunicazione.mittente
              sm.add_to(a.mail)

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

              sm_data = dict()
              utente=dict() #adattamento campo utente
              utente['nome'] = a.nome
              utente['mail'] = a.mail
              sm_data['utente'] = a
              sm.set_data(sm_data)
              sm.send()
            ### comunicazioni ###

            return HttpResponseRedirect(reverse("azienda:welcome"))
        else:
          print('Errore: amministratore non valido')
          if a.azienda.cambiopassword and a.sede.cambiopassword and a.cambiopassword:
            print("all'utente e' richiesto di cambiare la password al primo accesso")
          return HttpResponseRedirect(reverse("login:start"))
  else:
    temp={}
    temp['cfisc'] = ''
    temp['passs'] = ''
    result = LoginUser(temp)
    data['login'] = result

  return render(request,'login.html',data)


def RichiestaAggiornamentoPassword(request):
  '''
  la form che segue, serve per aggiornare la propria password/pin
  '''
  request.session.flush()
  request.session.set_expiry(3600)

  data = dict()
  data['HeaderTitle'] = getConfig('HeaderTitle')
  uuidres = str(uuid.uuid4())
  print('uuid',uuidres)

  if request.method == 'POST':
    informazione = PasswordUpdate(request.POST)
    if informazione.is_valid():
      # invio mail di comunicazione
      # con pin annesso.
      informazione = informazione.cleaned_data.get('informazione')
      print('informazione',informazione)

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

      if a:
        print('informazione',a,d)

      ### comunicazioni ###
      sm = ServizioMail(debug=True)
      comunicazione = None
      try:
        comunicazione = Comunicazione.objects.get(pk=4)
      except Comunicazione.DoesNotExist as dne:
        print("Record comunicazione inesistente",dne)

      if comunicazione: 
        sm.set_mailfrom=comunicazione.mittente
        sm.add_to(a.mail)

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

        sm_data = dict()
        utente=dict() #adattamento campo utente
        print(reverse('login:ResetPassword',args=[uuidres]))

        utente['link'] = reverse('utente:updatePasswordFromLogin',args=[uuidres])
        utente['nome'] = a.nome
        utente['mail'] = a.mail
        utente['sito'] = getConfig('DefaultSite')
        utente['titolo'] = getConfig('HeaderTitle')
        sm_data['utente'] = utente
        sm.set_data(sm_data)
        sm.send()
        ### comunicazioni ###

        ### salva uuid
        a.uuid = uuidres
        a.lostpin = True
        a.save()

      return render(request,'updatePasswordEnd.html',{})
    else:
      data['informazione'] = PasswordUpdate(request.POST)
  else:
    data['informazione'] = PasswordUpdate({'informazione':''})

  return render(request,'updatePassword.html',data)

def ResetPassword(request,uuid=None):
  print('uuid',uuid)
  return HttpResponseRedirect(reverse("login:start"))

