# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
# Create your views here.
# Create your views here.
import xlrd
from django_excel_response import ExcelResponse
#from openpyxl import Workbook
#from openpyxl.writer.excel import save_virtual_workbook
from django.http import HttpResponse, JsonResponse
from django.views.generic import View
# Create your views here.
from json import dumps
from django.views.decorators.clickjacking import xframe_options_exempt
from django.contrib.admin.views.decorators import staff_member_required
from django.conf import settings
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from api.models import Perfil, Campaign, Campaign_contacto, Plantilla, Lista, ImportFile,ImportContact,ColumnasImport
from django.contrib.auth.models import User
from django.utils.encoding import smart_str
from django.contrib import messages
import datetime
import os
import json
from api.dialog360 import Dialog360
from django_tables2 import RequestConfig
from .tables import Usuarios as UsuariosTabla, Historial as HistoricTabla, Plantillas as T_Plantillas, Listas as T_Listas, Listas_Empleados as T_ListaEmpleado, ResumenEnvio as T_ResumenEnvio
from .tables import Listas_Errores_Import as Lista_Errores_Import_Tabla, HistorialProgramado as T_Historial_Programado
from django_tables2.export.export import TableExport
from django_tables2.export.views import ExportMixin
#from twilio.rest import Client
from django.utils import timezone

def invertfecha(fecha):
    campos = str(fecha).split('-')
    return campos[2]+"-"+campos[1]+"-"+campos[0]


