from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from django.urls import reverse
from configurazione.views import *

from .models import *

# Create your views here.

def getSecurityLevelAll(enabled=1):
  '''
  ritorna l'elenco dei livelli di sicurezza ordinati per nome
  parms:
    enabled (default 1)
    di default restituisce l'intero elenco solo se le voci sono abituate
  '''

  return SecurityLevel.objects.all().filter(enabled=enabled).order_by('nome')

def getSecurityLevel(id,enabled=1,debug=0):
  '''
  ritorna il livello di sicurezza indicato, in forma d'oggetto.
  '''

  #primo step: verifica l'intestazione, se e' attiva
  try:
    securitylevel = SecurityLevel.objects.get(pk=id)
  except SecurityLevel.DoesNotExist as dne:
    if debug:
      print('il record {} non esiste o non e\' attivo'.format(id))
    #nel caso non fosse possibile, viene preso il valore di default
    securitylevel = SecurityLevel.objects.get(pk=getConfigurazione('default-level'))
  if securitylevel.enabled != enabled:
    securitylevel = SecurityLevel.objects.get(pk=getConfigurazione('default-level'))
  return securitylevel

def getSecurityRow(id,enabled=1,debug=0):
  '''
  securityrow contiene l'associazione tra i livelli di sicurezza e le opzioni.
  per ottenerlo gli passiamo l'id del securitylevel.
  '''
  #verifica che l'id sia valido, semplicemente richiamando getSecurityLevel
  id = getSecurityLevel(id,enabled)

  orderbylist=['securityoptions__comando','ordine']
  try:
    securityrow = SecurityRow.objects.filter(securitylevel=id).filter(enabled=enabled).order_by(*orderbylist)
  except SecurityRow.DoesNotExist as dne:
    print('non ci sono righe associate all\'id {}'.format(id))
    return SecurityRow()
  #securityrow contiene l'elenco delle Options estratte.
  if debug:
    print(securityrow)
  return securityrow

def getSecurityList(securityrow,debug=0):
  securitylist=[]
  for sr in securityrow:
    srtemp = getSecurityOptions(sr.securityoptions_id)
    if debug:
      print(srtemp.acronimo)
    securitylist.append(srtemp.acronimo)
    print("SecurityList: ",securitylist)
  return securitylist

def getSecurityOptions(id):
  '''
  ritorna il contenuto della security options a cui si fa riferimento
  '''

  #! nota: sarebbe da capire se puo' tornare il record in caso di false enabled in row o level

  try:
    resultoptions = SecurityOptions.objects.get(pk=id)
  except SecurityOptions.DoesNotExist as dne:
    print("non ci sono elementi di SecurityOptions da tornare con l'id {}".format(id))
    return None
  return resultoptions

def getSecurityLevelByUser(userId,enabled=1):
  '''
  ottiene il livello di sicurezza passando direttamente l'id utente

  la sequenza e' veloce:
  cerca l'utente indicato
  verifica che abbia un level valido altrimenti ritorna il default
  estrare l'elenco delle options abilitate
  '''

  try:
    u = User.objects.get(pk=userId)
    #l'utente esiste ed e' valido
  except User.DoesNotExist as dnf:
    #l'utente non esiste
    return HttpResponseRedirect(reverse('login:welcome',args={}))

  try:
    securitylevel = getSecurityLevel(u.securitylevel)
  except SecurityLevel.DoesNotExist as dne:
    print(f'attenzione, security level non impostata per utente {u.id}')
    v = getConfigurazione('default-level')
    securitylevel = getSecurityLevel(v)
  return securitylevel

def getSecurityOptionsByUser(UserId):
  '''
  ottiene l'elenco delle righe di securityrow
  '''

  securitylevel = getSecurityLevelByUser(UserId,enabled=1)
  securityoptions = getSecurityOptions(securitylevel.id)
  return securityoptions

def _checkSessionValue(request,key,debug=0):
  if debug:
    print("session:",key,request.session.get(key))
  try:
    tmp = request.session.get(key)
  except:
    request.flush()
    return HttpResponseRedirect(reverse('Login:login'))
  return tmp

def getSessionParms(request,debug=0):
  '''
  estrae i valori dalla sessione necessari per operare
  '''

  lista=[
  '_userauth_',
  '_user2edit_',
  '_alias2edit_',
  '_domain2edit_',
  '_domainservice2edit_',
  '_contatto2edit_',
  '_registrar2edit_',
  '_liste2edit_',
  '_listeaccount2edit_',
  '_ftp2edit_',
  '_sqlserver2edit_',
  '_from_',
  '_domain_order',
  '_sqldatabase2edit_',
  '_note2edit_',
  '_filtro2edit_',
  '_causale2edit_',
  '_mqtt2edit_',
  '_webserver2edit_',
  '_web2edit',
  '_proxyserver2edit_',
  'proxy2edit_',
  '_spam2edit_',

  ]

  v2r = dict()

  for i in lista:
    v2r[i] = _checkSessionValue(request,i)

  if debug:
    print('v2r from session:',v2r)

  '''
  nota effettua subito la verifica dell'utente, cosi' salta al volo al login nel caso il check fosse non valido
  '''

  if not '_userauth_' in v2r:
    redirect(reverse('Login:login'))

  try:
     User.objects.get(pk=v2r['_userauth_'])
  except User.DoesNotExist as DNE:
    print("errore, utente autorizzato non esistente")
    print(DNE)
    redirect(reverse('Login:login'))

  print('_userauth_',v2r['_userauth_'])
  return v2r

def ManageSecurityLevelList(request):
  session = getSessionParms(request)
  userauth = session['_userauth_']
  utenteautorizzato = User.objects.get(pk=userauth)

  securitylevel = SecurityLevel.objects.all().order_by('nome')

  value = {}
  value['utenteautorizzato']=utenteautorizzato
  value['sicurezza']=securitylevel
  value['navbar'] = True

  return render(request,'securitylevellist.html',value)

def ManageSecurityRowList(request,levelId):
  session = getSessionParms(request)
  userauth = session['_userauth_']
  utenteautorizzato = User.objects.get(pk=userauth)

  securityrow = SecurityRow.objects.all().filter(securitylevel=levelId).order_by('id')

  value = {}
  value['utenteautorizzato'] = utenteautorizzato
  value['righe'] = securityrow
  value['navbar'] = True


  return render(request,'securityrowlist.html',value)


#decorator: anziche' gestire tutta la sessione di sicurezza dentro la funzione,
# magari possiamo fare la stessa cosa con un decoratore.

def securitywrap(function):
  def wrapper(*args,**kwargs):
    print('...wrapping')
    print(args)
    print(kwargs)
    return function(*args,**kwargs)
  return wrapper


'''
from supporto import managepassword
from sicurezza.views import *
from logger.views import *
from comunicazioni.views import *
from datetime import date,datetime
from configurazione.views import *

def UserList(request):

  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Utenti:UserList"

  print(next)
  if not user2edit:
    user2edit = userauth

  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)

  userlist = User.objects.filter(domain=domain2edit).order_by('mail')

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['userlist'] = userlist
  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)
  value['CANWRITE']=True #per il momento, questo flag serve a capire se e' un record nuovo
'''
