o
    IEi                     @  s   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 ZddddZded	< d(ddZd)ddZd*d+ddZd,ddZd-ddZd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                  C  sv   t jd} | r
| S t jt jt}t j|dt j|dt j|dg}|D ]}t j|r6|  S q*|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p r2   "/var/www/html/identity_registry.py_pick_default_path1   s   r4   r   Optional[float]c                 C  s$   zt j| W S  ty   Y d S w N)r&   r   getmtime	Exception)r   r2   r2   r3   _file_mtimeC   s
   r9   Optional[str]c                 C  s  | pd  pt }t|}t td dur-td |kr-td |kr-td W  d   S tj|sJdi d}t|||d |W  d   S t	|d	d
d}|
 }W d   n1 s`w   Y  zt|}W n ty } ztd| d| |d}~ww t|tstd| d|vst|dtstdd | D rd|d}nt|dpdi d}t|||d |W  d   S 1 sw   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=r>   c                 s  s(    | ]\}}t |tot |tV  qd S r6   )
isinstancer$   dict).0kvr2   r2   r3   	<genexpr>w   s   & z)load_identity_registry.<locals>.<genexpr>r=   )stripr4   r9   _CACHE_LOCKr"   r&   r   r-   updateopenreadjsonloadsr8   RuntimeErrorrA   rB   r(   allitemsint)r   r1   r   r    frawer2   r2   r3   load_identity_registryJ   s:   $
	

$rU   dc                 C  s.   i }| pi   D ]\}}|tv r|||< q|S r6   )rP   _ALLOWED_KEYS)rV   outrD   rE   r2   r2   r3   _sanitize_spec   s   rY   country_entrydoc_type	field_keyOptional[Dict[str, Any]]c                 C  s:  |pd   }|pd  }| d}t|tsi }||p%||p%i }t|ts-i }|d}|d u r8|}t|ts?d S ||}|d u rJd S t|trSd|i}t|tsZd S |d}	|	r| dpgi }
t|
tr|
t|	}t|tr~|
|}t|trt|}| D ]\}}|dkrq|||< q|S |S )Nr;   	doc_typesfieldsusekinds)rG   lowerr(   rA   rB   r$   rP   )rZ   r[   r\   
doc_type_lfield_key_sr^   dt_entryr_   specr`   ra   basemergedrD   rE   r2   r2   r3   _resolve_field_spec   sF   













ri   r;   F)r   strictstrict_keyscountryrj   boolrk   Optional[set]c                 C  s   t |}t|tr|dnd}t|tsi }| pd  }||p*|| }	t|	ts@|r>|p5d|p8tv r>ddiS dS t|	||}
t|
ts[|rY|pPd|pStv rYd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.
    r>   Nr;   r   missing_identity_rule)rU   rA   rB   r(   rG   upperrb   _STRICT_DEFAULT_KEYSri   rY   r   )rl   r[   r\   r   rj   rk   r    r>   ccentryrf   r2   r2   r3   get_identity_defaults   s    


rt   )r#   r$   )r   r$   r#   r5   r6   )r   r:   r#   r!   )rV   r!   r#   r!   )rZ   r!   r[   r$   r\   r$   r#   r]   )rl   r$   r[   r$   r\   r$   r   r$   rj   rm   rk   rn   r#   r]   )
__future__r   rL   r&   	threadingcopyr   typingr   r   r   rW   rq   LockrH   r"   __annotations__r4   r9   rU   rY   ri   rt   r2   r2   r2   r3   <module>   s,   



6
7