o
    y	i<                     @   sT   d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	 G dd dZ
e
 ZdS )z
PAN Verification Service - Banking-specific PAN card verification.

This service verifies PAN card numbers with an external API.
Only enabled for bots with requires_pan_verification flag set to True.
    N)DictAnyOptional)Logc                	   @   sb   e Zd ZdZddedefddZededee fd	d
Zddedee de	ee
f fddZdS )PANVerificationServicez9Service for verifying PAN card details with external API.Napi_urlapi_keyc                 C   sL   ddl m} |p
|j| _|p|j| _| jstd | js$td dS dS )z
        Initialize PAN verification service.
        
        Args:
            api_url: PAN verification API endpoint
            api_key: API authentication key
        r   )Configu.   ⚠️ PAN verification API URL not configuredu.   ⚠️ PAN verification API key not configuredN)Zconfigr	   ZPAN_VERIFICATION_API_URLr   ZPAN_VERIFICATION_API_KEYr   r   warning)selfr   r   r	    r   $services/pan_verification_service.py__init__   s   
zPANVerificationService.__init__textreturnc                 C   s$   d}t ||  }|r| S dS )a  
        Detect if text contains a valid PAN card number.
        
        PAN format: ABCDE1234F (5 uppercase letters, 4 digits, 1 uppercase letter)
        
        Args:
            text: Input text to search
        
        Returns:
            Detected PAN number or None
        z\b[A-Z]{5}[0-9]{4}[A-Z]\bN)researchuppergroup)r   Zpan_patternmatchr   r   r   detect_pan_number$   s
   z(PANVerificationService.detect_pan_number
pan_number	user_namec              
      s  | j r| jstd ddd|dS ztd|dd  d	 t 4 I dH }d
| j dd}d|i}|r=||d< |j| j ||tjddd4 I dH }|j	dkr|
 I dH }|dd}||rgdnd|d|d|d}	|rtd|dd  d	 ntd|dd  d	 |	W  d  I dH  W  d  I dH  W S | I dH }
td|j	 d|
  ddd|j	 |dW  d  I dH  W  d  I dH  W S 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  tjy   td ddd|d Y S  tyA } ztd|  ddl}|  ddt||dW  Y d}~S d}~ww ) a  
        Verify PAN card number with external API.
        
        Args:
            pan_number: PAN card number (e.g., ABCDE1234F)
            user_name: Optional user name for verification
        
        Returns:
            Dict with verification result:
            {
                'valid': bool,
                'status': str,  # 'valid', 'invalid', 'error'
                'name': str,  # Name from PAN
                'dob': Optional[str],  # Date of birth
                'pan_number': str  # PAN number
            }
        u'   ❌ PAN verification API not configuredFerrorz'PAN verification service not configured)validstatusmessager   u   🔍 Verifying PAN: N   ZXXXzBearer zapplication/json)ZAuthorizationzContent-Typer   name   )total)headersjsonZtimeout   r   Zinvaliddob)r   r   r   r$   r   u   ✅ PAN verified successfully: u    ⚠️ PAN verification failed: u    ❌ PAN verification API error: z - zAPI returned status u#   ⏱️ PAN verification API timeoutzAPI request timeoutu   ❌ PAN verification error: r   )r   r   r   r   infoaiohttpZClientSessionZpostZClientTimeoutr   r"   getr
   r   asyncioTimeoutError	Exception	traceback	print_excstr)r   r   r   Zsessionr!   ZpayloadZresponsedataZis_validresultZ
error_texter+   r   r   r   
verify_pan9   s   




*
23

z!PANVerificationService.verify_pan)NN)N)__name__
__module____qualname____doc__r-   r   staticmethodr   r   r   r   r1   r   r   r   r   r      s    (r   )r5   r(   r&   r   typingr   r   r   Zservices.log_utilsr   r   Zpan_verification_servicer   r   r   r   <module>   s     
