from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
import django.db.utils

from .models import *
from .forms import *

from supporto import managepassword
from sicurezza.views import *
from logger.views import *
from comunicazioni.views import *
from datetime import date
from configurazione.views import *
import json
from mqtt import views as m
from mqtt.views import mqtt  # nuovo sistema mqtt che va a sostiture 'm'

# Create your views here.
def listeList(request):
  ''' 
  listing delle liste
  '''

  session = getSessionParms(request)
  userauth = session['_userauth_']
  liste2edit = session['_liste2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Liste:ListeList"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)

  listelist = Liste.objects.filter(dominio=domain2edit).order_by('nome')

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['listelist'] = listelist
  value['dominio'] = dominio
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)

  if request.method=="POST":
    if "Nuova Lista" in request.POST:
      print('nuova lista')
      request.session['_liste2edit_'] = 0
      return  HttpResponseRedirect(reverse('Liste:ListeEdit',args={}))

    if "edit" in request.POST:
      print('id da editare',request.POST['edit'])
      request.session['_listeaccount2edit_'] = request.POST['edit']
      return HttpResponseRedirect(reverse('Liste:ListeAccount',args={}))

    if "disable" in request.POST:
      print('id da disattivare',request.POST['disable'])
      idpost = request.POST['disable']

      u = Liste.objects.get(pk=idpost)
      print('id',u.mail.nome)
      u.enabled = False
      #t = date.today()
      #u.account_date_disabled=t.strftime("%Y-%m-%d")
      u.save()

    if "enable" in request.POST:
      print('id da attivare',request.POST['enable'])
      idpost = request.POST['enable']
      u = Liste.objects.get(pk=idpost)
      print(f'lista: {u.nome}')
      u.enabled=True
      #u.account_date_disabled=None
      u.save()
  else:
    print('post non validato',request.POST)

  return render(request,"ListeList.html",value)

def listeEdit(request):
  '''
  edit e add di una nuova lista
  '''
  
  session = getSessionParms(request)
  userauth = session['_userauth_']
  liste2edit = session['_liste2edit_']
  #listeaccount2edit = session['_listeaccount2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Liste:ListeListAccount"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)
  dominioutenti = User.objects.filter(domain=dominio.id).filter(enabled=1)

  if not liste2edit or liste2edit==0:
    liste = Liste()
  else:
    liste = Liste.objects.get(pk=liste2edit)

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['listelist'] = liste.nome
  #value['listelistaccount'] = listelistAccount
  value['dominio'] = dominio
  value['dominioutenti'] = dominioutenti
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)
  securitylist = getSecurityList(securityrow)
  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
  value['securitylist'] = securitylist

  lal = ListAddListForm()
  value['lal'] = lal

  return render(request,"Listeedit.html",lal)


