o
    d6i0                     @   s  d Z ddlZddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ eeZded	ed
ee fddZded	eded
ee fddZ	d.ded	ededed
ee f
ddZded	ededeeef d
ef
ddZded	eded
efddZd.ded	ee d
efddZded	eded
efddZded
eeef fddZ		d/ded	ed eded!ed"ed
efd#d$Z ded	eded
ee fd%d&Z!ded
ee fd'd(Z"d)ed
ee fd*d+Z#d)ed
efd,d-Z$dS )0z
Utility functions for managing user puja sessions in the database.
Phone numbers are now stored in collected_info JSON field.
    N)datetime)OptionalDictAnyList)Sessionselectand_or_)engine)UserPujaSessionuser_id
session_idreturnc              
   C   s   z;t t,}ttttj| ktj|ktjdk	tj
 }|| }|W  d   W S 1 s4w   Y  W dS  tyY } ztdt|j  W Y d}~dS d}~ww )z
    Get the active (incomplete) puja session for a user in a specific session.
    Returns the first incomplete puja found for the user+session combination.
    FNz#Error getting active puja session: )r   r   r   r   wherer	   r   r   	completedorder_by
updated_atdescexecfirst	Exceptionloggererrortype__name__)r   r   session	statementresulte r    @/var/www/html/karishye-ai-python/app/utils/puja_session_utils.pyget_active_puja_session   s(   
(r"   	puja_typec              
   C   s   z;t t,}ttttj| ktj|ktj|k	tj
 }|| }|W  d   W S 1 s4w   Y  W dS  tyY } ztdt|j  W Y d}~dS d}~ww )zL
    Get a specific puja session by user_id, session_id, and puja_type.
    NzError getting puja session: )r   r   r   r   r   r	   r   r   r#   r   r   r   r   r   r   r   r   r   r   )r   r   r#   r   r   r   r   r    r    r!   get_puja_session,   s(   
(r$   	puja_namec              
   C   s   z;t t,}t| |||t t d}|| |  || t	d |W  d   W S 1 s4w   Y  W dS  t
yY } ztdt|j  W Y d}~dS d}~ww )z4
    Create a new puja session in the database.
    )r   r   r#   r%   
created_atr   zCreated puja sessionNzError creating puja session: )r   r   r   r   nowaddcommitrefreshr   debugr   r   r   r   )r   r   r#   r%   r   puja_sessionr   r    r    r!   create_puja_sessionD   s*   	



(r-   updatesc           
   
   C   s  zmt t^}ttttj| ktj|ktj|k}|	|
 }|s2td 	 W d   W dS | D ]\}}t||rEt||| q6t |_|| |  td 	 W d   W dS 1 sfw   Y  W dS  ty }	 ztdt|	j  W Y d}	~	dS d}	~	ww )z.
    Update a puja session with new data.
    z!Puja session not found for updateNFzUpdated puja sessionTzError updating puja session: )r   r   r   r   r   r	   r   r   r#   r   r   r   r+   itemshasattrsetattrr   r'   r   r(   r)   r   r   r   r   )
r   r   r#   r.   r   r   r,   keyvaluer   r    r    r!   update_puja_sessionb   s>   	






(r4   c              
   C   s   zOt t@}ttttj| ktj|ktj|k}|	|
 }|r;|| |  td 	 W d   W dS 	 W d   W dS 1 sHw   Y  W dS  tym } ztdt|j  W Y d}~dS d}~ww )zT
    Delete a puja session (e.g., when user starts a new puja in same session).
    zDeleted puja sessionNTFzError deleting puja session: )r   r   r   r   r   r	   r   r   r#   r   r   deleter)   r   r+   r   r   r   r   )r   r   r#   r   r   r,   r   r    r    r!   delete_puja_session   s2   



(r6   c              
   C   s   zJt t;}|rttttj| ktj|ktj	
 }ntttj| ktj	
 }|| }|W  d   W S 1 sCw   Y  W dS  tyi } ztdt|j  g W  Y d}~S d}~ww )zN
    Get all puja sessions for a user, optionally filtered by session_id.
    Nz!Error getting all puja sessions: )r   r   r   r   r   r	   r   r   r   r   r   r   allr   r   r   r   r   )r   r   r   r   resultsr   r    r    r!   get_all_user_puja_sessions   s0   
