from django.shortcuts import render,redirect
from time import time
from django.http import HttpResponseRedirect
from django.urls import reverse

from .models import *
from supporto.views import *
from sicurezza.views import *
#from coda.views import *

import json
from mqtt import views as m
from mqtt.views import mqtt

# Create your views here.
def CancellazioneLista(request):
  session = getSessionParms(request)
  userauth = session['_userauth_']
  alias2edit = session['_alias2edit_']
  domain2edit = session['_domain2edit_']


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

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

  mq = mqtt()
  mq.build('topic','Messaggio')
  mq.build('stampa',False)
  tmp = dict()
  tmp['utente'] = ''.join((utenteautorizzato.mail,'@',utenteautorizzato.domain.nome))
  tmp['remote'] = request.META.get('REMOTE_ADDRESS')
  tmp['forwarder'] = request.META.get('HTTP_X_FORWARDER_FOR','')
  tmp['host'] = request.META.get('REMOTE_ADDR','')
  mq.build('data',tmp)
  mq.pubblica()
  tmp=None
  mq=None

  #raduna i vari elementi da cancellare
  dominidacancellare = Domini.objects.filter(tobedeleted=1)
  utentidacancellare = User.objects.filter(tobedeleted=1) | User.objects.filter(domain__tobedeleted=1)
  aliasdacancellare = Alias.objects.filter(tobedeleted=1) | Alias.objects.filter(domain__tobedeleted=1)
  sqldatabasedacancellare = SqlDatabase.objects.filter(tobedeleted=1) | SqlDatabase.objects.filter(dominio__tobedeleted=1)
  ftpuserdacancellare = FTPUser.objects.filter(tobedeleted=1) | FTPUser.objects.filter(dominio__tobedeleted=1)

  #non direttamente eliminabili
  #DomainAssociatedContact
  #DomainAssociatedService 
  #history

  print('dominidacancellare',len(dominidacancellare))
  print('utentidacancellare',len(utentidacancellare))
  print('aliasdacancellare',len(aliasdacancellare))
  print('sqldatabasedacancellare',len(sqldatabasedacancellare))
  print('ftpuserdacancellare',len(ftpuserdacancellare))

  value['dominidacancellare'] = dominidacancellare
  value['utentidacancellare'] = utentidacancellare
  value['aliasdacancellare'] = aliasdacancellare
  value['sqldatabasedacancellare'] = sqldatabasedacancellare
  value['ftpuserdacancellare'] = ftpuserdacancellare

  if 'cancellazioneutentetutti' in request.POST:
    c = m.start()
    m.publish(c,"Messaggi","Cancellazione Elementi Vecchi")

    external = list()
    for utente in utentidacancellare:
      parms = "{s}/{d}/{u}".format(**{'s':utente.domain.mail_server.server.strip(),'d':utente.domain.nome.strip(),'u':utente.mail.strip()})
      print("utente: rm -rvf",parms)
      q = {}
      q['op'] = 'deleteMail'
      q['sv'] = utente.domain.mail_server.server.strip()
      q['do'] = utente.domain.nome.strip()
      q['us'] = utente.mail.strip()

      if utente.domain.mail_server.nome:
        mq = mqtt()
        mq.build('topic','mail')
        mq.build('richiesta',''.join(('cancellazione/mail/',utente.domain.mail_server.nome.strip())))
        tmp = dict()
        tmp['dominio']=utente.domain.nome
        tmp['mail']=utente.mail
        tmp['posizione']='/'+utente.domain.mail_server.nome.strip()
        tmp['server']=utente.domain.mail_server.nome.strip()
        tmp['estensione']='_old_'
        print("tmp",tmp)
        mq.build('data',[tmp,])
        mq.pubblica()
        tmp=None
        mq=None

        topic = 'mail/'+utente.domain.mail_server.nome.strip()
        print("topic",topic)
        m.publish(c,topic,json.dumps(q))
  
        try:
          if utente.sql_remote.ip and not utente.sql_remote.ip in external:
            external.append(utente.sql_remote.ip)
        except SqlRemote.DoesNotExist as dne:
          print("dne",dne)
        utente.delete()
       

      else:
        print("Nome Server Non Definito")

      print('external',external)
      if len(external):
        mq = mqtt()
        mq.build('topic','richiesta/mail')
        mq.build('richiesta','update_remote')
        mq.build('data',external)
        mq.pubblica()
        mq=None

      value['utentidacancellare'] = []

  if 'cancellazionealiastutti' in request.POST:
    for alias in aliasdacancellare:
        print('Alias:',alias.id)
        alias.delete()
    value['aliasdacancellare'] = []

  if 'cancellazionedatabasetutti' in request.POST:
    pass

  if 'cancellazioneftptutti' in request.POST:
    pass

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


