
    U+if                        d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
Z
 ej                  e      Zd	dZ G d d      Z	 	 	 	 	 	 d
dZy)u  
WhatsApp Cloud API (Meta / Facebook Graph).
Documentación: https://developers.facebook.com/docs/whatsapp/cloud-api

Variables de entorno:
  WHATSAPP_CLOUD_ACCESS_TOKEN  — token de acceso permanente de la app
  WHATSAPP_PHONE_NUMBER_ID     — ID del número de negocio (no el número en sí)
  WHATSAPP_TEMPLATE_NAME       — nombre exacto de la plantilla aprobada en Meta
  WHATSAPP_TEMPLATE_LANG       — código idioma (ej. es, es_CL)
  WHATSAPP_GRAPH_VERSION       — opcional, default v21.0

La plantilla debe existir en Meta Business y coincidir con los parámetros enviados.
Si el cuerpo tiene {{1}} y {{2}}, pase body_texts con 2 strings [nombre_estudiante, nombre_formulario].
Si la plantilla no tiene variables, deje body_texts vacío o None.
    )annotationsN)AnyDictListOptionalc                   | t        |       j                         sydj                  d t        |       D              }|syt        |      dk(  r|d   dk(  rd|z   }n[t        |      dk(  r|j	                  d      rn;t        |      d	k(  r|j	                  d      rnt        |      d
k(  r|d   dk(  rd|z   }t        |      dk  ry|S )uU   Convierte celular chileno típico a dígitos E.164 sin + (Meta espera solo dígitos).N c              3  B   K   | ]  }|j                         s|  y wN)isdigit).0cs     P/var/www/pie360backend.cl/public_html/app/backend/classes/whatsapp_meta_class.py	<genexpr>z*normalize_whatsapp_e164.<locals>.<genexpr>    s     81AIIKQ8s   	   r   956   
      569)strstripjoinlen
startswith)rawdigitss     r   normalize_whatsapp_e164r      s    
{#c(..*WW8C88F
6{aF1I,	V	v006	V	v006	V	fQi3.
6{RM    c                  P    e Zd Zedd       Zedd       Ze	 d	 	 	 	 	 dd       Zy)	WhatsAppMetaClassc                    t         j                  j                  d      xs dj                         } t         j                  j                  d      xs dj                         }t         j                  j                  d      xs dj                         }t         j                  j                  d      xs dj                         }t         j                  j                  d      xs dj                         }| ||||fS )	NWHATSAPP_CLOUD_ACCESS_TOKENr	   WHATSAPP_PHONE_NUMBER_IDWHATSAPP_TEMPLATE_NAMEWHATSAPP_TEMPLATE_LANGesWHATSAPP_GRAPH_VERSIONzv21.0)osenvirongetr   )tokenphone_idtemplatelangversions        r   _configzWhatsAppMetaClass._config2   s     =>D"KKMJJNN#=>D"KKMJJNN#;<BIIK

78@DGGI::>>":;FwMMOh$77r    c                 \    t         j                         \  } }}}}t        | xr |xr |      S r   )r"   r2   bool)r-   r.   r/   _s       r   is_configuredzWhatsAppMetaClass.is_configured;   s0    *;*C*C*E'x1aE3h3844r    Nc                   t         j                         \  }}}}}|r|r|st        j                  d       dddddS d| d| d	}d
| dd}|d|id}	|r/g }
|D ]  }|xs ddd }|
j	                  d|d       ! d|
dg|	d<   dd| d|	d}	 t        j                  |||d      }	 |j                         }|j                  dk\  r2t        j                  d |j                  |       dd|j                  |d!S dd|d"S # t        $ r d|j                  dd i}Y cw xY w# t
        j                  $ r.}t        j                  d#       ddt        |      d$cY d}~S d}~ww xY w)%ui   
        Envía un mensaje de plantilla. body_texts: valores para variables del cuerpo en orden.
        uA   WhatsApp Meta: faltan variables de entorno; no se envía mensaje.FTmissing_envzWConfigure WHATSAPP_CLOUD_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID, WHATSAPP_TEMPLATE_NAME)okskippedreasondetailzhttps://graph.facebook.com//z	/messageszBearer zapplication/json)AuthorizationzContent-Typecode)namelanguager	   Ni   text)typerB   body)rC   
parameters
componentswhatsapp
individualr/   )messaging_productrecipient_typetorC   r/   -   )headersjsontimeoutr   i  i  zWhatsApp Meta error %s: %s)r9   r:   status_coderesponse)r9   r:   rQ   zWhatsApp Meta request failed)r9   r:   error)r"   r2   loggerwarningappendrequestspostrN   	ExceptionrB   rP   RequestException	exceptionr   )to_e164
body_textsr-   r.   r/   r0   r1   urlrM   tplparamstrB   payloadrrD   es                    r   send_templatezWhatsAppMetaClass.send_template@   s    4E3L3L3N0x4HHNN^_'s	  ,G9AhZyI&-eW$5GYZ 
 F >R$'vt<=> +1!G HC ",*
	Dc7"MA-vvx }}#;Q]]DQ$#$== $	  5dCC  -qvvds|,- (( 	D;<ECFCC	DsI   D  )D  9A D  :D   DD  DD   E!3#EE!E!)returnztuple[str, str, str, str, str])re   r4   r   )r[   r   r\   zOptional[List[str]]re   Dict[str, Any])__name__
__module____qualname__staticmethodr2   r6   rd    r    r   r"   r"   1   s`    8 8 5 5  +/8D8D'8D 
8D 8Dr    r"   c                Z   |sddg t         j                          dS t         j                         s"t        |      d|D cg c]  }|dd	 c}dddS d}g }|D ]  } ||      }t        |      }	|	s|j	                  |d|d	       . ||      xs d
}
|xs ddd }t         j                  |	|
|g      }|j                  d      r|dz  }s|j	                  ||j                  d      xs d|j                  d      xs |j                  d      d        t        |      ||ddS c c}w )zv
    student_label_fn(sid) -> str nombre estudiante
    guardian_phone_fn(sid) -> Optional[str] celular apoderado
    r   )	attemptedsentfailedskipped_configwhatsapp_not_configured)
student_idr;   TzeDefina WHATSAPP_CLOUD_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID y WHATSAPP_TEMPLATE_NAME en el servidor.)rm   rn   ro   rp   hintinvalid_or_missing_phone)rr   r;   r   
Estudiante
FormularioN   )r\   r9      r;   send_failedrQ   rR   )rr   r;   r<   F)r"   r6   r   r   rU   rd   r,   )dbstudent_ids	form_namestudent_label_fnguardian_phone_fnsidrn   ro   	phone_rawrK   st_namefnresults                r   notify_guardians_for_formr   |   sY    RO`OnOnOpKpqq**,[)[fgTWc5NOg"{
 	
 D#%F %c*	$Y/MM8R[def"3'7<'<#."00"0N::dAIDMM"%$jj2Cm$jj4K

78K, %	 9 hs    D()r   Optional[str]re   r   )r{   z	List[int]r|   r   re   rf   )__doc__
__future__r   loggingr*   typingr   r   r   r   rV   	getLoggerrg   rS   r   r"   r   rk   r    r   <module>r      se     #  	 , , 			8	$*HD HDV33 3 3r    