from django.shortcuts import render
from .models import *

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

from .models import *
from .forms import *

from config.views import *
from .managefile import *
from att.views import *

from datetime import datetime,timedelta
from comunicazione.views import ServizioMail

def welcome(request,utente=None):
  uu = utente
  '''
  punto di ingresso.
  vengono mostrati tutti i documenti presenti
  '''

  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 not 'AziendaId' in request.session:
    print('manca azienda')
    return HttpResponseRedirect(reverse("login:start"))

  azienda = None
  data['AziendaId'] = request.session['AziendaId']
  AziendaId = request.session['AziendaId']
  print('AziendaId',AziendaId)
  azienda = Azienda.objects.get(pk=AziendaId)
  data['azienda'] = azienda

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

  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("sede non esistente")
    data['sede'] = sede
  
  if 'UserId' in request.session:
    data['UserId'] = request.session['UserId']

  data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])
  data['utenti'] = data['azienda'].utente_set.all()

  #filtro:
  # selezionare tutti gli utenti per AziendaId
  admin = Amministratore.objects.get(pk=data['AdminId'])
  data['admin'] = admin 

  azienda = Azienda.objects.get(pk=data['AziendaId'])
  data['azienda'] = azienda

  utenti = Utente.objects.filter(azienda = azienda)  
  data['utenti'] = utenti

  eol = getConfig('DocEol')
  data['eol'] = eol

  ElencoDocumenti = list()
  if utente: #visualizza i documenti per l'utente
    ElencoDocumenti = Documento.objects.filter(utente=utente).order_by("utente__nome","documento") 
  elif sede:
    tmpUtenti = sede.utente_set.all()
    for t in tmpUtenti:
      d = t.documento_set.all()
      for id in d:
        ElencoDocumenti.append(id)
  else:
    tmpUtenti = azienda.utente_set.all()
    for t in tmpUtenti:
      d = t.documento_set.all()
      for id in d:
        ElencoDocumenti.append(id)

  data['ElencoDocumenti'] = ElencoDocumenti

  if request.method == 'POST':

    if 'indietro' in request.POST:
      print("AziendaId",request.session['AziendaId'])
      print("AdminId",request.session['AdminId'])
      return HttpResponseRedirect(reverse("azienda:welcome"))

    if 'ScaricaSelezionati' in request.POST:
      print('Premuto tasto Scarica Selezionati')
      print('request',request.POST)
      if 'select' in request.POST:
        SelectResponse = formMultipleCheckBox(request.POST)
        SelectResponse.c(data['ElencoDocumenti'])
        print("SelectResponse",SelectResponse)

        if SelectResponse.is_valid():
          select = SelectResponse.cleaned_data.get('select')
          print('select',select,type(select))
          (pathzipfile,filePreparato) = PrepareZipFile(select)
          # scarica il file
          response = None
          with open(os.path.join(pathzipfile,filePreparato),'rb') as f:
            response =  HttpResponse(f.read(),content_type='application/zip')
            response['Content-Disposition'] = 'attachment; filename={}'.format(filePreparato)
          os.unlink(os.path.join(pathzipfile,filePreparato))
          return response

    if 'DeleteOldDocuments' in request.POST:
      print('Richiesta di eliminazione vecchi documenti')
      dods = DeleteOldDocuments(request.POST)
      if dods.is_valid():
        print('request',request.POST)
        print('dods',dods.cleaned_data)
        print(request.POST['limite'])
        print('effettuata scelta di cancellazione vecchi documenti')
        # costuire una lista dei documenti più vecchi
        limite = int(request.POST['limite'])
        print('limite',limite)
        d = datetime.now()
        r = d - timedelta(days=limite)
        print(r)
        oldDocs = Documento.objects.filter(azienda=azienda)
        oldDocs1 = oldDocs.filter(dataupload__lt=r)
        print('lista documenti',len(oldDocs1))
        for i in oldDocs1:
          print('documento',i.documento)
          delete_file(i)
          i.delete()

    if 'DeleteDocument' in request.POST and request.POST.get('DeleteDocument'):
      print('Richiesta cancellazione Documento',request.POST)
      documento = request.POST['DeleteDocument']  # perche' lo considera una lista e non un singolo valore?
      print('richiesta cancellazione documento:',documento)
      try:
        d = Documento.objects.get(pk=documento)
        delete_file(d)  #rimozione fisica del documento 
        d.delete()
      except Documento.DoesNotExist as dne:
        print('il documento non esiste')

    filecaricati = AdminUpload(request.POST,request.FILES)

    if filecaricati.is_valid():
      pertutti = filecaricati.cleaned_data.get('pertutti')
      print('stato -pertutti-',pertutti," ",filecaricati.cleaned_data.get('pertutti'))
      #pertutti: il documento viene messo a disposizione a tutti gli utenti, non rientra nel filtro x utente, ma solo nel filtro x azienda
     
      print('record filecaricati validi')

      comunicazione = filecaricati.cleaned_data.get('comunicazione')
      if 'allegati' in filecaricati.cleaned_data and filecaricati.cleaned_data.get('allegati'):
        print('presenti documenti da allegare')
        listadocumenti = filecaricati.cleaned_data['allegati']
        print(listadocumenti)
        print(type(azienda))
        print(azienda.id)
        if not utente:
          listaok,listanotok = save_and_load_file_multiple(listadocumenti,request,utenti,azienda,sede,filecaricati.cleaned_data['descrizione'],admin.nome,pertutti)
          data['listaok'] = listaok
          data['listanotok'] = listanotok
        else:
          u = Utente.objects.get(pk=uu)
          listaok,listanotok = save_and_load_file_single(listadocumenti,request,u,data['azienda'],data['sede'],filecaricati.cleaned_data['descrizione'],data['admin'])
        print('stato caricamenti',listaok,listanotok)
        data['listaok'] = listaok
        data['listnotok'] = listaok

        print('listaok',listaok)
        print('listanotok',listanotok)

      if comunicazione:
        ### comunicazioni ###
        sm = ServizioMail(debug=True)

        try:
          comunicazione = Comunicazione.objects.get(pk=7)
        except Comunicazione.DoesNotExist as dne:
          print("Record comunicazione inesistente",dne)
        u = Utente.objects.get(pk=uu)
        sm.set_mailfrom=comunicazione.mittente
        sm.add_to(u.mail)

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

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

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

        sm.set_data(sm_data)
        sm.send()
      ### comunicazioni ###

  '''
  ElencoDocumenti = list()
  if utente: #visualizza i documenti per l'utente
    ElencoDocumenti = Documento.objects.filter(utente=utente).order_by("utente__nome","documento") 
  elif sede:
    tmpUtenti = sede.utente_set.all()
    for t in tmpUtenti:
      d = t.documento_set.all()
      for id in d:
        ElencoDocumenti.append(id)
  else:
    tmpUtenti = azienda.utente_set.all()
    for t in tmpUtenti:
      d = t.documento_set.all()
      for id in d:
        ElencoDocumenti.append(id)

  data['ElencoDocumenti'] = ElencoDocumenti
  
  if request.method == "POST":
    if 'ScaricaSelezionati' in request.POST:
      print('Premuto tasto Scarica Selezionati')
      print('request',request.POST)
      if 'select' in request.POST:
        SelectResponse = formMultipleCheckBox(request.POST)
        SelectResponse.c(data['ElencoDocumenti'])
        print("SelectResponse",SelectResponse)

        if SelectResponse.is_valid():
          select = SelectResponse.cleaned_data.get('select')
          print('select',select,type(select))
          (pathzipfile,filePreparato) = PrepareZipFile(select)
          # scarica il file
          response = None
          with open(os.path.join(pathzipfile,filePreparato),'rb') as f:
            response =  HttpResponse(f.read(),content_type='application/zip')
            response['Content-Disposition'] = 'attachment; filename={}'.format(filePreparato)
          os.unlink(os.path.join(pathzipfile,filePreparato))
          return response
  '''     

  print("Numero documenti associati",len(ElencoDocumenti),len(data['ElencoDocumenti']))

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