def CancellazioneDominio(request,DominioId=None):

  c = m.start()
  m.publish(c,"Messaggi","Cancellazione Elementi Vecchi")

  if not DominioId:
    return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']

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

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

  dominio = Domini.objects.get(pk=DominioId)
  value['dominio']=dominio
    
  if request.method=="POST":

    if request.session['ReturnButton'] in request.POST:
      del request.session['ConfirmButton']
      del request.session['ReturnButton']
      return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

    if request.session['ConfirmButton'] in request.POST:
      #inizia cancellazione di tutto

      history = History.objects.filter(domain=dominio.id)
      print('numero di record History rimossi:',history)
      value['history'] = history
      for i in history: i.delete()

      dominiserviziassegnati = DominiServiziAssegnati.objects.filter(dominio = dominio.id)
      print('servizi assegnati',dominiserviziassegnati)
      value['dominiserviziassegnati'] = dominiserviziassegnati
      for i in dominiserviziassegnati: i.delete()

      '''
      questa parte la possiamo togliere in quanto andando a rimuovere il dominio, possiamo procedere a rinominare l'intera cartella, senza passarsi le mail

      utenti = User.objects.filter(domain=dominio)
      external = list()
      print('utenti da cancellare',len(utenti))
      for utente in utenti: 
        if utente.domain.mail_server.nome:
          mq = mqtt()
          mq.build('topic','mail')
          mq.build('richiesta',''.join(('cancellazione/mail/',utente.domain.mail_server.nome.strip())))
          tmp = dict()
          tmp['dominio']=dominio.nome
          tmp['mail']=utente.mail
          tmp['posizione']='mail/'+utente.domain.mail_server.nome.strip()
          tmp['server']=utente.domain.mail_server.nome.strip()
          tmp['estensione']='._old_'
          mq.build('data',tmp)
          mq.pubblica()
          tmp=None
          mq=None
          try:
            if utente.sql_remote.ip:
              if not utente.sql_remote.ip in external:
                external.append(utente.sql_remote.ip)
            else: print("mqtt: sql_remote e' impostato a 0")
          except User.sql_remote.RelatedObjectDoesNotExist as rdne:
            print(rdne)
          utente.delete()

        print('external',external)

        if len(external):
          mq = mqtt()
          mq.build('topic','richiesta/mail')
          mq.build('richiesta','update_remote')
          mq.build('data',external)
          mq.pubblica()
          mq=None
      '''
      print('dominio da rinominare direttamente',dominio.nome)
      print('nome mail server dominio',dominio.mail_server.nome)
      print('posizione fisica',dominio.mail_server.fisico)

      if dominio.mail_server.enabled and dominio.mail_server.fisico != "/dev/null":
        mq = mqtt()
        mq.build('topic','mail')
        mq.build('richiesta','cancellazione/dominio')
        mq.build('stampa',True)
        mq.build('demo',False)
        tmp = dict()
        tmp['dominio'] = dominio.nome
        tmp['posizione'] = dominio.mail_server.fisico
        tmp['estensione'] = '._old_'
        mq.build('data',tmp)
        mq.pubblica()
        tmp=None
        mq=None

      alias = Alias.objects.filter(domain = dominio.id)
      print("Alias ",alias)
      value['alias'] = alias
      for a in alias:
        a.delete()

      ftpuser = FTPUser.objects.filter(dominio = dominio.id)
      print("Utenti FTP ",ftpuser)
      value['ftpuser'] = ftpuser
      for i in ftpuser:
        i.delete()

      sqldatabase = SqlDatabase.objects.filter(dominio = dominio.id)
      print("database SQL ",sqldatabase)
      value['sqldatabase'] = sqldatabase
      for i in sqldatabase:
        q = {}
        q['op'] = 'delete'
        q['db']=i.nome
        q['us']=i.username
        q['ho']=i.server.server
        m.publish(c,"Database","{}".format(json.dumps(q)))
        i.delete()
 
       #rimozione della cartella
      parms = "{s}/{d}".format(**{'s':dominio.mail_server.server.strip(),'d':dominio.nome.strip()})
      print('rimuovere: ',parms)
      q = {}
      q['op'] = 'deleteDomain'
      q['sv'] = dominio.mail_server.server.strip()
      q['do'] = dominio.nome.strip()
      # per topic si intende il server che sta gestendo lo storage fisico
      topic = 'mail/'+dominio.mail_server.server.strip()
      m.publish(c,topic,json.dumps(q))

      print('Dominio in cancellazione: ',dominio.id,dominio.nome)
      dominio.delete()

      del request.session['ConfirmButton'] 
      del request.session['ReturnButton'] 
      request.session['ReturnButton'] = str(time())
      value['ReturnButton'] = request.session['ReturnButton']

      return redirect(reverse('Cancellazione:CancellazioneRisultato')) 

  request.session['ConfirmButton'] = str(time())
  request.session['ReturnButton'] = str(time())
  value['ConfirmButton'] = request.session['ConfirmButton']
  value['ReturnButton'] = request.session['ReturnButton']

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

