
    i                        S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	  SSK
r
\R                  " \5      rS	S jr " S S5      r      S
S jrg)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                   U b  [        U 5      R                  5       (       d  gSR                  S [        U 5       5       5      nU(       d  g[        U5      S:X  a  US   S:X  a  SU-   nOi[        U5      S:X  a  UR	                  S5      (       a  OC[        U5      S	:X  a  UR	                  S5      (       a  O[        U5      S
:X  a  US   S:X  a  SU-   n[        U5      S:  a  gU$ )uU   Convierte celular chileno típico a dígitos E.164 sin + (Meta espera solo dígitos).N c              3  R   #    U  H  oR                  5       (       d  M  Uv   M     g 7fN)isdigit).0cs     YC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\whatsapp_meta_class.py	<genexpr>*normalize_whatsapp_e164.<locals>.<genexpr>    s     81IIKQQs   '	'	   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6	V	v0066	V	fQi3.
6{RM    c                  `    \ rS rSr\SS j5       r\SS j5       r\ S	     S
S jj5       rSrg)WhatsAppMetaClass1   c                 (   [         R                  R                  S5      =(       d    SR                  5       n [         R                  R                  S5      =(       d    SR                  5       n[         R                  R                  S5      =(       d    SR                  5       n[         R                  R                  S5      =(       d    SR                  5       n[         R                  R                  S5      =(       d    SR                  5       nXX#U4$ )	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   _config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77r!   c                 n    [         R                  5       u  pn  n[        U =(       a    U=(       a    U5      $ r   )r#   r4   bool)r/   r0   r1   _s       r   is_configuredWhatsAppMetaClass.is_configured;   s.    *;*C*C*E'1aE3h3844r!   Nc                   [         R                  5       u  p#pEnU(       a  U(       a  U(       d  [        R                  S5        SSSSS.$ SU SU S	3nS
U 3SS.nUSU0S.n	U(       a6  / n
U H%  nU=(       d    SSS nU
R	                  SUS.5        M'     SU
S./U	S'   SSU SU	S.n [
        R                  " XxUSS9n UR                  5       nUR                  S:  a2  [        R                  S UR                  U5        SSUR                  US!.$ SSUS".$ ! [         a    SUR                  SS 0n Nef = f! [
        R                   a.  n[        R                  S#5        SS[        U5      S$.s SnA$ SnAff = f)%uY   
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)typerF   body)rG   
parameters
componentswhatsapp
individualr1   )messaging_productrecipient_typetorG   r1   -   )headersjsontimeoutr   i  i  zWhatsApp Meta error %s: %s)r=   r>   status_coderesponse)r=   r>   rU   zWhatsApp Meta request failed)r=   r>   error)r#   r4   loggerwarningappendrequestspostrR   	ExceptionrF   rT   RequestException	exceptionr   )to_e164
body_textsr/   r0   r1   r2   r3   urlrQ   tplparamstrF   payloadrrH   es                    r   send_templateWhatsAppMetaClass.send_template@   s    4E3L3L3N0HHNN^_'s	  ,G9AhZyI&-eW$5GYZ 
 FR$'vt<=   +1!G HC ",*
	Dc"MA-vvx }}#;Q]]DQ$#$== $	  5dCC  -qvvds|,- (( 	D;<ECFCC	DsI   (D8 ?D AD8 D8 D52D8 4D55D8 8E:#E5/E:5E: )returnztuple[str, str, str, str, str])rk   r7   r   )r_   r   r`   zOptional[List[str]]rk   Dict[str, Any])	__name__
__module____qualname____firstlineno__staticmethodr4   r9   rh   __static_attributes__rj   r!   r   r#   r#   1   s`    8 8 5 5  +/8D8D'8D 
8D 8Dr!   r#   c                   U(       d  SS/ [         R                  5       (       + S.$ [         R                  5       (       d$  [        U5      SU Vs/ s H  oUSS.PM	     snSSS.$ Sn/ nU H  nU" U5      n[        U5      n	U	(       d  UR	                  USUS	.5        M4  U" U5      =(       d    S
n
U=(       d    SSS n[         R                  XU/S9nUR                  S5      (       a  US-  nM  UR	                  UUR                  S5      =(       d    SUR                  S5      =(       d    UR                  S5      S.5        M     [        U5      UUSS.$ s  snf )zj
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.)rt   ru   rv   rw   hintinvalid_or_missing_phone)ry   r?   r   
Estudiante
FormularioN   )r`   r=      r?   send_failedrU   rV   )ry   r?   r@   F)r#   r9   r   r    rY   rh   r.   )dbstudent_ids	form_namestudent_label_fnguardian_phone_fnsidru   rv   	phone_rawrO   st_namefnresults                r   notify_guardians_for_formr   |   s\    RO`OnOnOpKpqq**,,[)[fg[fTW5NO[f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   E)r   Optional[str]rk   r   )r   z	List[int]r   r   rk   rl   )__doc__
__future__r   loggingr,   typingr   r   r   r   rZ   	getLoggerrm   rW   r    r#   r   rj   r!   r   <module>r      sc     #  	 , , 			8	$*HD HDV33 3 3r!   