(r9   c                 C   s   t | ||ddiS )z+
    Mark a puja session as completed.
    r   T)r4   )r   r   r#   r    r    r!   mark_puja_completed   s   r:   r,   c                 C   sJ   | si S | j | j| j| j| j| j| j| j| j| j	| j
| j | j dS )zW
    Convert a UserPujaSession model to a dictionary (for backward compatibility).
    )r   r   r#   r%   current_questioncollected_infor   
kb_checkedinvalid_attemptsawaiting_phonephone_collectedr&   r   )r   r   r#   r%   r;   r<   r   r=   r>   r?   r@   r&   	isoformatr   )r,   r    r    r!   puja_session_to_dict   s    rB   +91phone_numberpuja_idphone_country_codec              
   C   sr   zt | ||d|iddd}|rW dS td W dS  ty8 } ztdt|j  W Y d}~dS d}~ww )	z
    Save user's phone number to puja session's collected_info JSON field.
    NOTE: Phone numbers are now stored in collected_info, not a separate table.
    rD   T)r<   r@   )r   r   r#   r.   z*Failed to update phone - session not foundFzError saving phone: N)r4   r   r+   r   r   r   r   )r   r   rD   r#   rE   rF   update_resultr   r    r    r!   save_user_phone_number   s$   

rH   c              
   C   sh   zt | ||}|r|jr|jdW S W dS  ty3 } ztdt|j  W Y d}~dS d}~ww )z
    Get user's phone number from puja session's collected_info JSON field.
    
    Returns:
        Phone number string if found, None otherwise
    rD   NzError getting phone: )r$   r<   getr   r   r   r   r   )r   r   r#   r,   r   r    r    r!   get_user_phone_number  s   
rJ   c              
   C   s   zPt tA}tttj| ktj }|	|
 }g }|D ]}|jr;d|jv r;|jd }|r;||vr;|| q!|W  d   W S 1 sIw   Y  W dS  tyo } ztdt|j  g W  Y d}~S d}~ww )z{
    Get all phone numbers for a user across all puja sessions.
    
    Returns:
        List of unique phone numbers
    rD   NzError getting phones: )r   r   r   r   r   r   r   r&   r   r   r7   r<   appendr   r   r   r   r   )r   r   r   sessionsphonesr,   phoner   r    r    r!   get_all_user_phones   s*   


(rO   rN   c                 C   s   ddl }| r
| dkrdS |dd|  }|dr!|dd }n/|dr-|d	d }n#|d
r?t|dkr?|dd }n|drPt|dkrP|dd }|d|rX|S dS )a  
    Clean and normalize Indian phone number to 10-digit format.
    Handles various formats and validates against Indian mobile number rules.
    
    Accepts formats:
    - 10 digits: 9876543210
    - With country code: +91-9876543210, 0091-9876543210, 91-9876543210
    - With leading zero: 09876543210
    - With spaces/dashes/parentheses: (987) 654-3210
    
    Args:
        phone: Phone number string to clean
        
    Returns:
        10-digit cleaned phone number if valid, None otherwise
    r   Nz@phonez
[\s\-\(\)] rC      0091   91      0      z^[6-9]\d{9}$)resubstrip
startswithlenmatch)rN   rZ   cleanedr    r    r!   clean_indian_phone_numberA  s   

ra   c                 C   s   t | duS )a-  
    Validate if a phone number is a valid Indian mobile number.
    Accepts formats: 10 digits, +91-10digits, 0091-10digits, with/without spaces/dashes
    
    Args:
        phone: Phone number string to validate
        
    Returns:
        True if valid Indian mobile number, False otherwise
    N)ra   )rN   r    r    r!   validate_indian_phone_numberl  s   rb   )N)NrC   )%__doc__loggingr   typingr   r   r   r   sqlmodelr   r   r	   r
   app.dbr   app.schemasr   	getLoggerr   r   strr"   r$   r-   boolr4   r6   listr9   r:   rB   intrH   rJ   rO   ra   rb   r    r    r    r!   <module>   st    



,!
"!+