def CancellazioneUtente(request,UtenteId=None):

  c = m.start()
  m.publish(c,"Messaggi","Cancellazione Elementi Vecchi")

  if not UtenteId:
    return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']

  utenteautorizzato = User.objects.get(pk=userauth)

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

  utente = User.objects.get(pk=UtenteId)
  value['utente'] = utente

  if request.method=="POST":

    if request.session['ReturnButton'] in request.POST:
      try:
        del request.session['ConfirmButton']
        del request.session['ReturnButton']
      except KeyError as ke:
        pass
      return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

    if request.session['ConfirmButton'] in request.POST:
      #inizia cancellazione di tutto

      parms = "{s}/{d}/{u}".format(**{'s':utente.domain.mail_server.server.strip(),'d':utente.domain.nome.strip(),'u':utente.mail.strip()})
      print("utente: rm -rvf",parms)
      #etCoda('DELETEMAIL',parms)
      q = {}
      q['op'] = 'deleteMail'
      q['sv'] = utente.domain.mail_server.server.strip()
      q['do'] = utente.domain.nome.strip()
      q['us'] = utente.mail.strip()
      q['cm'] = "xx rm -rvf /home/server/dominio/utente"

      if utente.domain.mail_server.nome:
        topic = 'mail/'+utente.domain.mail_server.nome.strip()
        print("topic",topic)

        mq = mqtt()
        mq.build('topic',''.join(('mail/',utente.domain.mail_server.nome.strip())))
        mq.build('richiesta','cancellazione/mail')
        mq.build('stampa',True)
        tmp = dict()
        tmp['dominio']=utente.domain.nome.strip()
        tmp['mail']=utente.mail.strip()
        tmp['posizione']=utente.domain.mail_server.nome.strip()
        tmp['server']=utente.domain.mail_server.nome.strip()
        tmp['estensione']='._old_'
        mq.build('data',[tmp,])
        mq.pubblica()
        tmp=None
        mq=None

        external = list()

        try:
          if utente.sql_remote.ip in external:
            external.append(utente.sql_remote.ip)
        except SqlRemote.DoesNotExist as dne:
           print("campo remoto non esistente")

        if len(external):
          mq = mqtt()
          mq.build('topic','richiesta/mail')
          mq.build('richiesta','update_remote')
          mq.build('data',external)
          mq.pubblica()
          mq=None

        utente.delete()
      else:
        print("Nome Server Non Definito")
      try:
        del request.session['ConfirmButton']
      except KeyError as ke:
        pass

      del request.session['ReturnButton']
      return redirect(reverse('Cancellazione:CancellazioneRisultato'))

  request.session['ConfirmButton'] = str(time())
  request.session['ReturnButton'] = str(time())

  value['ConfirmButton'] = request.session['ConfirmButton']
  value['ReturnButton'] = request.session['ReturnButton']
  
  return render(request,'CancellazioneUtente.html',value)