class Hello(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(request.user.is_staff):
            return redirect('Dashboard')
        else:
            return redirect('Inbenta')


_Hello = Hello.as_view()

class Dashboard(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(request.user.is_staff==False):
            return redirect('Inbenta')
        fecha_inicio=request.GET.get('fecha_inicio',None)
        fecha_fin=request.GET.get('fecha_fin',None)
        fecha_inicio_v=None
        fecha_fin_v=None
        fecha_inicio_s=None
        fecha_fin_s=None
        meses={'Enero':'01','Febrero':'02','Marzo':'03','Abril':'04','Mayo':'05','Junio':'06','Julio':'07','Agosto':'08','Septiembre':'09','Octubre':'10','Noviembre':'11','Diciembre':'12'}

        try:
            fecha_inicio_v=fecha_inicio.split('/')
            fecha_fin_v=fecha_fin.split('/')
            if len(fecha_inicio_v[0])==1: 
                fecha_inicio_v[0]='0'+ fecha_inicio_v[0]
            if len(fecha_fin_v[0])==1: 
                fecha_fin_v[0]='0'+ fecha_fin_v[0]
            fecha_inicio_s=fecha_inicio_v[2]+'-'+meses[fecha_inicio_v[1]]+'-'+fecha_inicio_v[0]
            fecha_fin_s=fecha_fin_v[2]+'-'+meses[fecha_fin_v[1]]+'-'+fecha_fin_v[0]

        except:
            fecha_inicio=None
            fecha_fin=None
            fecha_inicio_v=None
            fecha_fin_v=None
            fecha_inicio_s=None
            fecha_fin_s=None
        

        

        print ('fecha_inicio_s:',fecha_inicio_s)
        print ('fecha_fin_s:',fecha_fin_s)

        numero=settings.D360_NUMERO
        user=request.user
        
        contactos_totales=User.objects.filter(is_staff=False,is_active=True).count()
        mensajes_enviados=Campaign_contacto.objects.all().count()
        listas_totales=Lista.objects.filter(activo=True).count()
        
        camp_enviadas=Campaign.objects.all().count()          
        enviados=Campaign_contacto.objects.filter(estado__lt=2).count()
        entregados=Campaign_contacto.objects.filter(estado=2).count()
        leidos=Campaign_contacto.objects.filter(estado=3).count()
        errores=Campaign_contacto.objects.filter(estado=5).count()

        if fecha_inicio_s and fecha_fin_s:
            camp_enviadas=Campaign.objects.filter(fecha__range=[fecha_inicio_s,fecha_fin_s]).count()
            enviados=Campaign_contacto.objects.filter(campaign__fecha__range=[fecha_inicio_s,fecha_fin_s],estado__lt=2).count()
            mensajes_enviados=Campaign_contacto.objects.filter(campaign__fecha__range=[fecha_inicio_s,fecha_fin_s]).count()
            entregados=Campaign_contacto.objects.filter(campaign__fecha__range=[fecha_inicio_s,fecha_fin_s],estado=2).count()
            leidos=Campaign_contacto.objects.filter(campaign__fecha__range=[fecha_inicio_s,fecha_fin_s],estado=3).count()
            errores=Campaign_contacto.objects.filter(campaign__fecha__range=[fecha_inicio_s,fecha_fin_s],estado=5).count()

        camp_5=Campaign.objects.all().order_by('-id')[:5]
        top5_camp=[]
        i=0
        for c in camp_5:
            i+=1
            total_mens=Campaign_contacto.objects.filter(campaign=c).count()
            total_entrega=Campaign_contacto.objects.filter(campaign=c,estado__gt=0,estado__lt=4).count()
            total_apertura=Campaign_contacto.objects.filter(campaign=c,estado=3).count()
            perc_entrega=0
            perc_apertura=0
            if total_mens>0:
                perc_entrega=int(100*total_entrega/(total_mens*1.0))
            if total_entrega>0:
                perc_apertura=int(100*total_apertura/(total_entrega*1.0))
            fecha=c.fecha.strftime('%d/%m/%Y')
            top5_camp.append({'titulo':str(i)+'.- '+'<a href="/whatsapp_results/'+str(c.id)+'">'+c.titulo+'</a>',
            'subtitulo':fecha+' | Tasa de entrega: '+str(perc_entrega)+"%"+" | Tasa de apertura:"+str(perc_apertura)+'%'})

        top5_list=[]
        i=0
        list_5=Lista.objects.filter(activo=True).order_by('-id')[:5]
        for l in list_5:
            i+=1
            total_lista=l.contactos.all().count()
            fecha=l.creacion.strftime('%d/%m/%Y')
            top5_list.append({'titulo':str(i)+'.- '+'<a href="/lista_empleados/'+str(l.id)+'">'+l.nombre+'</a>',
                            'subtitulo':fecha+" | Contactos: "+str(total_lista)})



        chart={'labels':['Enviado','Entregado','Leido','Error'],'data':[enviados,entregados,leidos,errores]}

        borrado=False
        if fecha_inicio or fecha_fin:
            borrado=True
        
        titulo_grafica="Historial Completo  de tu Cuenta"
        if (fecha_fin and fecha_inicio):
            titulo_grafica="Historial del "+fecha_inicio +" al "+fecha_fin
        datos={'titulo_grafica':titulo_grafica,'borrado':borrado,'fecha_inicio':fecha_inicio,'fecha_fin':fecha_fin,'user':user,'numero':numero,'contactos_totales':contactos_totales,
            'mensajes_enviados':mensajes_enviados,'listas_totales':listas_totales,
            'camp_enviadas':camp_enviadas,'chart':chart,'top5_camp':top5_camp,'top5_list':top5_list}
        return render(request,'dashboard.html',datos)


_Dashboard = Dashboard.as_view()
class PasswordReset(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

        Usuarios = Perfil.objects.filter(
            user__is_active=True, user__is_staff=False)
        Users = []
        for perfil in Usuarios:
            userObject = perfil.user
            Users.append({'num_emp': perfil.num_emp, 'perf_emp': perfil.perf_emp, 'userid': userObject.id,
                         'perfilid': perfil.id, 'nombre': userObject.first_name+" "+userObject.last_name, 'email': userObject.email})
        return render(request, 'registration/password_reset.html',
                      {'usuarios': Users})


_PasswordReset = PasswordReset.as_view()


@method_decorator(staff_member_required, name='dispatch')
class SendWhats(View):
    def send_text(self, tel, texto):
        account_sid = 'ACbb55ddf4e3ceda9d21ff3065d080f91b'
        auth_token = '29f01f61cb3b14b1bda271c48bdb57d6'
        #auth_token = 'be8c28bc0a003c4fbea3fa34eba9fe9c'
        from_ = 'whatsapp:+14698888087'
        to = 'whatsapp:+521'+tel
        D360 = Dialog360()

        #client = Client(account_sid, auth_token)
        re = True
        try:
            # message = client.messages.create(
            #    body=texto,
            #    from_=from_,
            #    to=to
            # )
            r = D360.enviawhats(tel, texto)

         #   None
        except:
            re = False
        return re

    def post2(self, request):
        r = {'ok': True, 'msg': ''}
        if ('id' not in request.POST):
            r = {'ok': False, 'msg': 'Parametros Incopmpletos'}
            return JsonResponse(r)
        id = request.POST['id']
        print('id:', id)
        camp_con = Campaign_contacto.objects.filter(
            campaign_id=id, estado__lt=2)
        camp = Campaign.objects.get(pk=id)
        if camp.estado>2:
            r = {'ok': False, 'msg': 'Mensaje programado'}
            return JsonResponse(r)

        #print('camp', camp)
        enviando = []
        camp.estado = 1
        camp.save()
        for con in camp_con:
            con.estado = 1
            con.save()
            enviando.append(con.telefono)
            enviado = self.send(con.telefono, camp.texto)
            if enviado:
                con.estado = 2
            else:
                con.estado = 3
            con.save()
        camp_con = Campaign_contacto.objects.filter(campaign_id=id)
        total = camp_con.count()
        camp_con = Campaign_contacto.objects.filter(campaign_id=id, estado=2)

        exito = camp_con.count()
        fallido = total-exito
        camp.total = total
        camp.exitosos = exito
        camp.fallidos = fallido
        camp.estado = 2
        camp.save()

        r = {'ok': True, 'enviando': enviando}

        return JsonResponse(r)

    def send_plantilla(self, tel, template,perfil):
        D360 = Dialog360()
        re = False
        #if True:
        try:
            r = D360.enviatemplate(tel, template,perfil)
            re = r
        except:
           re = False
        return re

    def post(self, request):
        r = {'ok': True, 'msg': ''}
        if ('id' not in request.POST):
            r = {'ok': False, 'msg': 'Parametros Incopmpletos'}
            return JsonResponse(r)
        id = request.POST['id']
        camp_con = Campaign_contacto.objects.filter(
            campaign_id=id, estado__lt=2)
        camp = Campaign.objects.get(pk=id)
        if camp.estado>2:
            r = {'ok': False, 'msg': 'Mensaje programado'}
            return JsonResponse(r)
        enviando = []
        camp.estado = 1
        camp.save()
        for con in camp_con:
            con.estado = 0
            con.save()
            enviando.append(con.telefono)
            enviado = self.send_plantilla(con.telefono, camp,con.perfil)
            if enviado:
                if "messages" in enviado:
                    if(enviado["messages"] and len(enviado["messages"]) == 1):
                        con.id_360 = enviado["messages"][0]["id"]
                    con.estado = 0
                else:
                    #print (enviado)
                    con.estado=5
            else:
                con.estado = 5
            con.save()
        camp_con = Campaign_contacto.objects.filter(campaign_id=id)
        total = camp_con.count()
        camp_con = Campaign_contacto.objects.filter(campaign_id=id, estado=2)

        exito = camp_con.count()
        fallido = total-exito
        camp.total = total
        camp.exitosos = exito
        camp.fallidos = fallido
        camp.estado = 2
        camp.save()

        r = {'ok': True, 'enviando': enviando}

        return JsonResponse(r)


_SendWhats = SendWhats.as_view()


@method_decorator(staff_member_required, name='dispatch')
class WhatsappSending(View):
    def post(self, request):

        return redirect('Dashboard')

    def get(self, request, id):
        camp_con = Campaign_contacto.objects.filter(campaign_id=id)
        Target = camp_con.count()
        camp = Campaign.objects.get(pk=id)
        titulo = camp.titulo
        estados=['Creado','Enviado','Entregado','Leido','Borrado','Error']
        total_entregados=0
        total_abiertos=0
        total_rechazados=0
        print(camp.estado)
        if camp.estado>2:
            print('malo')
            return redirect('Whatsapp_Create')

        cp = []
        for cmp in camp_con:
            if cmp.estado==2:
                total_entregados+=1
            elif cmp.estado==3:
                total_entregados+=1    
                total_abiertos+=1
            elif cmp.estado==5:
                total_rechazados+=1
            if cmp.perfil:
                

                cp.append(
                    {'telefono': cmp.telefono, 'perfil': cmp.perfil.user.first_name + " " + cmp.perfil.user.last_name,'estado':estados[cmp.estado],'fecha':cmp.modificado})
            else:
                cp.append({'telefono': cmp.telefono, 'perfil': '','estado':estados[cmp.estado],'fecha':cmp.modificado})

        tasa_entrega=int(100*total_entregados/(Target*1.0))
        tasa_apertura=int(100*total_abiertos/(Target*1.0))
        tasa_rebote=int(100*total_rechazados/(Target*1.0))
        estadisticas={'total_entregados':total_entregados,'tasa_entrega':tasa_entrega,
                    'total_abiertos':total_abiertos,'tasa_apertura':tasa_apertura,
                    'total_rechazados':total_rechazados,'tasa_rebote':tasa_rebote}   
        mytabla = T_ResumenEnvio(cp)
  
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("reporte_historico.{}".format(export_format))

        if camp.estado != 2:
            return render(request, 'whatsapp_sending.html',
                          {'target': Target, 'id': id,'tabla':mytabla,'estadisticas':estadisticas, "export_formats": ['csv', 'xlsx']})
        return render(request, 'whatsapp_results.html',
                      {'target': Target, 'id': id, 'camp': cp, 'titulo': titulo,'tabla':mytabla,'estadisticas':estadisticas, "export_formats": ['csv', 'xlsx']})


_WhatsappSending = WhatsappSending.as_view()


@method_decorator(staff_member_required, name='dispatch')
class WhatsappResultsExcel(View):
    def post(self, request):
        return redirect('Dashboard')

    def get(self, request, id):
        camp = Campaign_contacto.objects.filter(campaign_id=id)
        Target = camp.count()
        mycamp = Campaign.objects.get(pk=id)
        titulo = mycamp.titulo
        fecha = mycamp.fecha
        cp = []
        data = []
        data.append(['Telefono', 'Nombre'])
        for cmp in camp:
            if cmp.perfil:
                cp.append({'telefono': cmp.telefono,
                          'perfil':  cmp.perfil.user.first_name+" "+cmp.perfil.user.last_name})
                data.append(
                    [cmp.telefono, cmp.perfil.user.first_name+" "+cmp.perfil.user.last_name])

            else:
                cp.append({'telefono': cmp.telefono, 'perfil': ''})
                data.append([cmp.telefono, ''])

        response = HttpResponse(
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        )
        response['Content-Disposition'] = 'attachment; filename={date}-whatsapp.xlsx'.format(
            date=fecha.strftime('%Y-%m-%d'),
        )
        print(fecha.strftime('%Y-%m-%d'))

        return ExcelResponse(data, 'Envios_Whatsapp_'+fecha.strftime('%Y-%m-%d'))


_WhatsappResultsExcel = WhatsappResultsExcel.as_view()


@method_decorator(staff_member_required, name='dispatch')
class WhatsappResults(View):
    def post(self, request):

        

        return redirect('Dashboard')

    def get(self, request, id):
        camp_con = Campaign_contacto.objects.filter(campaign_id=id)
        Target = camp_con.count()
        camp = Campaign.objects.get(pk=id)

        titulo = Campaign.objects.get(pk=id).titulo
        estados=['Creado','Enviado','Entregado','Leido','Otro','Error']
        total_entregados=0
        total_abiertos=0
        total_rechazados=0

        cp = []
        cp = []
        for cmp in camp_con:
            if cmp.estado==2:
                total_entregados+=1
            elif cmp.estado==3:
                total_entregados+=1 
                total_abiertos+=1
            elif cmp.estado==5:
                total_rechazados+=1
            if cmp.perfil:
                cp.append(
                    {'telefono': cmp.telefono, 'perfil': cmp.perfil.user.first_name + " " + cmp.perfil.user.last_name,'estado':estados[cmp.estado],'fecha':cmp.modificado})
            else:
                cp.append({'telefono': cmp.telefono, 'perfil': '','estado':estados[cmp.estado],'fecha':cmp.modificado})
        mytabla = T_ResumenEnvio(cp)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("reporte_historico.{}".format(export_format))
        tasa_entrega=0
        tasa_apertura=0
        tasa_rebote=0
        if Target>0:
            tasa_entrega=int(100*total_entregados/(Target*1.0))
            tasa_rebote=int(100*total_rechazados/(Target*1.0))
        if total_entregados>0:    
            tasa_apertura=int(100*total_abiertos/(total_entregados*1.0))

        estadisticas={'total_entregados':total_entregados,'tasa_entrega':tasa_entrega,
                    'total_abiertos':total_abiertos,'tasa_apertura':tasa_apertura,
                    'total_rechazados':total_rechazados,'tasa_rebote':tasa_rebote}  

   

        return render(request, 'whatsapp_results.html',
                      {'estadisticas':estadisticas,'target': Target, 'camp': cp, 'titulo': titulo,'tabla':mytabla, "export_formats": ['csv', 'xlsx']})


_WhatsappResults = WhatsappResults.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Lista_Empleados(View):
    def post(self, request,id):
        perfil_id=request.POST.get('perfil_id',None)
        add_contacto=request.POST.get('add_contacto',None)
        if(perfil_id):
            lista=Lista.objects.get(pk=id)
            perfil=Perfil.objects.get(id=int(perfil_id))
            lista.contactos.remove(perfil)
            lista.save()
        if(add_contacto):
            lista=Lista.objects.get(pk=id)
            perfil=Perfil.objects.get(id=int(add_contacto))

            lista.contactos.add(perfil)
            lista.save()


        return redirect('Lista_Empleados',id=id)

    def get(self, request, id):
        list = Lista.objects.get(pk=id)
        titulo = list.nombre
        cp = []
        faltantes=[]
        listas_id=[]
        for cmp in list.contactos.all():

            cp.append({'id':cmp.user.id,'lista':id,'telefono': cmp.telefono,'email':cmp.user.email,'empresa':cmp.empresa,'direccion':cmp.direccion,'notas':cmp.notas,
                      'perfil':  cmp.user.first_name+" "+cmp.user.last_name,'perfil_id':cmp.id})
            listas_id.append(cmp.id)
        perfiles=Perfil.objects.filter(user__is_active=True).exclude(id__in=listas_id)
        for cmp in perfiles:
            faltantes.append({'id':cmp.user.id,'lista':id,'telefono': cmp.telefono,
                      'perfil':  cmp.user.first_name+" "+cmp.user.last_name,'perfil_id':cmp.id})

        mytabla = T_ListaEmpleado(cp)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("listas.{}".format(export_format))

        return render(request, 'lista_empleados.html',
                      {'lista': mytabla,'faltantes':faltantes, 'titulo': titulo, "export_formats": ['csv', 'xlsx']})


_Lista_Empleados = Lista_Empleados.as_view()


@method_decorator(staff_member_required, name='dispatch')
class ListaEmpleadosExcel(View):
    def post(self, request):
        return redirect('Dashboard')

    def get(self, request, id):
        data = []
        data.append(['Nombre', 'Telefono'])
        list = Lista.objects.get(pk=id)
        cp = []
        for cmp in list.contactos.all():
            cp.append({'nombre':   cmp.user.first_name+" " +
                      cmp.user.last_name, 'telefono': cmp.telefono})
            data.append([cmp.user.first_name+" " +
                        cmp.user.last_name, cmp.telefono])

        response = HttpResponse(
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        )
        response['Content-Disposition'] = 'attachment; filename={date}-Empleados.xlsx'.format(
            date=list.nombre,
        )

        return ExcelResponse(data, 'Empleados_Lista_'+list.nombre)


_ListaEmpleadosExcel = ListaEmpleadosExcel.as_view()


@method_decorator(staff_member_required, name='dispatch')
class WhatsappHistoric(ExportMixin, View):
    def post(self, request):
        borrar_id=request.POST.get('borrar_id',None)
        if(borrar_id):
            camp = Campaign.objects.get(pk=borrar_id)
            if camp.estado==3:
                camp.estado=10;
                camp.save()

        return redirect('Whatsapp_Historic')

    def get(self, request):

        filtro_titulo = request.GET.get("filtro_titulo", None)
        if(filtro_titulo == '' or filtro_titulo == '_ALL_'):
            filtro_titulo = None
        filtro_total = request.GET.get("filtro_total", None)
        if(filtro_total == '' or filtro_total == '_ALL_'):
            filtro_total = None
        filtro_fecha = request.GET.get("filtro_fecha", None)
        if(filtro_fecha == ''):
            filtro_fecha = None
        
        filtro_titulo2 = request.GET.get("filtro_titulo2", None)
        if(filtro_titulo2 == '' or filtro_titulo2 == '_ALL_'):
            filtro_titulo2 = None
        filtro_fecha2 = request.GET.get("filtro_fecha2", None)
        if(filtro_fecha2 == ''):
            filtro_fecha2 = None

        envios = Campaign.objects.all().order_by('-id')
        titulos = []
        totales = []
        
        for e in envios:
            if(e.titulo not in titulos):
                titulos.append(e.titulo)
            if (e.total not in totales):
                totales.append(e.total)
        totales = sorted(totales)
        #print(totales)
        #Solo los normales (excluir programados)
        enviosp=envios.filter(estado__gt=2,estado__lt=10)

        envios=envios.filter(estado__lt=3)

        if (filtro_titulo):
            envios = envios.filter(titulo=filtro_titulo)
        if (filtro_total):
            envios = envios.filter(total=filtro_total)
        if (filtro_fecha):
            filtro_date = datetime.datetime.strptime(filtro_fecha, '%d/%m/%y')
            envios = envios.filter(fecha__date=filtro_date)


        if (filtro_titulo2):
            enviosp = enviosp.filter(titulo=filtro_titulo2)
       
        if (filtro_fecha2):
            filtro_date2 = datetime.datetime.strptime(filtro_fecha2, '%d/%m/%y')
            enviosp = enviosp.filter(hora_programada__date=filtro_date2)

        opciones = {0: "Nuevo", 1: "Enviando", 2: "Finalizada",3:"Programado",4:"Enviando"}
        historial = []
        historialp = []
        hayprogramados=False
        for e in enviosp:
            hayprogramados=True
            if e.lista is None:
                tipo = 'persona'
            else:
                tipo = 'group'
            historialp.append({'fecha': e.hora_programada, 'id': e.id, 'titulo': e.titulo, 'texto': e.texto,
                             'total': e.total, 'tipo': tipo, 'estado': opciones[e.estado], 'estado_id': e.estado})


        for e in envios:
            tipo = ''
            misenvios=Campaign_contacto.objects.filter(campaign_id=e.id)
            total_entrega=Campaign_contacto.objects.filter(campaign_id=e.id,estado__gt=0,estado__lt=4).count()

            total_envios=misenvios.count()
            total_abiertos=misenvios.filter(estado=3).count()
            perc_apertura=0
            if total_entrega>0:
              perc_apertura= int(100*total_abiertos/total_entrega*1.0)
            if e.lista is None:
                tipo = 'persona'
            else:
                tipo = 'group'

            historial.append({'tasa_apertura':perc_apertura,'fecha': e.fecha, 'id': e.id, 'titulo': e.titulo, 'texto': e.texto,
                             'total': e.total, 'tipo': tipo, 'estado': opciones[e.estado], 'estado_id': e.estado})

        titulo_html = """
        <div class="input-field ">
        <select id="filtro_titulo" searchable="Buscar"  name="filtro_titulo">
        <option value="_ALL_" """
        if filtro_titulo is None:
            titulo_html += " selected>Todos</option> "
        else:
            titulo_html += ">Todas</option> "
        for l in titulos:
            titulo_html += '<option value="'+l+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_titulo and filtro_titulo == l:
                titulo_html += ' selected '
            titulo_html += '" >'+l+'</option> '
        titulo_html += """
        </select>
        <label>Titulo</label>
        </div>
        """
        titulo_html2 = """
        <div class="input-field ">
        <select id="filtro_titulo2" searchable="Buscar"  name="filtro_titulo2">
        <option value="_ALL_" """
        if filtro_titulo is None:
            titulo_html2 += " selected>Todos</option> "
        else:
            titulo_html2 += ">Todas</option> "
        for l in titulos:
            titulo_html2 += '<option value="'+l+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_titulo2 and filtro_titulo2 == l:
                titulo_html2 += ' selected '
            titulo_html2 += '" >'+l+'</option> '
        titulo_html2 += """
        </select>
        <label>Titulo</label>
        </div>
        """
        total_html = """
        <div class="input-field ">
        <select id="filtro_total" name="filtro_total">
        <option value="_ALL_" """
        if filtro_total is None:
            total_html += " selected>Todos</option> "
        else:
            total_html += ">Todos</option> "
        for l in totales:
            total_html += '<option value="'+str(l)+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_total and filtro_total == str(l):
                total_html += ' selected '
            total_html += '" >'+str(l)+'</option> '
        total_html += """
        </select>
        <label>Total</label>
        </div>
        """

        fecha_html = """
                <div class="input-field ">

          <input onchange="cambiar()" id="filtro_fecha"
          """
        if(filtro_fecha):
            fecha_html += ' value= " ' + filtro_fecha + '" '
        fecha_html += """ name="filtro_fecha" type="text" class="datepicker">
                  <label>Fecha</label>

          </div>
        """
        fecha_html2 = """
                <div class="input-field ">

          <input onchange="cambiar2()" id="filtro_fecha2"
          """
        if(filtro_fecha2):
            fecha_html2 += ' value= " ' + filtro_fecha2 + '" '
        fecha_html2 += """ name="filtro_fecha2" type="text" class="datepicker">
                  <label>Fecha</label>

          </div>
        """
        mytabla = HistoricTabla(historial, fecha_html=fecha_html,
                                campaign_html=titulo_html)
        mytabla2=T_Historial_Programado(historialp,fecha_html=fecha_html2,campaign_html=titulo_html2)

        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("reporte_historico.{}".format(export_format))

        return render(request, 'whatsapp_history2.html',
                      {'hayprogramados':hayprogramados,'target': 0, 'programados':mytabla2,'envios': mytabla, 'estados': opciones, "export_formats": ['csv', 'xlsx']})


_WhatsappHistoric = WhatsappHistoric.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Whatsapp(View):
    def post(self, request):
        #print('parametros',request.POST)
        if ('texto' not in request.POST or 'plantilla' not in request.POST):
            messages.success(request, 'Seleccione una plantilla',
                             extra_tags='red')  # <-

            return redirect('Whatsapp')
        tipo = 0
        grupo_contacto = 0
        tiempo=0
        fechahora=''
        if ('tiempo_envio' in request.POST and request.POST['tiempo_envio'] == 'on'):
            tiempo=1
            fecha_hora=request.POST.get('datetime','')
            print (fecha_hora)
        if ('tipo' in request.POST and request.POST['tipo'] == 'on'):
            if('grupo' not in request.POST or request.POST['grupo'] == ''):
                messages.success(request, 'Seleccione una lista',
                                 extra_tags='red')  # <-
                return redirect('Whatsapp')
            else:
                grupo_contacto = request.POST['grupo']
            tipo = 2
        else:
            if ('individual' not in request.POST or request.POST['individual'] == ''):
                messages.success(
                    request, 'Seleccione un Contacto', extra_tags='red')  # <-
                return redirect('Whatsapp')
            else:
                grupo_contacto = request.POST['individual']
            tipo = 1
        if(tipo == 0 or grupo_contacto == 0):
            messages.success(request, 'Error en parametros',
                             extra_tags='red')  # <-
            return redirect('Whatsapp')
        texto = smart_str(request.POST['texto']).strip()
        plantilla_id = request.POST['plantilla']
        plantilla = Plantilla.objects.get(pk=plantilla_id)

        #texto = (u''+(request.POST['texto']).encode('utf8')).strip()
        if len(texto) == 0 or plantilla is None:
            messages.success(request, 'Seleccione una plantilla',
                             extra_tags='red')  # <-

            return redirect('Whatsapp')
        titulo = plantilla.titulo

        Usuarios = Perfil.objects.filter(user__is_active=True, user__is_staff=False).exclude(
            telefono__isnull=True).exclude(telefono__exact='')
        if tipo == 1:
            Usuarios = Perfil.objects.filter(id=grupo_contacto)
        else:
            Lst = Lista.objects.get(id=grupo_contacto)
            Usuarios = Lst.contactos.all()
        Target = Usuarios.count()
        camp = Campaign()
        camp.texto = texto
        camp.titulo = titulo
        camp.total = Target
        camp.plantilla=plantilla
        camp.estado = 0
        if(tiempo==1):
            camp.estado=3
            vfecha=fecha_hora.split(' ')
            print(vfecha)
            fh_sql=''
            if len(vfecha)==3:
                vdate=vfecha[0].split('/')
                fh_sql=str(vdate[2])+'-'+str(vdate[1])+'-'+str(vdate[0])
                vhora=vfecha[1].split(':')
                print('vhora',vhora)
                ihora=int(vhora[0])
                am_pm=vfecha[2]
                if am_pm=='AM':
                    ihora=ihora%12
                    print('AM')
                else:
                    ihora=ihora%12+12
                    print ('PM')
                shora=str(ihora)
                if(ihora<10):
                    shora='0'+str(ihora)

                fh_sql+=' '+shora+':'+vhora[1]+':00'
            print ('fh_sql',fh_sql)
            camp.hora_programada=datetime.datetime.strptime(fh_sql,'%Y-%m-%d %H:%M:%S')
            messages.success(
                    request, 'Se a agendado el envío de whatsapp', extra_tags='blue')  # <-




        if(tipo == 2):
            camp.lista_id = grupo_contacto
        camp.save()

        for user in Usuarios:
            contacto = Campaign_contacto()
            contacto.campaign = camp
            contacto.perfil = user
            contacto.telefono = user.telefono
            contacto.estado = 0
            contacto.save()
        if(tiempo==0):
            return redirect('Whatsapp_Sending', id=camp.id)

        return redirect('Whatsapp_Historic')

    def get(self, request):
        Usuarios = Perfil.objects.filter(user__is_active=True, user__is_staff=False).exclude(
            telefono__isnull=True).exclude(telefono__exact='')
        contacto=request.GET.get('contacto',None)
        lista=request.GET.get('lista',None)
        machote=request.GET.get('plantilla',None)
        if machote:
            machote=int(machote)
        if lista:
            lista=int(lista)
        if contacto:
            contacto=int(contacto)
        Target = Usuarios.count()
        Users = []
        d360=Dialog360()
        d360.update_templates()
        plantillas = Plantilla.objects.filter(borrado=False,estado='aprobada')
        vplantillas = []
        vusers=[]
        for plantilla in plantillas:
            vplantillas.append({'id': plantilla.id, 'texto': plantilla.texto,'titulo':plantilla.titulo})

        for perfil in Usuarios:
            userObject = perfil.user
            vusers.append({'id':userObject.id,'perfil':perfil.id,'nombre':userObject.first_name + " " + userObject.last_name})
            Users.append(
                {  # 'num_emp': perfil.num_emp, 'perf_emp': perfil.perf_emp,
                    # 'rfc': perfil.rfc,
                    'userid': userObject.id,
                    'perfilid': perfil.id, 'nombre': userObject.first_name + " " + userObject.last_name,
                    'email': userObject.email})
        listas = Lista.objects.filter(activo=True)
        vlistas=[]
        for l in listas:
            vlistas.append({'id':l.id,'nombre':l.nombre})
        return render(request, 'whatsapp.html',
                      {'contacto':contacto,'machote':machote,'lista':lista,'usuarios': Users,'vusuarios':vusers, 'target': Target, 'plantillas': plantillas, 'listas': listas, 'vlistas':vlistas,'textos': dumps(vplantillas)})


_Whatsapp = Whatsapp.as_view()
@method_decorator(staff_member_required, name='dispatch')

class Edit_Programado(View):
    def post(self,request,id):
        Cmp=Campaign.objects.get(pk=id)
       
        if (Cmp.estado!=3):
            messages.success(request, 'Campaña no disponible',
                             extra_tags='red') 
            return redirect('Whatsapp_Historic')
        
        fecha_hora=request.POST.get('datetime','')
        plantilla_id = request.POST['plantilla']

        vfecha=fecha_hora.split(' ')
        print(vfecha)
        fh_sql=''
        if len(vfecha)==3:
            vdate=vfecha[0].split('/')
            fh_sql=str(vdate[2])+'-'+str(vdate[1])+'-'+str(vdate[0])
            vhora=vfecha[1].split(':')
            print('vhora',vhora)
            ihora=int(vhora[0])
            am_pm=vfecha[2]
            if am_pm=='AM':
                ihora=ihora%12
                print('AM')
            else:
                ihora=ihora%12+12
                print ('PM')
            shora=str(ihora)
            if(ihora<10):
                shora='0'+str(ihora)

            fh_sql+=' '+shora+':'+vhora[1]+':00'
            print ('fh_sql',fh_sql)
            Cmp.hora_programada=datetime.datetime.strptime(fh_sql,'%Y-%m-%d %H:%M:%S')
        plantilla=Plantilla.objects.get(pk=plantilla_id)
        Cmp.plantilla=plantilla
        Cmp.titulo=plantilla.titulo
        Cmp.texto=plantilla.texto
        Cmp.save()
        messages.success(request, 'Campaña modificada',
                             extra_tags='blue')
        return redirect('Whatsapp_Historic')
    def get(self,request,id):
        Usuarios = Perfil.objects.filter(user__is_active=True, user__is_staff=False).exclude(
        telefono__isnull=True).exclude(telefono__exact='')
        Cmp=Campaign.objects.get(pk=id)
        if (Cmp.estado!=3):
            messages.success(request, 'Campaña no disponible',
                             extra_tags='red')  
            return redirect('Whatsapp_Historic')

        contacto=None
        lista=None
        machote=Cmp.plantilla_id
        textomachote=Cmp.plantilla.texto
        titulomachote=Cmp.plantilla.titulo

        fecha_envio=timezone.localtime(Cmp.hora_programada).strftime('%d/%m/%Y %I:%H %p')
        Target = Usuarios.count()
        Users = []
        d360=Dialog360()
        d360.update_templates()
        plantillas = Plantilla.objects.filter(borrado=False,estado='aprobada')
        vplantillas = []
        vusers=[]
        for plantilla in plantillas:
            vplantillas.append({'id': plantilla.id, 'texto': plantilla.texto,'titulo':plantilla.titulo})

        for perfil in Usuarios:
            userObject = perfil.user
            vusers.append({'id':userObject.id,'perfil':perfil.id,'nombre':userObject.first_name + " " + userObject.last_name})
            Users.append(
                {  # 'num_emp': perfil.num_emp, 'perf_emp': perfil.perf_emp,
                    # 'rfc': perfil.rfc,
                    'userid': userObject.id,
                    'perfilid': perfil.id, 'nombre': userObject.first_name + " " + userObject.last_name,
                    'email': userObject.email})
        listas = Lista.objects.filter(activo=True)
        vlistas=[]
        for l in listas:
            vlistas.append({'id':l.id,'nombre':l.nombre})
        return render(request,'edit_programado.html',{'fecha_envio':fecha_envio,'textomachote':textomachote,'titulomachote':titulomachote,'contacto':contacto,'machote':machote,'lista':lista,'usuarios': Users,'vusuarios':vusers, 'target': Target, 'plantillas': plantillas, 'listas': listas, 'vlistas':vlistas,'textos': dumps(vplantillas)})
_Edit_Programado = Edit_Programado.as_view()

@method_decorator(staff_member_required, name='dispatch')
class Lista_Create(View):

    def get_listas(self):
        listas = Lista.objects.filter(activo=True)
        listas_array = []
        for l in listas:
            listas_array.append(
                {'id': l.id, 'titulo': l.nombre, 'members': l.contactos.all().count()})
        return listas_array

    def post(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')
        nombre = smart_str(request.POST['nombre']).strip()

        if len(nombre) == 0:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Lista_Create')
        if Lista.objects.filter(activo=True, nombre=nombre).count() > 0:
            messages.success(
                request, 'Ya existe una lista con el mismo nombre', extra_tags='red')  # <-
            return redirect('Lista_Create')
        mylista = Lista()
        mylista.nombre = nombre
        mylista.save()

        #listas = Lista.objects.filter(activo=True)
        listas = self.get_listas()
        mytabla = T_Listas(listas)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        return render(request, 'lista_create.html',
                      {'listas': mytabla, "export_formats": ['csv', 'xlsx']})

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')
        listas = self.get_listas()
        mytabla = T_Listas(listas)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("listas.{}".format(export_format))

        return render(request, 'lista_create.html',
                      {'listas': mytabla, "export_formats": ['csv', 'xlsx']})


_Lista_Create = Lista_Create.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Whatsapp_New_Template(View):
    def post(self, request):
        if ('texto' not in request.POST):
            return redirect('Whatsapp_New_Template')
        texto = smart_str(request.POST['texto']).strip()
        titulo = smart_str(request.POST['titulo']).strip()

        #texto = (u''+(request.POST['texto']).encode('utf8')).strip()
        if len(texto) == 0 or len(titulo) == 0:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Whatsapp_New_Template')
        plan=Plantilla.objects.filter(titulo=titulo,borrado=False)
        if len(plan)>0:
            messages.success(
                request, 'Error: Plantilla duplicada', extra_tags='red')  # <-

            return redirect('Whatsapp_New_Template')

        
        camp = Plantilla()
        
        camp.texto = texto
        camp.titulo = titulo
        
        image_switch=request.POST.get('image_switch',None)
        tel_switch=request.POST.get('botonTEL_switch',None)
        url_switch=request.POST.get('botonURL_switch',None)
        botontel_text=request.POST.get('botontel_text',None)
        botontel_number=request.POST.get('botontel_number',None)
        botonurl_text=request.POST.get('botonurl_text',None)
        botonurl_url=request.POST.get('botonurl_url',None)
        botones=[]
        imagen=None

        if(tel_switch=='on' or url_switch=='on' or image_switch=='on'):
            camp.tipo=1

        if(url_switch=='on'):
            camp.boton_url=botonurl_url
            camp.boton_url_txt=smart_str(botonurl_text).strip()
            botones.append( {
                            "text": camp.boton_url_txt,
                            "type": "URL",
                            "url": camp.boton_url
                        })
        if(tel_switch=='on'):
            camp.boton_tel=botontel_number
            camp.boton_tel_txt=smart_str(botontel_text).strip()
            botones.append( {
                            "text": camp.boton_tel_txt,
                            "type": "PHONE_NUMBER",
                            "phone_number": "+52"+camp.boton_tel
                        })
            

        camp.save()
        if image_switch=='on' and 'ufile' in request.FILES and request.FILES['ufile']:
            tituloimage=str(camp.id)+'_'+request.FILES['ufile']._name
            camp.img_file.save(tituloimage,request.FILES['ufile'],True)
            camp.has_image=True
            camp.tipo=1
            imagen={
                    "example": {
                        "header_handle": [
                            settings.MAIN_URL+'/static/images/continuapro.png'
                        ]
                    },
                    "format": "IMAGE",
                    "type": "HEADER"
                }
            camp.save()
        

        d360=Dialog360()
        correcto=d360.create_template_waba(titulo,texto,botones=botones,imagen=imagen)
        
        if correcto:
            messages.success(request, 'Se guardo su plantilla',
                            extra_tags='blue')  # <-
        else:
            messages.success(request, 'No se pudo crear su plantilla: '+d360.last_error,
                            extra_tags='red')  # <-
            camp.delete()

        if correcto:
            return redirect('Whatsapp_Create')
        return redirect('Whatsapp_New_Template')

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')
        

        return render(request, 'whatsapp_new_template.html',
                      {'ok':True})


_Whatsapp_New_Template = Whatsapp_New_Template.as_view()

@method_decorator(staff_member_required, name='dispatch')
class Whatsapp_Create(View):
    def post(self, request):
        if ('texto' not in request.POST):
            return redirect('Whatsapp_Create')
        texto = smart_str(request.POST['texto']).strip()
        titulo = smart_str(request.POST['titulo']).strip()

        #texto = (u''+(request.POST['texto']).encode('utf8')).strip()
        if len(texto) == 0 or len(titulo) == 0:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Whatsapp_Create')
        plan=Plantilla.objects.filter(titulo=titulo,borrado=False)
        if len(plan)>0:
            messages.success(
                request, 'Error: Plantilla duplicada', extra_tags='red')  # <-

            return redirect('Whatsapp_Create')

        
        camp = Plantilla()
        
        camp.texto = texto
        camp.titulo = titulo
        
        image_switch=request.POST.get('image_switch',None)
        tel_switch=request.POST.get('botonTEL_switch',None)
        url_switch=request.POST.get('botonURL_switch',None)
        botontel_text=request.POST.get('botontel_text',None)
        botontel_number=request.POST.get('botontel_number',None)
        botonurl_text=request.POST.get('botonurl_text',None)
        botonurl_url=request.POST.get('botonurl_url',None)
        botones=[]
        imagen=None

        if(tel_switch=='on' or url_switch=='on' or image_switch=='on'):
            camp.tipo=1

        if(url_switch=='on'):
            camp.boton_url=botonurl_url
            camp.boton_url_txt=smart_str(botonurl_text).strip()
            botones.append( {
                            "text": camp.boton_url_txt,
                            "type": "URL",
                            "url": camp.boton_url
                        })
        if(tel_switch=='on'):
            camp.boton_tel=botontel_number
            camp.boton_tel_txt=smart_str(botontel_text).strip()
            botones.append( {
                            "text": camp.boton_tel_txt,
                            "type": "PHONE_NUMBER",
                            "phone_number": "+52"+camp.boton_tel
                        })
            

        camp.save()
        if image_switch=='on' and 'ufile' in request.FILES and request.FILES['ufile']:
            tituloimage=str(camp.id)+'_'+request.FILES['ufile']._name
            camp.img_file.save(tituloimage,request.FILES['ufile'],True)
            camp.has_image=True
            camp.tipo=1
            imagen={
                    "example": {
                        "header_handle": [
                            settings.MAIN_URL+'/static/images/continuapro.png'
                        ]
                    },
                    "format": "IMAGE",
                    "type": "HEADER"
                }
            camp.save()
        

        d360=Dialog360()
        correcto=d360.create_template_waba(titulo,texto,botones=botones,imagen=imagen)
        
        if correcto:
            messages.success(request, 'Se guardo su plantilla',
                            extra_tags='blue')  # <-
        else:
            messages.success(request, 'No se pudo crear su plantilla: '+d360.last_error,
                            extra_tags='red')  # <-
            camp.delete()

        return redirect('Whatsapp_Create')

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')
        filtro_listas=None


        d360=Dialog360()
        tem=d360.update_templates()
        filtro_estado = request.GET.get('filtro_estado', None)
        filtro_titulo = request.GET.get('filtro_titulo', None)

        if(filtro_estado=='_ALL_'):
            filtro_estado=None
        if(filtro_titulo=='_ALL_'):
            filtro_titulo=None

        plantillas = Plantilla.objects.filter(borrado=False)
        plantillas_header=[]
        titulos_name=[]
        for p in plantillas:
            if(p.titulo not in titulos_name):
                titulos_name.append(p.titulo)
            if p.estado not in plantillas_header:
                plantillas_header.append(p.estado)
        if filtro_estado:
            print('filtrando')
            plantillas=plantillas.filter(estado=filtro_estado)
        if filtro_titulo:
            plantillas=plantillas.filter(titulo=filtro_titulo)
        plantillas_array=[]
 
        
        tipos=['Texto','Interactivo']
        for p in plantillas:
            plantillas_array.append({'id':p.id,'estado':p.estado,'titulo':p.titulo,'texto':p.texto,'tipo':tipos[p.tipo]})

        titulo_html = """
        <div class="input-field ">
        <select id="filtro_titulo" searchable="Buscar" name="filtro_titulo">
        <option value="_ALL_" """
        if filtro_titulo is None:
            titulo_html += " selected>Todos</option> "
        else:
            titulo_html += ">Todos</option> "
        for t in titulos_name:
            titulo_html += '<option value="'+t+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_titulo and filtro_titulo == t:
                titulo_html += ' selected '
            titulo_html += '" >'+t+'</option> '
        titulo_html += """
        </select>
        <label>Título</label>
        </div>
        """


        estado_html = """
        <div class="input-field ">
        <select id="filtro_estado" name="filtro_estado">
        <option value="_ALL_" """
        if filtro_estado is None:
            estado_html += " selected>Todas</option> "
        else:
            estado_html += ">Todas</option> "
        for l in plantillas_header:
            estado_html += '<option value="'+l+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_estado and filtro_estado == l:
                estado_html += ' selected '
            estado_html += '" >'+l+'</option> '
        estado_html += """
        </select>
        <label>Estado</label>
        </div>
        """
        mytabla = T_Plantillas(plantillas_array,Titulo_html=titulo_html,Estado_html=estado_html)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("plantillas.{}".format(export_format))

        return render(request, 'whatsapp_create.html',
                      {'plantillas': plantillas, 'tabla_plantillas': mytabla, "export_formats": ['csv', 'xlsx']})


_Whatsapp_Create = Whatsapp_Create.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Lista_Edit(View):
    def post(self, request, id):
        if ('id' not in request.POST):
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Lista_Edit', id)
        nombre = smart_str(request.POST['nombre']).strip()

        # texto = (u''+(request.POST['texto']).encode('utf8')).strip()
        if len(nombre) == 0:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Lista_Edit', id)

        otros = Lista.objects.filter(nombre=nombre)
        otros = otros.exclude(id=id)

        if otros:
            messages.success(
                request, 'Nombre de lista existente', extra_tags='red')  # <-

            return redirect('Lista_Edit', id)

        camp = Lista.objects.get(pk=request.POST['id'])
        camp.nombre = nombre
        camp.save()
        messages.success(request, 'Se guardo su lista',
                         extra_tags='blue')  # <-

        return redirect('Lista_Create')


    def get(self, request, id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')

        lista = Lista.objects.get(pk=id)
        return render(request, 'lista_edit.html',
                      {'lista': lista})


_Lista_Edit = Lista_Edit.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Whatsapp_Edit(View):
    def post(self, request, id):
        if ('id' not in request.POST):
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Whatsapp_Create')
        texto = smart_str(request.POST['texto']).strip()
            
        #titulo = smart_str(request.POST['titulo']).strip()

        # texto = (u''+(request.POST['texto']).encode('utf8')).strip()
        if len(texto) == 0 :
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-

            return redirect('Whatsapp_Create')

        camp = Plantilla.objects.get(pk=request.POST['id'])
        camp.texto = texto
        #camp.titulo = titulo
        camp.save()
        if 'ufile' in request.FILES and request.FILES['ufile']:
            titulo=str(id)+'_'+request.FILES['ufile']._name
            camp.img_file.save(titulo,request.FILES['ufile'],True)
            camp.save()

        messages.success(request, 'Se guardo su plantilla',
                         extra_tags='blue')  # <-

        return redirect('Whatsapp_Create')

    def get(self, request, id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if (not request.user.is_staff):
            return redirect('Inbenta')

        plantilla = Plantilla.objects.get(pk=id)
        return render(request, 'whatsapp_edit.html',
                      {'plantilla': plantilla})


_Whatsapp_Edit = Whatsapp_Edit.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Manager_old(View):

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        Usuarios = Perfil.objects.filter(
            user__is_active=True, user__is_staff=False)
        Users = []
        for perfil in Usuarios:
            userObject = perfil.user
            tel = ''
            if perfil.telefono is not None and perfil.telefono != '':
                tel = perfil.telefono
            x = Lista.objects.filter(contactos=perfil)
            listas = []
            for l in x:
                listas.append(l.nombre)
            list_commas = ", ".join(listas)
            Users.append({
                # 'rfc':perfil.rfc,
                'userid': userObject.id, 'listas': list_commas, 'perfilid': perfil.id, 'telefono': tel, 'nombre': userObject.first_name+" "+userObject.last_name, 'email': userObject.email})
        return render(request, 'manager.html',
                      {'usuarios': Users})


_Manager_old = Manager_old.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Manager(View):

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        Usuarios = Perfil.objects.filter(
            user__is_active=True, user__is_staff=False)

        Users = []
        filtro = request.GET.get('filtro', None)
        filtro_listas = request.GET.get('filtro_listas', None)

        if filtro_listas == "_ALL_":
            filtro_listas = None
        if filtro_listas:
            filtro = filtro_listas
        Listas_diferentes = []
        for perfil in Usuarios:
            userObject = perfil.user
            tel = ''
            if perfil.telefono is not None and perfil.telefono != '':
                tel = perfil.telefono
            x = Lista.objects.filter(contactos=perfil)
            listas = []
            for l in x:
                if(l not in Listas_diferentes):
                    Listas_diferentes.append(l)
                listas.append(l.nombre)
            list_commas = ", ".join(listas)
            #print (userObject.username,": ",list_commas)
            add = True
            username = userObject.first_name+" "+userObject.last_name
            if(filtro):
                add = False
                if(filtro_listas is None and filtro in tel):
                    add = True
                elif(filtro.upper() in list_commas.upper()):
                    add = True
                elif(filtro_listas is None and filtro.upper() in username.upper()):
                    add = True
                elif(filtro_listas is None and filtro.upper() in userObject.email.upper()):
                    add=True
            if add:
                Users.append({
                    # 'rfc':perfil.rfc,
                    'userid': userObject.id, 'listas': list_commas, 'perfilid': perfil.id, 'telefono': tel, 'nombre': username, 'email': userObject.email})
        listas_html = """
        <form id="form4" name="form4"  method="GET" action="/manager">
        <div class="input-field ">
        <select id="filtro_listas" name="filtro_listas">
        <option value="_ALL_" """
        if filtro_listas is None:
            listas_html += " selected>Todas</option> "
        else:
            listas_html += ">Todas</option> "
        for l in Listas_diferentes:
            listas_html += '<option value="'+l.nombre+'"'
            #print('buscando: ',filtro_listas,' en:',l.nombre)
            if filtro_listas and filtro_listas == l.nombre:
                listas_html += ' selected '
            listas_html += '" >'+l.nombre+'</option> '
        listas_html += """
        </select>
        <label>Listas</label>
        </div>
        </form>
        """
        mytabla = UsuariosTabla(Users, Listas_html=listas_html)

        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})

        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("reporte_table.{}".format(export_format))
        #print(Users)
        if filtro is None:
            filtro = ""
        if filtro_listas:
            filtro = ""

        return render(request, 'manager2.html',
                      {'usuarios': mytabla, 'filtro': filtro, "export_formats": ['csv', 'xlsx']})


_Manager = Manager.as_view()
class ExcelImporter():
    def parserexcel(self,FileObject):
        input_excel=FileObject.archivo
        workbook = xlrd.open_workbook(
            file_contents=input_excel.read(), on_demand=True, encoding_override='utf8')
        worksheet = workbook.sheet_by_index(0)

        first_row = []  # Header
        map_columns=[]
        for col in range(worksheet.ncols):
            mycol=ColumnasImport.objects.get(archivo=FileObject,col_number=col)
            #print(mycol.column_name)
            first_row.append(mycol.column_name)
            map_columns.append(mycol.column_map)
        #print(first_row)
        #print(map_columns)
        data=[]
        for row in range(1, worksheet.nrows):
            elm = {}
            add=False
            for col in range(worksheet.ncols):
                elm[col] = worksheet.cell_value(row, col)
                if map_columns[col]==0:
                    elm[col]=None
                elif(map_columns[col]) == 4:
                    elm[col] = int(worksheet.cell_value(row, col))
                else:
                    elm[col] = worksheet.cell_value(row, col)

                if len(str(worksheet.cell_value(row, col)))>0:
                    add=True
            if add: 
                data.append(elm)
        total_contactos=len(data)
        contactos_nuevos=0
        contactos_modificados=0
        contactos_warning=0
        contactos_error=0
        contador=0
        for row in data:
            contador+=1
            first_name=''
            last_name=''
            warning=False
            #if True:
            try:
                #print(row)
                nusr = None
                nperf = None
                tipo_contacto=0
                email = str(row[map_columns.index(3)]).strip()
                password = 'jdXYZ12345'
                
                first_name = str(row[map_columns.index(1)]).strip()
                last_name=''
                if 2 in map_columns:
                    last_name = str(row[map_columns.index(2)]).strip()
                Nuevo = True
                telefono = ''
                error=''
                if (4 not in map_columns or row[map_columns.index(4)] == ''):
                    error='Teléfono no encontrado'
                    tipo_contacto=4
                elif len(str(row[map_columns.index(4)]))!=10:
                    error="Teléfono "+str(row[map_columns.index(4)])+" incorrecto, es necesario a 10 dígitos"
                    tipo_contacto=4
                else:
                    if User.objects.filter(username__iexact=email).exists():
                        nusr = User.objects.get(username__iexact=email)
                        Nuevo = False
                        tipo_contacto=1
                    if Perfil.objects.filter(user__username__iexact=email).exists():
                        nperf = Perfil.objects.get(user=nusr)
                    if nusr is None:
                        nusr = User()
                    if(Nuevo or password != 'jdXYZ12345'):
                        nusr.set_password(password)
                    nusr.username = email
                    nusr.email = email
                    nusr.first_name = first_name
                    nusr.last_name = last_name
                    nusr.save()
                    if nperf is None:
                        nperf = Perfil()
                    nperf.user = nusr

                    if (4 in map_columns and row[map_columns.index(4)] != ''):
                        telefono = row[map_columns.index(4)]
                        if(type(telefono) is float):
                            telefono = int(telefono)
                        telefono = str(telefono).strip()
                    campo1 = ''
                    campo2 = ''
                    campo3 = ''
                    listas = ''
                    if (5 in map_columns and row[map_columns.index(5)] != ''):
                        campo1 = row[map_columns.index(5)]
                        campo1 = str(campo1).strip()
                    if (6 in map_columns and row[map_columns.index(6)] != ''):
                        campo2 = row[map_columns.index(6)]
                        campo2 = str(campo2).strip()
                    if (7 in map_columns and row[map_columns.index(7)] != ''):
                        campo3 = row[map_columns.index(7)]
                        campo3 = str(campo3).strip()
                    listas=''
                    if FileObject.to_list is None:
                        if FileObject.listas_multiples is not None:
                            listas=FileObject.listas_multiples
                           
                    else:
                        mylist=FileObject.to_list.nombre
                        listas=mylist
                    nperf.telefono = telefono
                    nperf.empresa = campo1
                    nperf.direccion = campo2
                    nperf.notas = campo3
                    nperf.wap_id = None
                    nperf.save()
                    if(Nuevo and listas != ''):
                        listasv = listas.split(',')
                        for l in listasv:
                            l = l.strip()
                            l_object = Lista.objects.filter(
                                activo=True, nombre=l).first()
                            if (l_object):
                                l_object.contactos.add(nperf)
                                l_object.save()
                    else:
                        listasv = []
                        if(listas != ''):
                            listasv = listas.split(',')
                            i = 0
                            for k in listasv:
                                listasv[i] = k.strip()
                                i += 1
                        ListasSelected = []
                        lsts = Lista.objects.filter(activo=True, contactos=nperf)
                        comment_list=''
                        for lts in lsts:
                            ListasSelected.append(lts.nombre)
                        for myls in listasv:
                            if myls in ListasSelected:
                                #if FileObject.to_list is None:
                                ListasSelected.remove(myls)
                                #print("found:")
                                #print(myls)
                            else:
                                try:
                                    l_object = Lista.objects.filter(
                                        activo=True, nombre=myls).first()
                                    l_object.contactos.add(nperf)
                                    l_object.save()
                                    #print("add")
                                    #print(myls)
                                except:
                                    if(comment_list!=''):
                                        comment_list+=", "
                                    comment_list+=myls
                                    warning=True

                                
                                
                        #Removiendo listas que no estan en excel
                        #Si es to_add se ignora este codigo
                        #if FileObject.to_list is None:
                        #    for torm in ListasSelected: 
                        #        l_object = Lista.objects.filter(
                        #            activo=True, nombre=torm).first()
                        #        print("removing:")
                        #        l_object.contactos.remove(nperf)
                        #        l_object.save()
            except:
                print ('User Error')
                tipo_contacto=4
                error='Error no indentificado'
            if(tipo_contacto==0):
                contactos_nuevos+=1
            elif(tipo_contacto==1):
                contactos_modificados+=1
            else:
                contactos_error+=1
                IC=ImportContact(fila=contador,archivo=FileObject,nombre=first_name+' '+last_name,comentario=error,error=1)
                IC.save()
                
            if(warning):
                contactos_warning+=1
                IC=ImportContact(fila=contador,archivo=FileObject,nombre=first_name+' '+last_name,comentario='Listas no encontradas:'+comment_list,error=2)
                IC.save()                
        print('nuevos:',contactos_nuevos)
        print('modificados:',contactos_modificados)
        print('warning:',contactos_warning)
        print('error:',contactos_error)
        FileObject.total_contactos=total_contactos
        FileObject.contactos_nuevos=contactos_nuevos
        FileObject.contactos_actualizados=contactos_modificados
        FileObject.contactos_warning=contactos_warning
        FileObject.contactos_error=contactos_error
        FileObject.estado=2
        FileObject.save()
        
@method_decorator(staff_member_required, name='dispatch')
class ShowImportResults(View):
    def get(self,request,id):
        import_object=ImportFile.objects.get(pk=id)
        show_errores=False
        if( import_object.contactos_error+import_object.contactos_warning)>0:
            show_errores=True
        contactos_error=ImportContact.objects.filter(archivo=import_object)

        mytabla = Lista_Errores_Import_Tabla(contactos_error)
        config = RequestConfig(
            request, paginate={"per_page": settings.ROWS_PER_PAGE})
        config.configure(mytabla)
        export_format = request.GET.get("_export", None)
        if TableExport.is_valid_format(export_format):
            # if(export_format=='csv'):
            exporter = TableExport(export_format, mytabla)
            return exporter.response("reporte_errores.{}".format(export_format))


        return render(request, 'excelimportv2_results.html', {'tabla':mytabla,'import_object': import_object,'show_errores':show_errores,"export_formats": ['csv', 'xlsx']})
_ShowImportResults=ShowImportResults.as_view()



        
            
@method_decorator(staff_member_required, name='dispatch')
class ImportColumnsExcelV2(View):
    def post(self,request,id):
        if 'action' not in request.POST:
            import_object=ImportFile.objects.get(pk=id)
            import_object.estado=5
            import_object.save()
            if import_object.to_list is not None:
                return redirect('Lista_Create')
            return redirect('Manager')
        else:
            for pst in request.POST:
                v=pst.split('_')
                try:
                    if v[0]=='col':
                        colid=int(v[1])
                        Columna=ColumnasImport.objects.get(pk=colid)
                        valor=request.POST[pst]
                        Columna.column_map=int(valor)
                        Columna.save()

                except:
                    print('error column')
            import_object=ImportFile.objects.get(pk=id)
            if import_object.to_list is None:
                import_object.listas_multiples=None
                listas=None
                if ('listas' in request.POST):
                    listas=request.POST.getlist('listas')
                
                if listas:
                    listas=",".join(listas)
                import_object.listas_multiples=listas


                
            else:
                import_object.listas_multiples=None
            import_object.save()
            parser=ExcelImporter()
            res=parser.parserexcel(import_object)
            return redirect('Import_Results',import_object.id)
            


            
    def get(self,request,id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        import_object=ImportFile.objects.get(pk=id)
        if import_object.estado==2:
            return redirect('Import_Results',id)
        if import_object.estado!=0:
            return redirect('Manager')
        archivo=import_object.archivo.name
        columns_ids=((0,'NO USAR'),(1,'NOMBRES'),(2,'APELLIDOS'),(3,'CORREO'),(4,'TELEFONO'),(5,'EMPRESA'),(6,'DIRECCION'),(7,'NOTAS'),(8,'LISTAS'))
        opciones=[{'id':0,'name':'NO USAR'},
                    {'id':1,'name':'NOMBRES'},
                   {'id':2,'name':'APELLIDOS'},
                   {'id':3,'name':'CORREO'},
                   {'id':4,'name':'TELEFONO'},
                   {'id':5,'name':'EMPRESA'},
                   {'id':6,'name':'DIRECCION'},
                   {'id':7,'name':'NOTAS'},
                    ]


        lista_import=None
        if import_object.to_list:
            lista_import=import_object.to_list.nombre
        columnas=ColumnasImport.objects.filter(archivo=import_object)
        listas=None
        listas=Lista.objects.filter(activo=True)

        return render(request, 'excelimportv2_columns.html', {'listas':listas,'columnas':columnas,'opciones':opciones,'lista_import':lista_import,'archivo':archivo,'id': id,'import_objetc':import_object})
_ImportColumnsExcelV2=ImportColumnsExcelV2.as_view()
@method_decorator(staff_member_required, name='dispatch')
class ExcelV2(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        ImportsObjects=ImportFile.objects.filter(user=request.user,estado=0)
        if len(ImportsObjects)>0:
            first=ImportsObjects.first()
            return redirect('ImportColumnsExcelV2',first.id)
        return render(request, 'excelimportv2.html', {'id': None})

    def post(self, request):
        #print(request.POST)
        if('archivo' not in request.POST or request.POST['archivo'] is None or request.POST['archivo'] == ''):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')
        if(request.FILES == [] or request.FILES == None):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')

        extension = os.path.splitext(request.POST['archivo'])[1]
        IMPORT_FILE_TYPES = ['.csv', '.xls', '.xlsx']
        if not (extension in IMPORT_FILE_TYPES):
            messages.success(request, 'Extension no soportada',
                             extra_tags='red')  # <-

            return redirect('Excel')
        if('myfile' not in request.FILES):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')

        input_excel = request.FILES['myfile']
        tituloimage=str(request.user.id)+'_'+request.FILES['myfile']._name
        File_Object=ImportFile(user=request.user)
        File_Object.nombre_original=request.FILES['myfile']._name
        workbook = xlrd.open_workbook(
            file_contents=input_excel.read(), on_demand=True, encoding_override='utf8')
        File_Object.archivo.save( tituloimage,request.FILES['myfile'])
        File_Object.save()

        worksheet = workbook.sheet_by_index(0)
        nombres_columnas = [['NADA'],['NOMBRES','NOMBRE'], ['APELLIDOS','APELLIDO'], ['CORREO','EMAIL'], ['TELEFONO','CELULAR'],['CAMPO1','EMPRESA'],['CAMPO2','DIRECCION'],['CAMPO3','NOTAS'],['LISTAS'],['LISTA']]

        first_row = []  # Header
        for col in range(worksheet.ncols):
            nombre_col=smart_str(worksheet.cell_value(0, col)).strip()
            if len(nombre_col)==0:
                nombre_col='COL_'+str(col)
            indicecol=0
            iteracol=0
            for nc in nombres_columnas:
                test=str.upper(nombre_col)
                for ni in  nc:
                    if test==ni:
                        indicecol=iteracol
                iteracol+=1

            first_row.append(
                str.upper(nombre_col))
            
            columnafile=ColumnasImport(archivo=File_Object,col_number=col,column_name=nombre_col,column_map=indicecol)
            columnafile.save()
        #print(first_row)
        # tronsform the workbook to a list of dictionnaries
        data=[]


        for row in range(1, worksheet.nrows):
            elm = {}
            add=False
            for col in range(worksheet.ncols):
                    elm[col] = worksheet.cell_value(row, col)
                    if len(str(worksheet.cell_value(row, col)))>0:
                        add=True
            if add: 
                data.append(elm)
        # VALIDACION
        File_Object.total_contactos=len(data)
        File_Object.save()
        return redirect('ImportColumnsExcelV2',File_Object.id)



_ExcelV2 = ExcelV2.as_view()

@method_decorator(staff_member_required, name='dispatch')
class ExcelV2List(View):
    def get(self, request,id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        ImportsObjects=ImportFile.objects.filter(user=request.user,estado=0)
        if len(ImportsObjects)>0:
            first=ImportsObjects.first()
            return redirect('ImportColumnsExcelV2',first.id)
        mylista = Lista.objects.get(pk=id)
        titulo = mylista.nombre
        return render(request, 'excelimportv2_lista.html', {'id': id,'titulo':titulo,'mylista':mylista,'lista_id':id})

    def post(self, request,id):
        #print(request.POST)
        if('archivo' not in request.POST or request.POST['archivo'] is None or request.POST['archivo'] == ''):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel',id)
        if(request.FILES == [] or request.FILES == None):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel',id)

        extension = os.path.splitext(request.POST['archivo'])[1]
        IMPORT_FILE_TYPES = ['.csv', '.xls', '.xlsx']
        if not (extension in IMPORT_FILE_TYPES):
            messages.success(request, 'Extension no soportada',
                             extra_tags='red')  # <-

            return redirect('Lista_Import_Excel',id)
        if('myfile' not in request.FILES):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel',id)

        input_excel = request.FILES['myfile']
        tituloimage=str(request.user.id)+'_'+request.FILES['myfile']._name
        File_Object=ImportFile(user=request.user)
        File_Object.nombre_original=request.FILES['myfile']._name
        workbook = xlrd.open_workbook(
            file_contents=input_excel.read(), on_demand=True, encoding_override='utf8')
        File_Object.archivo.save( tituloimage,request.FILES['myfile'])
        File_Object.save()

        worksheet = workbook.sheet_by_index(0)
        nombres_columnas = [['NADA'],['NOMBRES','NOMBRE'], ['APELLIDOS','APELLIDO'], ['CORREO','EMAIL'], ['TELEFONO','CELULAR'],['CAMPO1','EMPRESA'],['CAMPO2','DIRECCION'],['CAMPO3','NOTAS']]

        first_row = []  # Header
        for col in range(worksheet.ncols):
            nombre_col=smart_str(worksheet.cell_value(0, col)).strip()
            if len(nombre_col)==0:
                nombre_col='COL_'+str(col)
            indicecol=0
            iteracol=0
            for nc in nombres_columnas:
                test=str.upper(nombre_col)
                for ni in  nc:
                    if test==ni:
                        indicecol=iteracol
                iteracol+=1

            first_row.append(
                str.upper(nombre_col))
            
            columnafile=ColumnasImport(archivo=File_Object,col_number=col,column_name=nombre_col,column_map=indicecol)
            columnafile.save()
        #print(first_row)
        # tronsform the workbook to a list of dictionnaries
        data=[]


        for row in range(1, worksheet.nrows):
            elm = {}
            add=False
            for col in range(worksheet.ncols):
                    elm[col] = worksheet.cell_value(row, col)
                    if len(str(worksheet.cell_value(row, col)))>0:
                        add=True
            if add: 
                data.append(elm)
        # VALIDACION
        File_Object.total_contactos=len(data)
        File_Object.to_list_id=id
        File_Object.save()
        return redirect('ImportColumnsExcelV2',File_Object.id)



_ExcelV2List = ExcelV2List.as_view()

@method_decorator(staff_member_required, name='dispatch')
class Excel(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        return render(request, 'excelimport.html', {'id': None})

    def post(self, request):
        #print(request.POST)
        if('archivo' not in request.POST or request.POST['archivo'] is None or request.POST['archivo'] == ''):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')
        if(request.FILES == [] or request.FILES == None):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')

        extension = os.path.splitext(request.POST['archivo'])[1]
        IMPORT_FILE_TYPES = ['.csv', '.xls', '.xlsx']
        if not (extension in IMPORT_FILE_TYPES):
            messages.success(request, 'Extension no soportada',
                             extra_tags='red')  # <-

            return redirect('Excel')
        if('myfile' not in request.FILES):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')

        input_excel = request.FILES['myfile']
        workbook = xlrd.open_workbook(
            file_contents=input_excel.read(), on_demand=True, encoding_override='utf8')
        worksheet = workbook.sheet_by_index(0)
        first_row = []  # Header
        for col in range(worksheet.ncols):
            first_row.append(
                str.upper(smart_str(worksheet.cell_value(0, col))).strip())
        #print(first_row)
        # tronsform the workbook to a list of dictionnaries
        nombres_columnas = ['NOMBRES', 'APELLIDOS', 'CORREO', 'TELEFONO']
        data = []
        for col in nombres_columnas:
            if(col not in first_row):
                messages.success(
                    request, 'Columna no encontrada: '+col, extra_tags='red')  # <-

                return redirect('Excel')

        for row in range(1, worksheet.nrows):
            elm = {}
            for col in range(worksheet.ncols):
                if(first_row[col]) == 'NUM_EMPLEADO':
                    elm[first_row[col]] = int(worksheet.cell_value(row, col))
                elif(first_row[col]) == 'FECHA_NACIMIENTO':
                    elm[first_row[col]] = datetime.datetime(
                        *xlrd.xldate_as_tuple(worksheet.cell_value(row, col), workbook.datemode)).date().isoformat()
                else:
                    elm[first_row[col]] = worksheet.cell_value(row, col)

            data.append(elm)
        # VALIDACION
        contador = 0

        for row in data:
            try:
                #print(row)
                nusr = None
                nperf = None
                email = str(row['CORREO']).strip()
                password = 'jdXYZ12345'
                first_name = str(row['NOMBRES']).strip()
                last_name = str(row['APELLIDOS']).strip()
                Nuevo = True
                telefono = ''

                if User.objects.filter(username__iexact=email).exists():
                    nusr = User.objects.get(username__iexact=email)
                    Nuevo = False
                if Perfil.objects.filter(user__username__iexact=email).exists():
                    nperf = Perfil.objects.get(user=nusr)
                if nusr is None:
                    nusr = User()
                if(Nuevo or password != 'jdXYZ12345'):
                    nusr.set_password(password)
                nusr.username = email
                nusr.email = email
                nusr.first_name = first_name
                nusr.last_name = last_name
                nusr.save()
                if nperf is None:
                    nperf = Perfil()
                nperf.user = nusr

                if ('TELEFONO' in row and row['TELEFONO'] != ''):
                    telefono = row['TELEFONO']
                    if(type(telefono) is float):
                        telefono = int(telefono)
                    telefono = str(telefono).strip()
                campo1 = ''
                campo2 = ''
                campo3 = ''
                listas = ''
                if ('CAMPO1' in row and row['CAMPO1'] != ''):
                    campo1 = row['CAMPO1']
                    campo1 = str(campo1).strip()
                if ('CAMPO2' in row and row['CAMPO2'] != ''):
                    campo2 = row['CAMPO2']
                    campo2 = str(campo2).strip()
                if ('CAMPO3' in row and row['CAMPO3'] != ''):
                    campo3 = row['CAMPO3']
                    campo3 = str(campo3).strip()
                if ('LISTAS' in row and row['LISTAS'] != ''):
                    listas = row['LISTAS']
                    listas = listas.strip()
                nperf.telefono = telefono
                nperf.empresa = campo1
                nperf.direccion = campo2
                nperf.notas = campo3
                nperf.wap_id = None
                nperf.save()
                contador = contador+1
                if(Nuevo and listas != ''):
                    listasv = listas.split(',')
                    for l in listasv:
                        l = l.strip()
                        l_object = Lista.objects.filter(
                            activo=True, nombre=l).first()
                        if (l_object):
                            l_object.contactos.add(nperf)
                            l_object.save()
                else:
                    listasv = []
                    if(listas != ''):
                        listasv = listas.split(',')
                        i = 0
                        for k in listasv:
                            listasv[i] = k.strip()
                            i += 1
                    ListasSelected = []
                    lsts = Lista.objects.filter(activo=True, contactos=nperf)
                    for lts in lsts:
                        ListasSelected.append(lts.nombre)
                    for myls in listasv:
                        if myls in ListasSelected:
                            ListasSelected.remove(myls)
                            #print("found:")
                            #print(myls)
                        else:
                            try:
                                l_object = Lista.objects.filter(
                                    activo=True, nombre=myls).first()
                                l_object.contactos.add(nperf)
                                l_object.save()
                                #print("add")
                                #print(myls)
                            except:
                                print("lista not found")
                                messages.success(
                                    request, 'Lista no encontrada:' + myls, extra_tags='red')  # <-

                    for torm in ListasSelected:
                        l_object = Lista.objects.filter(
                            activo=True, nombre=torm).first()
                        print("removing:")
                        #print(torm)
                        l_object.contactos.remove(nperf)
                        l_object.save()

            except:

                messages.success(
                    request, 'No se pudo crear/modificar : ' + row['NOMBRES'], extra_tags='red')  # <-
        messages.success(request, "Se cargaron " +
                         str(contador)+" empleados", extra_tags="blue")

        return redirect('Manager')


_Excel = Excel.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Delete_Lista(View):
    def post(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        if 'lista_id' not in request.POST:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-
            return redirect('Manager')
        try:
            template = Lista.objects.get(pk=request.POST['lista_id'])
            template.activo = False
            template.save()
        except:
            messages.success(
                request, 'Hubo un error al borrar la lista', extra_tags='red')  # <-
            return redirect('Whatsapp_Create')
        messages.success(
            request, 'Lista Eliminada correctamente', extra_tags='blue')  # <-

        return redirect('Lista_Create')


_Delete_Lista = Delete_Lista.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Delete_Template(View):
    def post(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        if 'template_id' not in request.POST:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-
            return redirect('Whatsapp_Create')
        try:
            template = Plantilla.objects.get(pk=request.POST['template_id'])
            dialog=Dialog360()
            dialog.delete_template_waba(template.titulo)
            template.borrado=True
            template.save()
        except:
            messages.success(
                request, 'Hubo un error al borrar el template', extra_tags='red')  # <-
            return redirect('Whatsapp_Create')
        messages.success(
            request, 'Template Eliminado correctamente', extra_tags='blue')  # <-

        return redirect('Whatsapp_Create')


_Delete_Template = Delete_Template.as_view()


@method_decorator(staff_member_required, name='dispatch')
class Delete(View):
    def post(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        if 'user_id' not in request.POST:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-
            return redirect('Manager')
        try:
            usuario = User.objects.get(id=request.POST['user_id'])
            perfil = Perfil.objects.get(user=usuario)
            contactos = Campaign_contacto.objects.filter(perfil=perfil)
            for c in contactos:
                c.perfil = None
                c.save()
            perfil.delete()
            usuario.delete()
        except:
            messages.success(
                request, 'Hubo un error al borrar al usuario', extra_tags='red')  # <-
            return redirect('Manager')
        messages.success(
            request, 'Usuario Eliminado correctamente', extra_tags='blue')  # <-

        return redirect('Manager')


_Delete = Delete.as_view()


@method_decorator(staff_member_required, name='dispatch')
class NewEmp(View):
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        Users = []
        Listas = []
        lsts = Lista.objects.filter(activo=True)
        for lista in lsts:
            Listas.append(lista.nombre)
        return render(request, 'new_emp.html',
                      {'usuarios': Users, 'listas': dumps(Listas)})

    def post(self, request):

        # print(request.POST)
        campos = ['email', 'telefono', 'first_name', 'last_name']
        for i in campos:
            if i not in request.POST:
                messages.success(
                    request, 'Hubo un error en sus parámetros:'+i, extra_tags='red')  # <-
                return redirect('New')
        if User.objects.filter(email__iexact=request.POST['email']).exists():
            messages.success(request, 'Correo existente',
                             extra_tags='red')  # <-
            return redirect('New')
        if User.objects.filter(username__iexact=request.POST['email']).exists():
            messages.success(request, 'Usuario existente',
                             extra_tags='red')  # <-
            return redirect('New')
        if Perfil.objects.filter(telefono__iexact=request.POST['telefono']).exists():
            messages.success(request, 'Telefono existente',
                             extra_tags='red')  # <-
            return redirect('New')
        password = 'jdXYZ12345'
        email = request.POST['email']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']

        campo1 = request.POST['campo1']
        campo2 = request.POST['campo2']
        campo3 = request.POST['campo3']
        telefono = request.POST['telefono']
        listas = smart_str(request.POST['listas']).strip()
        listasv = []
        if listas != "":
            listasv = json.loads(listas)

        try:
            nusr = User()
            nusr.set_password(password)
            nusr.username = email
            nusr.email = email
            nusr.first_name = first_name
            nusr.last_name = last_name
            nusr.save()
            nperf = Perfil()
            nperf.user = nusr
            nperf.empresa = campo1
            nperf.direccion = campo2
            nperf.notas = campo3
            nperf.telefono = telefono
            nperf.wap_id = None
            nperf.save()
            for l in listasv:
                l_object = Lista.objects.filter(activo=True, nombre=l).first()
                l_object.contactos.add(nperf)
                l_object.save()

        except:

            if(nperf and nperf.id):
                nperf.delete()
            if (nusr and nusr.id):
                nusr.delete()

            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-
            return redirect('New')

        messages.success(
            request, 'Se creó el usuario con éxito!', extra_tags='blue')  # <-
        return redirect('Manager')


_NewEmp = NewEmp.as_view()


@method_decorator(staff_member_required, name='dispatch')
class EditEmp(View):
    def get(self, request, id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        try:
            usuario = User.objects.get(id=id)
            perfil = Perfil.objects.get(user=usuario)

        except:
            messages.success(
                request, 'Hubo un error al editar al usuario', extra_tags='red')  # <-
            return redirect('Manager')
        lista_origen=request.GET.get('list',None)

        lsts = Lista.objects.filter(activo=True)
        Listas = []
        for lista in lsts:
            Listas.append(lista.nombre)
        ListasSelected = []
        lsts = Lista.objects.filter(activo=True, contactos=perfil)
        for lista in lsts:
            ListasSelected.append(lista.nombre)

        return render(request, 'edit_emp.html',
                      {'lista_origen':lista_origen,'usuario': usuario, 'user_id': id, 'perfil': perfil, 'listas': dumps(Listas), 'listas_selected': dumps(ListasSelected)})

    def post(self, request, id):

        #print(request.POST)
        campos = ['email', 'telefono']
        lista_origen=request.POST.get('lista_origen',None)

        for i in campos:
            if i not in request.POST:
                messages.success(
                    request, 'Hubo un error en sus parámetros: '+i, extra_tags='red')  # <-
                return redirect('Edit', id=id)
        if User.objects.filter(email__iexact=request.POST['email']).exclude(id=id).exists():
            messages.success(request, 'Correo existente',
                             extra_tags='alert')  # <-
            if lista_origen:
                return redirect ('/edit/'+id+'/?list='+lista_origen)
            else:
                return redirect('Edit', id=id)
        if User.objects.filter(username__iexact=request.POST['email']).exclude(id=id).exists():
            messages.success(request, 'Usuario existente',
                             extra_tags='red')  # <-
            if lista_origen:
                return redirect ('/edit/'+id+'/?list='+lista_origen)
            else:
                return redirect('Edit', id=id)
        #if Perfil.objects.filter(telefono__iexact=request.POST['telefono']).exclude(user_id=id).exists():
        #    messages.success(request, 'Telefono existente',
        #                     extra_tags='red')  # <-
        #    return redirect('Edit', id=id)
        email = request.POST['email']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        telefono = request.POST['telefono']
        campo1 = request.POST['campo1']
        campo2 = request.POST['campo2']
        campo3 = request.POST['campo3']
        try:
            nusr = User.objects.get(id=id)
            nperf = Perfil.objects.get(user=nusr)
            nusr.username = email
            nusr.email = email
            nusr.first_name = first_name
            nusr.last_name = last_name
            nusr.save()
            nperf.user = nusr
            nperf.empresa = campo1
            nperf.direccion = campo2
            nperf.notas = campo3
            nperf.telefono = telefono
            nperf.wap_id = None
            ListasSelected = []
            lsts = Lista.objects.filter(activo=True, contactos=nperf)
            for lts in lsts:
                ListasSelected.append(lts.nombre)
            listas = smart_str(request.POST['listas']).strip()
            listasv = []
            if listas != "":
                listasv = json.loads(listas)
            for myls in listasv:
                if myls in ListasSelected:
                    ListasSelected.remove(myls)
                    print("found:")
                else:
                    l_object = Lista.objects.filter(
                        activo=True, nombre=myls).first()
                    l_object.contactos.add(nperf)
                    l_object.save()
                    print("add")
            for torm in ListasSelected:
                l_object = Lista.objects.filter(
                    activo=True, nombre=torm).first()
                print("removing:")
                l_object.contactos.remove(nperf)

            for lista in lsts:
                ListasSelected.append(lista.nombre)

            nperf.save()
        except:
            messages.success(
                request, 'Hubo un error en sus parámetros', extra_tags='red')  # <-
            if lista_origen:
                return redirect ('/edit/'+id+'/?list='+lista_origen)
            else:
                return redirect('Edit', id=id)

        messages.success(
            request, 'Se actualizo el usuario con éxito!', extra_tags='blue')  # <-
        if lista_origen:
            return redirect ('Lista_Empleados',id=lista_origen)
        else:
            return redirect('Manager')


_EditEmp = EditEmp.as_view()


class Inbenta(View):
    @xframe_options_exempt
    def get(self, request):
        if not request.user.is_authenticated:

            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        return render(request, 'chatbot-holder.html', {'jd': 'ok'})


_Inbenta = Inbenta.as_view()


class Chat(View):
    @xframe_options_exempt
    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        user = request.user
        RFC = 'ND'
        NSS = 'ND'
        CURP = 'ND'
        PERFIL = 0
        first_name = user.first_name
        last_name = user.last_name
        try:
            perfil = Perfil.objects.get(user=user)

            if perfil.perf_emp == 'PV':
                PERFIL = 3
            elif perfil.perf_emp == 'ADM':
                PERFIL = 2
            elif perfil.perf_emp == 'SIN':
                PERFIL = 4
        except:
            PERFIL = 0
        datos = {'id': user.id, 'first_name': first_name, 'last_name': last_name,
                 'RFC': RFC, 'NSS': NSS, 'CURP': CURP, 'PERFIL': PERFIL}

        return render(request, 'chatbot.html', datos)


_Chat = Chat.as_view()


class ListaImportExcel(View):
    def get(self, request, id):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        if(not request.user.is_staff):
            return redirect('Inbenta')
        mylista = Lista.objects.get(pk=id)
        titulo = mylista.nombre
        return render(request, 'listaimportexcel.html', {'titulo': titulo, 'mylista': mylista, 'lista_id': id})

    def post(self, request, id):
        #print(request.POST)
        if('archivo' not in request.POST or request.POST['archivo'] is None or request.POST['archivo'] == ''):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel', id)
        if('LISTAS' not in request.POST):
            messages.success(request, 'Error en parametros',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel', id)
        if(request.FILES == [] or request.FILES == None):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Lista_Import_Excel', id)

        extension = os.path.splitext(request.POST['archivo'])[1]
        IMPORT_FILE_TYPES = ['.csv', '.xls', '.xlsx']
        if not (extension in IMPORT_FILE_TYPES):
            messages.success(request, 'Extension no soportada',
                             extra_tags='red')  # <-

            return redirect('Excel')
        if('myfile' not in request.FILES):
            messages.success(request, 'Archivo no valido',
                             extra_tags='red')  # <-
            return redirect('Excel')

        input_excel = request.FILES['myfile']
        workbook = xlrd.open_workbook(
            file_contents=input_excel.read(), on_demand=True, encoding_override='utf8')
        worksheet = workbook.sheet_by_index(0)
        first_row = []  # Header
        for col in range(worksheet.ncols):
            first_row.append(
                str.upper(str(worksheet.cell_value(0, col))).strip())
        # tronsform the workbook to a list of dictionnaries
        nombres_columnas = ['NOMBRES', 'APELLIDOS', 'CORREO', 'TELEFONO']
        data = []
        for col in nombres_columnas:
            if(col not in first_row):
                messages.success(
                    request, 'Columna no encontrada: '+col, extra_tags='red')  # <-

                return redirect('Excel')

        for row in range(1, worksheet.nrows):
            elm = {}
            for col in range(worksheet.ncols):
                if(first_row[col]) == 'NUM_EMPLEADO':
                    elm[first_row[col]] = int(worksheet.cell_value(row, col))
                elif(first_row[col]) == 'FECHA_NACIMIENTO':
                    elm[first_row[col]] = datetime.datetime(
                        *xlrd.xldate_as_tuple(worksheet.cell_value(row, col), workbook.datemode)).date().isoformat()
                else:
                    elm[first_row[col]] = worksheet.cell_value(row, col)

            data.append(elm)
        # VALIDACION
        contador = 0

        for row in data:
            try:
                nusr = None
                nperf = None
                email = str(row['CORREO']).strip()
                password = 'jdXYZ12345'
                first_name = str(row['NOMBRES']).strip()
                last_name = str(row['APELLIDOS']).strip()
                Nuevo = True
                telefono = ''

                if User.objects.filter(username__iexact=email).exists():
                    nusr = User.objects.get(username__iexact=email)
                    Nuevo = False
                if Perfil.objects.filter(user__username__iexact=email).exists():
                    nperf = Perfil.objects.get(user=nusr)
                if nusr is None:
                    nusr = User()
                if(Nuevo or password != 'jdXYZ12345'):
                    nusr.set_password(password)
                nusr.username = email
                nusr.email = email
                nusr.first_name = first_name
                nusr.last_name = last_name
                nusr.save()
                if nperf is None:
                    nperf = Perfil()
                nperf.user = nusr

                if ('TELEFONO' in row and row['TELEFONO'] != ''):
                    telefono = row['TELEFONO']
                    if(type(telefono) is float):
                        telefono = int(telefono)
                    telefono = str(telefono).strip()
                campo1 = ''
                campo2 = ''
                campo3 = ''
                listas = ''
                if ('CAMPO1' in row and row['CAMPO1'] != ''):
                    campo1 = row['CAMPO1']
                    campo1 = str(campo1).strip()
                if ('CAMPO2' in row and row['CAMPO2'] != ''):
                    campo2 = row['CAMPO2']
                    campo2 = str(campo2).strip()
                if ('CAMPO3' in row and row['CAMPO3'] != ''):
                    campo3 = row['CAMPO3']
                    campo3 = str(campo3).strip()
                listas = ''+id
                nperf.telefono = telefono
                nperf.empresa = campo1
                nperf.direccion = campo2
                nperf.notas = campo3
                nperf.wap_id = None
                nperf.save()
                contador = contador+1
                if(Nuevo and listas != ''):
                    listasv = listas.split(',')
                    for l in listasv:
                        l = l.strip()
                        l_object = Lista.objects.filter(
                            activo=True, id=l).first()
                        if (l_object):
                            l_object.contactos.add(nperf)
                            l_object.save()
                else:
                    listasv = []
                    if(listas != ''):
                        listasv = listas.split(',')
                        i = 0
                        for k in listasv:
                            listasv[i] = k.strip()
                            i += 1
                    ListasSelected = []
                    lsts = Lista.objects.filter(activo=True, contactos=nperf)
                    for lts in lsts:
                        ListasSelected.append(lts.nombre)
                    for myls in listasv:
                        if myls in ListasSelected:
                            ListasSelected.remove(myls)
                            print("found:")
                        else:
                            try:
                                l_object = Lista.objects.filter(
                                    activo=True, id=myls).first()
                                l_object.contactos.add(nperf)
                                l_object.save()
                                print("add")
                            except:
                                print("lista not found")
                                messages.success(
                                    request, 'Lista no encontrada:' + myls, extra_tags='red')  # <-

            except:

                messages.success(
                    request, 'No se pudo crear/modificar : ' + row['NOMBRES'], extra_tags='red')  # <-
        messages.success(request, "Se cargaron " +
                         str(contador)+" empleados", extra_tags="blue")

        return redirect('Lista_Create')


_ListaImportExcel = ListaImportExcel.as_view()
