
    i                         d Z ddlZddlZddlmZ ddlmZ  ej                  e	      Z
dZdZ eej                  d      Z G d d	      Zy)
uh   
Servicio de identidad: validación de cédula, parseo de fechas y caché de datos de usuario en Redis.
    N)
ChatOpenAI)settingsi  u  Extrae la fecha de nacimiento del siguiente texto y conviértela EXACTAMENTE al formato dd-MM-yyyy.

Reglas:
- Si el año tiene 2 dígitos, asume siglo 1900 si >= 30, siglo 2000 si < 30 (ej: 97 → 1997, 05 → 2005).
- Responde ÚNICAMENTE con la fecha en formato dd-MM-yyyy (ejemplo: 25-07-1997).
- Si no puedes identificar una fecha válida, responde exactamente: INVALID

Texto del usuario: {user_input})modeltemperaturec            	       h    e Zd ZdZdedefdZdededz  fdZdedefd	Z		 ddeded
edz  ddfdZ
y)IdentityServiceu?   Validación de identidad y caché de datos de usuario en Redis.cedulareturnc                 Z   |j                         rt        |      dk7  ryt        |dd       }|dk  s
|dkD  r|dk7  ryt        |d         }|dkD  ryg d	}d
}t        d      D ]%  }t        ||         ||   z  }|dkD  r|dz  }||z  }' |dz  }|d
k(  rd
nd|z
  }	|	t        |d         k(  S )u   
        Valida una cédula ecuatoriana usando el algoritmo de módulo 10.
        Retorna True si la cédula es válida, False en caso contrario.
        
   FN               )	r   r   r   r   r   r   r   r   r   r   	   )isdigitlenintrange)
selfr	   	provinciatercer_digitocoeficientessumaivalorresiduodigito_verificadors
             =/opt/lhia/marcimex/agent/app/api/services/identity_service.pyvalidate_cedulazIdentityService.validate_cedula   s    
 ~~3v;"#4r
O	q=Y^	RF1I12q 	Aq	N\!_4Eqy
EMD		 )")Q,QBL!S^33    
user_inputNc                    	 t         j                  t        j                  |            }|j                  j                         }|dk(  ry|j                  d      }t        |      dk(  r5t        |d         dk(  r$t        |d         dk(  rt        |d         d	k(  r|S y# t        $ r"}t        j                  d
|        Y d}~yd}~ww xY w)z
        Usa el LLM para normalizar una fecha en lenguaje natural a dd-MM-yyyy.
        Retorna la fecha formateada o None si no se pudo parsear.
        )r#   INVALIDN-   r   r   r      zError parseando fecha con LLM: )_llminvoke_DATE_PARSE_PROMPTformatcontentstripsplitr   	Exceptionloggererror)r   r#   responseparsedpartses         r    
parse_datezIdentityService.parse_date:   s    
	{{#5#<#<
#<#STH%%++-F"LL%E5zQ3uQx=A#5#eAh-1:LQTUZ[\U]Q^bcQc 	LL:1#>?	s   AB  AB   	C)CCuuidc                 |   K   d| }|j                  |       d{   }|rt        j                  |      S i S 7 w)zCCarga los datos de identidad cacheados para un usuario desde Redis.user_identity:N)getjson_modloads)r   redis_clientr8   USER_IDENTITY_KEYidentity_raws        r    load_identityzIdentityService.load_identityL   sC     ,TF3)--.?@@/;x~~l+CC As   <:<fecha_nacimientoc                    K   d| }d|i}|r||d<   |j                  |t        t        j                  |             d{    t        j                  d| d|        y7  w)z1Persiste los datos de identidad en Redis con TTL.r:   r	   rB   Nu   🔑 [u   ] Identidad guardada: cédula=)setexUSER_IDENTITY_TTLr<   dumpsr1   info)r   r>   r8   r	   rB   r?   identity_datas          r    save_identityzIdentityService.save_identityR   sq      -TF3'00@M,-  !24Ex~~VcGdeeefTF"@IJ 	fs   >A# A!!A#)N)__name__
__module____qualname____doc__strboolr!   r7   dictrA   rI    r"   r    r   r      s    I4c 4d 4:S S4Z $Dc Dd D (,K K 	K
 *K 
Kr"   r   )rM   jsonr<   logginglangchain_openair   config.settingsr   	getLoggerrJ   r1   rE   r+   
MODEL_NAMEr)   r   rQ   r"   r    <module>rX      sZ      ' $			8	$ #  ++;EK EKr"   