def CancellazioneAlias(request,AliasId=None):
      
  if not AliasId:
    return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))
      
  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']
      
  utenteautorizzato = User.objects.get(pk=userauth)
  
  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['navbar'] = True

  alias = Alias.objects.get(pk=AliasId)
  value['alias']=alias

  if request.method=="POST":

    if request.session['ReturnButton'] in request.POST:
      del request.session['ConfirmButton']
      del request.session['ReturnButton']
      return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

    if request.session['ConfirmButton'] in request.POST:
      #inizia cancellazione di tutto

      alias.delete()

      try:
        del request.session['ConfirmButton']
      except KeyError as ke:
        pass

      request.session['ReturnButton'] = str(time())
      value['ReturnButton'] = request.session['ReturnButton']
      return redirect(reverse('Cancellazione:CancellazioneRisultato'))

  request.session['ConfirmButton'] = str(time())
  request.session['ReturnButton'] = str(time())

  value['ConfirmButton'] = request.session['ConfirmButton']
  value['ReturnButton'] = request.session['ReturnButton']

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

def CancellazioneDatabase(request,DatabaseId=None):
  if not DatabaseId:
    return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))
      
  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']
      
  utenteautorizzato = User.objects.get(pk=userauth)
  
  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['navbar'] = True

  database = SqlDatabase.objects.get(pk=DatabaseId)
  value['database']=database

  if request.method=="POST":

    if request.session['ReturnButton'] in request.POST:
      del request.session['ConfirmButton']
      del request.session['ReturnButton']
      return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

    if request.session['ConfirmButton'] in request.POST:
      #inizia cancellazione di tutto

      print('sql:',database.nome)

      data = dict()
      data['op']='enable'
      data['db']=database.nome
      data['us']=database.username
      data['pw']=database.password
      data['ho']=database.server.server

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','delete_database')
      mq.build('data',data)
      mq.pubblica()
      mq=None

      database.delete()

      try:
        del request.session['ConfirmButton']
      except KeyError as ke:
        pass

      request.session['ReturnButton'] = str(time())
      value['ReturnButton'] = request.session['ReturnButton']
      return redirect(reverse('Cancellazione:CancellazioneRisultato'))

  request.session['ConfirmButton'] = str(time())
  request.session['ReturnButton'] = str(time())

  value['ConfirmButton'] = request.session['ConfirmButton']
  value['ReturnButton'] = request.session['ReturnButton']

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

def CancellazioneRisultato(request):
 
  session = getSessionParms(request)
  userauth = session['_userauth_']
  user2edit = session['_user2edit_']
  domain2edit = session['_domain2edit_']
  
  utenteautorizzato = User.objects.get(pk=userauth)
    
  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['navbar'] = True
  
  if request.method=="POST":
    if request.session['ReturnButton'] in request.POST:
      try:
        del request.session['ReturnButton']
      except KeyError as ke:
        pass
      return HttpResponseRedirect(reverse('Cancellazione:CancellazioneLista'))

      #request.session['ReturnButton'] = str(time())
      #value['ReturnButton'] = request.session['ReturnButton']

  request.session['ReturnButton'] = str(time())
  value['ReturnButton'] = request.session['ReturnButton']
  print("ReturnButtonReturnButton",value)

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

