o
    A{ia                     @   sZ   d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	Z	e	
eZG dd deZdS )    )BaseCommand)timezone)CallCallLog)SeniorNc                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )CommandzCMonitor live calls and send warnings when time limit is approachingc                 C   s4   |j dddd |j dtdd |j ddd	d d S )
Nz--test
store_truez4Test mode - shows calculations without taking action)actionhelpz	--call-idzMonitor specific call ID only)typer
   z--force-warningz0Force warning for testing (even if time not low))add_argumentint)selfparser r   E/var/www/html/philips/calls/management/commands/monitor_live_calls.pyadd_arguments   s   
zCommand.add_argumentsc           	      O   s"  |d }|d }|d }|r| j | jd |r+| j d|  tjj|d}n	tjjdddd	}| j d
|  d |D ]>}z	| ||| W qB t	y } z'| j | j
d|j dt|  td|j dt|  W Y d }~qBd }~ww |s| j | jd d S d S )Ntestcall_idforce_warningu)   🧪 TEST MODE - No actions will be takenzMonitoring specific call ID: )idzin-progressF)twilio_statuscall_start_time__isnullvapi_call_id__isnullzFound z active call(s) to monitorzError monitoring call z: u"   ✅ Live call monitoring completed)stdoutwritestyleWARNINGr   objectsfiltercountmonitor_single_call	ExceptionERRORr   strloggererrorSUCCESS)	r   argsoptions	test_modespecific_call_idr   callscaller   r   r   handle   s2   &(zCommand.handleFc              	   C   s  t  |j  }t|}|j}| }|| }| jd|j	 d|jj
  | jd| d | jd| d | jd| d |ro|dkr_|dkr_| j| jd	| d
 dS |dkrm| j| jd dS |js|s||dkr|dkrddlm} ||j	|}	| j| jd| d|	j	 d d|_|jdgd tjj|dd| d|||j	|j	dd dS |dkrddlm}
 |
|j	}	| j| jd|	j	 d tjj|dd| d|||j	|j	dd dS dS | jd dS )z%Monitor a single call for time limitsu   
📞 Call ID: z - u      ⏱️  Elapsed time: su      📊 DB Remaining: u      🔮 After this call:    r   u#      ⚠️  WOULD send 30s warning (zs remaining)u+      🛑 WOULD end call (time limit reached)N)send_time_warning_to_senioru      ⚠️  Sent zs warning (Task ID: )Tis_limit_enforced)update_fieldstime_warning_sentz30-second warning sent. z seconds remaining)elapsed_secondsremaining_secondsr   	senior_id)r-   
event_typemessagedata)enforce_call_limit_tasku3      🛑 Ending call - time limit reached (Task ID: time_limit_reachedzTime limit reached. Elapsed: u      ✅ Already enforced)r   nowcall_start_timetotal_secondsr   seniorget_remaining_secondsr   r   r   namer   r   r#   r4   calls.tasksr2   delaysaver   r   creater=   )r   r-   r*   r   r7   rB   r8   remaining_after_callr2   resultr=   r   r   r   r!   =   sr   




zCommand.monitor_single_callN)FF)__name__
__module____qualname__r
   r   r/   r!   r   r   r   r   r   
   s
    r   )django.core.management.baser   django.utilsr   calls.modelsr   r   seniors.modelsr   logging	getLoggerrK   r%   r   r   r   r   r   <module>   s    