def finalize_download(request,did,uid=None):
  '''
  viene comunicato l'utente
  viene cercato il file memorizzato e viene riconsegnato 
  con il nome originale
  did: documento id
  uid: user id
  '''

  UserId = None

  if not did:
    return HttpResponseRedirect(reverse("login:start"))

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

  if 'UserId' in request.session:
    UserId = request.session['UserId']
    print('UserId in request session',UserId)
  else:
    print('UserId passed by func',uid)
    UserId = uid

  utente = Utente.objects.get(pk=UserId)
  documento = Documento.objects.get(pk=did)

  fl_completa = os.path.join(settings.BASE_DIR,getConfig('DocPath'),utente.azienda.partitaiva,utente.codicefiscale,documento.storage)
  print('path completa',fl_completa)

  if documento.storage and os.path.isfile(fl_completa):
    try:
      fl = open(fl_completa, 'rb')
    except Exception as er:
      print('errore',er)
      data=dict()
      data['errore']="File non esistente o non ancora disponibile"
      data['utente'] = utente
      data['documento'] = documento
      return render(request,'welcome.error.html',data)
  else:
    print('il file non esiste in document,download')
    data=dict()
    data['errore']='File non esistente o non ancora disponibile'
    data['utente'] = utente
    data['documento'] = documento
    return render(request,'welcome.error.html',data)

  mime_type, _ = mimetypes.guess_type(fl_completa)
  fl = fl_completa
  print('fl',fl,mime_type)
  response = FileResponse(open(fl,'rb'),content_type='application/pdf',as_attachment=False)
  #response['Content-Disposition'] = "attachment; filename=%s" % documento.documento
  #setNewLog(3,{'utente':utente,'documento':documento,'azienda':utente.azienda})
  setLog(3,azienda=utente.azienda,utente=utente,documento=documento)

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

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

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

  return response


