from __future__ import unicode_literals
import json
import requests
from api.models import Perfil, User,Plantilla as M_Plantillas
from django.conf import settings
import re
import requests
import random


class Dialog360():
    api_key = settings.D360_APIKEY

    name_space = settings.D360_NAMESPACE
    last_error=""


    def get_params_perfil(self,texto,per):
        params=re.findall(r"{\w+}",texto)
        paramsv=[]
        if len(params)==0:
            return False
        
        if per == None:
            return False
        for i in params:
            if i.upper()=='{NOMBRE}':
                firstname='NOMBRE'
                if per.user.first_name is not None and per.user.first_name!='':
                    firstname=per.user.first_name
                paramsv.append({'type':'text','text':firstname})
            if i.upper()=='{APELLIDOS}':
                lastname='APELLIDOS'
                if per.user.last_name!='' and per.user.last_name is not None:
                    lastname=per.user.last_name
                paramsv.append({'type':'text','text':lastname})
            if i.upper()=='{TELEFONO}':
                telefono='TELEFONO'
                if per.telefono!='' and per.telefono is not None:
                    telefono=per.telefono
                paramsv.append({'type':'text','text':telefono})
            if i.upper()=='{EMAIL}':
                email='EMAIL'
                if per.user.email is not None and per.user.email!='':
                    email=per.user.email
                paramsv.append({'type':'text','text':email})
            if i.upper()=='{CAMP1}' or i.upper()=='{EMPRESA}':
                empresa='EMPRESA'
                if per.empresa!='' and per.empresa is not None:
                    empresa=per.empresa
                paramsv.append({'type':'text','text':empresa})
            if i.upper()=='{CAMP2}' or i.upper()=='{DIRECCCION}':
                direccion='DIRECCION'
                if per.direccion is not None and per.direccion!='':
                    direccion=per.direccion
                paramsv.append({'type':'text','text':direccion})
            if i.upper()=='{CAMP3}' or i.upper()=='{NOTAS}':
                notas='NOTAS'
                if per.notas!='' and per.notas is not None:
                    notas=per.notas
                paramsv.append({'type':'text','text':notas})
        return paramsv

    def get_params(self,texto,num):
        params=re.findall(r"{\w+}",texto)
        per = None
        paramsv=[]
        if len(params)==0:
            return False
        try:
            per = Perfil.objects.filter(telefono=num).first()
        except:
            return False
        if per == None:
            return False
        return self.get_params_perfil(texto,per)
    def get_templates(self):
        headers = {'D360-API-KEY': self.api_key}
        r = requests.get('https://waba.360dialog.io/v1/configs/templates',headers=headers)
        return r.json()

    def replace_params(self,texto,replace):
        return re.sub(r"{{\w+}}",replace,texto)

    def convert_text_to_waba(self,texto):
        params=re.findall(r"{\w+}",texto)
        i=1
        
        for p in params:
            texto=texto.replace(p,'{{'+str(i)+'}}',1)
            i+=1
        return texto
    def convert_text_to_waba_example(self,texto):
        params=re.findall(r"{\w+}",texto)
       
        textos=[]
        for t in range(0,len(params)):
            textos.append('Parametro_'+str(random.randrange(1,20)))
            
        return textos
    


    def create_template_waba(self,titulo,texto,botones=None,imagen=None):
        example_text=self.convert_text_to_waba_example(texto)
        texto=self.convert_text_to_waba(texto)
        url='https://waba.360dialog.io/v1/configs/templates'
    
        payload={
        "name": titulo,
        
        "category": "ALERT_UPDATE",
        "components": [
            {
            "type": "BODY",
            "text": texto,
            }
        ],
            "language": "es_MX",

        }

        if len(example_text)>0:
            payload={
            "name": titulo,  
            "category": "ALERT_UPDATE",
            "components": [
                {
                "type": "BODY",
                "text": texto,
                "example":{"body_text":[example_text]}
                }
            ],
                "language": "es_MX",

            }

        if imagen:
            payload["components"].append(imagen)
        if botones is not None and len(botones)>0:
            payload["components"].append({'buttons':botones,'type':"BUTTONS"})
        
        #print(payload)
        headers = {'D360-API-KEY': self.api_key,'Content-Type':'application/json'}
        r = requests.post(url, data=json.dumps(payload),headers=headers)
        #print(r.json())
        #print(r.status_code)
        if r.status_code!=200 and r.status_code!=201:
            try:
                error=r.json()
                error=error["meta"]
                errors=str(error)
                
                #print("error:",error)
                self.last_error=error["developer_message"]
                if 'can only have lowercase letters' in errors and 'error_user_title' in errors:
                    self.last_error="la plantilla no acepta títulos con espacios"
                #print('last error:',self.last_error)
            except:
                self.last_error="Error no identificado"
            return False
        return True



    def delete_template_waba(self,titulo):
        headers = {'D360-API-KEY': self.api_key,'Content-Type':'application/json'}
        url='https://waba.360dialog.io/v1/configs/templates/'+titulo
        r=requests.delete(url,headers=headers)




    def update_templates(self,temp=None,create=True):
        estados={'submitted':'enviada','approved':'aprobada','rejected':'rechazada'}
        if temp == None:
            temp=self.get_templates()
        for t in temp['waba_templates']:
            plan=M_Plantillas.objects.filter(titulo=t['name'],borrado=False)
            if(len(plan)>0):
                for f in plan:
                    estado=t['status']
                    if estado in estados:
                        estado=estados[estado]
                    f.estado=estado
                    f.save()
            else:
                if create:
                    if len(t['components'])>0:
                        text=t['components'][0]['text']
                        text=self.replace_params(text,'{CAMP1}')
                        k=1
                        tipo=0
                        image=False
                        boton_url=None
                        boton_url_txt=None
                        boton_tel=None
                        boton_tel_txt=None
                        while k<len(t['components']):
                            if 'type' in t['components'][k] and 'format' in t['components'][k]:
                                if t['components'][k]['type']=='HEADER' and t['components'][k]['format']=='IMAGE':
                                    tipo=1
                                    image=True
                            if t['components'][k]['type']=="BUTTONS":
                                for boton in  t['components'][k]['buttons']:
                                    if boton['type']=='URL':
                                        boton_url=boton['url']
                                        boton_url_txt=boton['text']
                                    else:
                                        if boton['type']=='PHONE_NUMBER':
                                            boton_tel=boton['phone_number'].replace("+52","")
                                            boton_tel_txt=boton['text']
                                            
                                        
                                    
                            
                            k+=1
                        estado=t['status']
                        if estado in estados:
                            estado=estados[estado]
                        p=M_Plantillas(titulo=t['name'],texto=text,estado=estado,tipo=tipo,has_image=image,boton_tel=boton_tel,boton_tel_txt=boton_tel_txt,boton_url=boton_url,boton_url_txt=boton_url_txt)
                        p.save()




    def comprueba_num(self, num):
        per = None
        try:
            per = Perfil.objects.filter(telefono=num).first()
        except:
            return False
        if per == None:
            return False
        return self.comprueba_perf(per)
        

    def comprueba_perf(self, per):
        if per.wap_id != None:
            print("Encontrado WA_ID")
            return per.wap_id
        headers = {'content-type': 'application/json',
                    'D360-API-KEY': self.api_key}
        url = 'https://waba.360dialog.io/v1/contacts'
        payload = {"blocking": "wait",
                    "contacts": [
                    "+52" + per.telefono
                    ],
                    "force_check": True}
        r = requests.post(url, data=json.dumps(payload), headers=headers)
        valido = r.json()
        if (valido and valido['contacts'][0]['status'] == 'valid'):
            wap_id = valido['contacts'][0]['wa_id']
            per.wap_id = wap_id
            print('wap_id:',wap_id)
            per.save()
            return wap_id
        return False

    def send_msg(self, wid, txt):
        headers = {'content-type': 'application/json',
                    'D360-API-KEY': self.api_key}
        payload = {
            "to": wid,
            "text": {
                "body": txt
            }
        }
        url = "https://waba.360dialog.io/v1/messages"
        r = requests.post(url, data=json.dumps(payload), headers=headers)
        return r.json()

    



    def enviatemplate(self, tel, template,perfil=None):
        wa_id = self.comprueba_num(tel)
        if wa_id is False:
            return False
        payload = {
            "to": wa_id,
            "type": "template",
            "template": {
                "namespace": self.name_space,
                "name": template.titulo,
                "language": {
                    "code": "es_MX",
                    "policy": "deterministic"
                },

            }
        }
        #print('pay1:',payload)
        if perfil is None:
            params=self.get_params(template.texto, tel)
        else:
            params=self.get_params_perfil(template.texto,perfil)
        #print('params:',params)
        tt=template.plantilla
        if params:
            if tt.has_image:
                payload['template']['components']=[{"type":"body","parameters":params},{"type":"header","parameters":[{"type":"image","image":{"link":settings.MAIN_URL+'/media/'+tt.img_file.name }}]}]

            else:
                payload['template']['components']=[{"type":"body","parameters":params}]
        else:
            if tt.has_image:
                    payload['template']['components']=[{"type":"header","parameters":[{"type":"image","image":{"link":settings.MAIN_URL+'/media/'+tt.img_file.name  }}]}]
    
                    
        headers = {'content-type': 'application/json',
                    'D360-API-KEY': self.api_key}

        
        url = "https://waba.360dialog.io/v1/messages"
        #print('payload:',payload)
        r = requests.post(url, data=json.dumps(payload), headers=headers)
        #print ('rec:',r.text) 
        return r.json()

    def enviawhats(self, num, texto):
        valido = self.comprueba_num(num)
        res = {'ok': False}
        print('enviaw', valido)

        if(valido):
            print('valido')
            return self.send_msg(valido, texto)

        return res