def listeAccount(request):
  '''
  liste degli utenti per lista
  '''

  session = getSessionParms(request)
  userauth = session['_userauth_']
  liste2edit = session['_liste2edit_']
  listeaccount2edit = session['_listeaccount2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Liste:ListeListAccount"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)
  dominioutenti = User.objects.filter(domain=dominio.id).filter(enabled=1)
  liste = Liste.objects.get(pk=listeaccount2edit)
  listelistAccount = ListeAccount.objects.filter(liste_id=listeaccount2edit).order_by('mail__mail')
  print(f'numero di record trovati: {len(listelistAccount)}')

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['listelist'] = liste.nome
  value['listelistaccount'] = listelistAccount
  value['dominio'] = dominio
  value['dominioutenti'] = dominioutenti
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)
  securitylist = getSecurityList(securityrow)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
  value['securitylist'] = securitylist
  
  # questo mqtt e' quello nuovo
  mq = mqtt()
  mq.build('topic','messaggio')
  mq.build('richiesta','MailingList')
  mq.build('stampa',True)
  tmp = dict()
  tmp['utenteautorizzato'] = "".join((utenteautorizzato.mail,'@',utenteautorizzato.domain.nome))
  mq.build('data',tmp)
  mq.pubblica()
  tmp=None

  # mqtt vecchio stampo
  c = m.start()
  m.publish(c,"Messaggio/Ml","Accesso alla mailing list di {}".format(utenteautorizzato.nome))

  if request.method=="POST":
    print(request.POST)
    if "delete" in request.POST:
      print('id da cancellaree',request.POST['delete'])
      idpost = request.POST['delete']
      u = ListeAccount.objects.get(pk=idpost)
      u.delete()
      #u.enainprogress=0
      #u.disinprogress=0
      #u.delinprogress=1
      #u.addinprogress=0
      #t = date.today()
      #u.save()
      q={}
      q['op']='unsub'
      if len(u.esterno):
        q['us'] =  u.esterno
      else:
        q['us']="".join((u.mail.mail,"@",u.liste.dominio.nome))
      q['us'] = q['us'].lower()
      q['do']=u.liste.dominio.nome
      q['ml']=u.liste.nome
      q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
      m.publish(c,"Richiesta/Ml",json.dumps(q))

    if "disable" in request.POST:
      print('id da disattivare',request.POST['disable'])
      idpost = request.POST['disable']
      print('ippost disable',idpost)
      u = ListeAccount.objects.get(pk=idpost)
      print(u.enabled)
      u.enabled = False
      #u.disinprogress=
      #.enainprogress=0
      #.delinprogress=0
      #u.addinprogress=0
      t = date.today()
      u.save()
      q={}
      q['op']='unsub'
      if len(u.esterno):
        q['us'] =  u.esterno
      else:
        q['us']="".join((u.mail.mail,"@",u.liste.dominio.nome))
      q['us'] = q['us'].lower()
      q['do']=u.liste.dominio.nome
      q['ml']=u.liste.nome
      q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
      m.publish(c,"Richiesta/Ml",json.dumps(q))

    if "enable" in request.POST:
      print('id da attivare',request.POST['enable'])
      idpost = request.POST['enable']
      print('idpost enable',idpost)
      u = ListeAccount.objects.get(pk=idpost)
      u.enabled=True
      #u.disinprogress=0
      #u.enainprogress=1
      #u.delinprogress=0
      #u.addinprogress=0
      u.save()
      q={}
      q['op']='sub'
      if len(u.esterno):
        q['us'] =  u.esterno
      else:
        q['us']="".join((u.mail.mail,"@",u.liste.dominio.nome))
      q['us']=q['us'].lower()
      q['do']=u.liste.dominio.nome
      q['ml']=u.liste.nome
      q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
      m.publish(c,"Richiesta/Ml",json.dumps(q))

    if 'verifica' in request.POST:
      # verifica che l'account sia effettivamente registrato nella mailing list.
      print('id da verificare',request.POST['verifica'])
      idpost = request.POST['verifica']
      u = ListeAccount.objects.get(pk=idpost)
      q=dict()
      q['op']='check'
      if len(u.esterno):
        q['us'] =  u.esterno
      else:
        q['us']="".join((u.mail.mail,"@",u.liste.dominio.nome))
      q['us']=q['us'].lower()
      q['do']=u.liste.dominio.nome
      q['ml']=u.liste.nome
      q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
      q['au']=q['au'].lower()
      m.publish(c,"Richiesta/Ml",json.dumps(q))

    if 'verificaTutti' in request.POST:
      print('verificaTutti')
      # verifica che l'account sia effettivamente registrato nella mailing list.
      q=dict()
      q['op']='checkAll'
      q['do']=liste.dominio.nome
      q['ml']=liste.nome
      q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
      q['au']=q['au'].lower()
      m.publish(c,"Richiesta/Ml",json.dumps(q))

    if 'Ritorno' in request.POST:
      return  HttpResponseRedirect(reverse('Liste:ListeList',args={}))

    if 'Registra' in request.POST:
    # verificati i tasti, si passa all'inserimento del record.
    # abbiamo o la mail scelta dall'elenco, o la mail esterna.
      f = ListAddAccountForm(request.POST)
      f.update(dominio.id)

      if f.is_valid():
        u = ListeAccount()
        u.liste = liste
        u.mail_id = f.cleaned_data.get('mail_interne')
        u.esterno = f.cleaned_data.get('mail_esterne')
        u.enable=True
        #u.disinprogress=0
        #u.enainprogress=0
        #u.delinprogress=0
        #u.addinprogress=1
        try:
          if int(u.mail_id) > 0 or (len(u.esterno.split("@")) == 2):
            u.save()
        except django.db.utils.IntegrityError as ie:
          print(ie)

        q={}
        q['op']='sub'
        print("u.mail_id",u.mail_id)
        if int(u.mail_id) > 0:
          q['us']="".join((u.mail.mail,"@",u.liste.dominio.nome))
        else:
          if len(u.esterno) > 0:
            splitmail = u.esterno.split('@')
            if len(splitmail) == 2:
              q['us'] = "".join((splitmail[0],"@",splitmail[1]))
        q['do']=u.liste.dominio.nome
        q['ml']=u.liste.nome
        q['au']="".join((utenteautorizzato.mail,"@",utenteautorizzato.domain.nome))
        if 'us' in q:
          m.publish(c,"Richiesta/Ml",json.dumps(q))
      else:
        print(f.errors)

  laaf = ListAddAccountForm()
  laaf.update(dominio.id)
  value['laaf'] = laaf
  print(type(laaf))
  value['listelistaccount'] = ListeAccount.objects.filter(liste_id=listeaccount2edit).order_by('id')

  return render(request,"ListeListAccount.html",value)


