
    IEi                        U d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 h dZh dZ ej                    ZddddZded	<   d"dZd#dZd$d%dZd&dZd'dZddddd(d!ZdS ))    )annotationsN)deepcopy)AnyDictOptional>   lenmodtyperegexlengthprefixmax_lenmin_lenweightsocr_kind	validator
check_rule
max_length
min_length
must_parsecheck_indexweight_listexpected_len>   	id_numberpassport_nolicense_numberdriver_license_nopathmtimedataDict[str, Any]_CACHEreturnstrc                    t           j                            d          } | r| S t           j                            t           j                            t                              }t           j                            |d          t           j                            |d          t           j                            |d          g}|D ]%}t           j                            |          r|c S &|d         S )NKYC_IDENTITY_RULES_PATHzidentity_rules.jsonzidentity_registry.jsonzcountry_identity_rules.jsonr   )	osenvirongetr   dirnameabspath__file__joinexists)envhere
candidatesps       "/var/www/html/identity_registry.py_pick_default_pathr5   1   s    
*..2
3
3C
 
7??27??84455D
T011
T344
T899J
   7>>! 	HHH	 a=    r   Optional[float]c                d    	 t           j                            |           S # t          $ r Y d S w xY wN)r(   r   getmtime	Exception)r   s    r4   _file_mtimer<   C   s?    w%%%   tts   ! 
//Optional[str]c                h   | pd                                 pt                      }t          |          }t          5  t          d         ;t          d         |k    r*t          d         |k    rt          d         cddd           S t
          j                            |          s1di d}t                              |||d           |cddd           S t          |d	d
          5 }|
                                }ddd           n# 1 swxY w Y   	 t          j        |          }n(# t          $ r}t          d| d|           |d}~ww xY wt          |t                     st          d|           d|vs(t          |                    d          t                     sXt%          d |                                D                       rd|d}n't)          |                    d          pd          i d}t                              |||d           |cddd           S # 1 swxY w Y   dS )a1  
    Loads + caches the identity registry JSON. Auto-reloads on file mtime change.

    Schema (suggested):
    {
      "schema_version": 1,
      "countries": {
        "IR": {
          "kinds": {
            "national_id": { "type":"numeric", "length":10, "validator":"iran_national_code", "regex":"^[0-9]{10}$" }
          },
          "doc_types": {
            "id_card": { "fields": { "id_number": { "use": "national_id" } } },
            "driver_license": { "fields": { "id_number": { "use": "national_id" } } }
          }
        }
      }
    }
     r!   Nr   r       )schema_version	countriesr   rz	utf-8-sig)encodingz*Identity registry JSON parse failed: path=z err=z.Identity registry must be a JSON object: path=rB   c              3  p   K   | ]1\  }}t          |t                    ot          |t                    V  2d S r9   )
isinstancer%   dict).0kvs      r4   	<genexpr>z)load_identity_registry.<locals>.<genexpr>w   s?      WW$!Q:a%%=*Q*=*=WWWWWWr6   rA   )stripr5   r<   _CACHE_LOCKr#   r(   r   r/   updateopenreadjsonloadsr;   RuntimeErrorrF   rG   r*   allitemsint)r   r3   r    r!   frawes          r4   load_identity_registryrZ   J   s   ( 
4 2 4 4ANNE	  &>%&.A*=*=&/UZBZBZ&>        w~~a   	&'b99DMM1udCCDDD        !S;/// 	1&&((C	 	 	 	 	 	 	 	 	 	 	 	 	 	 		`:c??DD 	` 	` 	`WAWWTUWWXX^__	` $%% 	USPQSSTTTd""*TXXk5J5JD*Q*Q"WW$**,,WWWWW a*+$??*-dhh7G.H.H.MA*N*N]_``q5$??@@@9                 sg   <H'AH'H'&D;H'D	H'D	H'D('H'(
E2EECH''H+.H+dc                ^    i }| pi                                  D ]\  }}|t          v r|||<   |S r9   )rU   _ALLOWED_KEYS)r[   outrI   rJ   s       r4   _sanitize_specr_      sB    Cb!!  1CFJr6   country_entrydoc_type	field_keyOptional[Dict[str, Any]]c                   |pd                                                                 }|pd                                 }|                     d          }t          |t                    si }|                    |          p|                    |          pi }t          |t                    si }|                    d          }||}t          |t                    sd S |                    |          }|d S t          |t
                    rd|i}t          |t                    sd S |                    d          }	|	r|                     d          pi }
t          |
t                    r|
                    t          |	                    }t          |t
                    r|
                    |          }t          |t                    r7t	          |          }|                                D ]\  }}|dk    r|||<   |S |S )Nr?   	doc_typesfieldsusekinds)rL   lowerr*   rF   rG   r%   rU   )r`   ra   rb   
doc_type_lfield_key_sre   dt_entryrf   specrg   rh   basemergedrI   rJ   s                  r4   _resolve_field_specrp      s   .b''))//11J?))++K!!+..Ii&& 	}}Z((IIMM(,C,CIrHh%% \\(##F~fd## t::k""D|t $ t}dD!! t ((5//C
 !!'**0beT"" 	99SXX&&D$$$ 'yy$%% d JJLL " "DAqEzz  !F1IIKr6   r?   F)r   strictstrict_keyscountryrq   boolrr   Optional[set]c                p   t          |          }t          |t                    r|                    d          nd}t          |t                    si }| pd                                                                }|                    |          p&|                    |                                          }	t          |	t                    s|r|pd|pt          v rddiS dS t          |	||          }
t          |
t                    s|r|pd|pt          v rddiS dS t          t          |
                    S )a"  
    Returns a dict of defaults to be merged into validation_logic for a given (country, doc_type, field_key).

    - If no defaults exist: returns None (unless strict=True and field_key is in strict_keys)
    - If defaults exist: returns a sanitized dict containing only allowed keys.
    rB   Nr?   r   missing_identity_rule)rZ   rF   rG   r*   rL   upperri   _STRICT_DEFAULT_KEYSrp   r_   r   )rs   ra   rb   r   rq   rr   r!   rB   ccentryrm   s              r4   get_identity_defaultsr|      s;    "$''D)3D$)?)?I%%%TIi&& 	
-R			 	 	&	&	(	(BMM":rxxzz!:!:EeT""  	:	R[-P<PQQ!899tuh	::DdD!!  	:	R[-P<PQQ!899t(4..)))r6   )r$   r%   )r   r%   r$   r7   r9   )r   r=   r$   r"   )r[   r"   r$   r"   )r`   r"   ra   r%   rb   r%   r$   rc   )rs   r%   ra   r%   rb   r%   r   r%   rq   rt   rr   ru   r$   rc   )
__future__r   rQ   r(   	threadingcopyr   typingr   r   r   r]   ry   LockrM   r#   __annotations__r5   r<   rZ   r_   rp   r|    r6   r4   <module>r      s`   # " " " " " "  				           & & & & & & & & & &  & [ZZ in        $   3 3 3 3 3l   / / / /n !%!* !* !* !* !* !* !* !*r6   