U
    "hz7                     @   s   d dl mZmZmZ d dlmZ d dlmZmZm	Z	 d dl
m
Z
mZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZeeZe ZG dd dZedddddeefe e e e edddZ!edddeefe"e	e" e	e" edddZ#dS )    )	APIRouterDependsHTTPException)Session)ListDictOptional)datetime	timedeltatimezoneN)get_db)ActivityRecord)Config)DeveloperDiscovery)DynamicActivityWatchClientc                   @   s~   e Zd ZdZedddZdeeeeeddd	Zed
ddZ	eeeeedddZ
eedddZeee dddZdS ) EnvironmentBasedDeveloperServicezMService to handle developer list based on environment - Fixed for existing DB)dbc                 C   s   || _ t|| _d S )N)r   r   	discovery)selfr    r   >/var/www/html/timesheet/backend/fixed_dynamic_developer_api.py__init__   s    z)EnvironmentBasedDeveloperService.__init__FT)scan_network
scan_localscan_databaseforce_refreshreturnc                 C   s$   t  r|  S | ||||S dS )z>Get developers list based on environment (local vs production)N)r   Zis_local_get_local_developer_only_get_all_developers)r   r   r   r   r   r   r   r   get_developers_list   s    z4EnvironmentBasedDeveloperService.get_developers_list)r   c                 C   s  z8t  }tjp|}| j }g }|r|D ]t}|d|d  |||d |d ddd|d| d|d  | |t	
tj |d	d
|ddd q,nv| |}|d| ||dd|dkrdnd|dkrdnd|dkrd| dnd||| ||dkrdnd
dd |dt|t	
tj |dW S  tk
r } zdtd|  dtjt  ddd
ddt  ddd
ddgddt	
tj tjt|d W Y S d}~X Y nX dS )z'Return only the current local developerZlocal_porthostonlinelocalzLocal ActivityWatch instance	device_id_versionunknownbucket_countr   )idnamehostnamer!   r    statussourcedescriptionr$   activity_count	last_seenr&   r(   Z	local_db_	localhosti  database_onlyofflinedatabasezLocal developer (z activities in database)zLocal developer (no data yet))
developersenvironmenttotal_countdiscovered_atlocal_developerzError getting local developer: Zlocal_fallbackz Local developer (database error)N   )r5   r6   r7   r8   r9   error)socketgethostnamer   ZLOCAL_DEVELOPER_NAMEr   discover_local_instancesappendget_get_activity_count_safer	   nowr   utc	isoformat_get_last_activity_time_safelen	Exceptionloggerr;   str)r   Zlocal_hostnameZlocal_developer_nameZlocal_instancesr5   instanceZdb_activity_counter   r   r   r   $   s    




z:EnvironmentBasedDeveloperService._get_local_developer_onlyc              
   C   s  zt d | jj|||d}|D ]t}| |dp:|d |d< |ds"| |dp`|d |d< |d r"t|d tr|d 	 n|d |d< q"|dt
|ttj	 dd	W S  tk
r } z*t d
|  tddt| dW 5 d}~X Y nX dS )z5Get all developers from all sources (production mode)z&Performing full developer discovery...)r   r   r   r*   r)   r/   r0   
productionF)r5   r6   r7   r8   Z
from_cachez"Error discovering all developers:   zError discovering developers: status_codedetailN)rH   infor   discover_all_developersrA   r@   rE   
isinstancer	   rD   rF   rB   r   rC   rG   r;   r   rI   )r   r   r   r   r   discovered_developersdevrK   r   r   r   r   x   s,    

(z4EnvironmentBasedDeveloperService._get_all_developers)developer_namer   c              
   C   s   zBddl m}m} | j|d|d| dd}| }|p@dW S  tk
r } zjtd| d|  z:| j|d}| }t	d	|  |pdW  W Y S    Y W Y 
dS X W 5 d
}~X Y nX d
S )z)Safely get activity count for a developerr   )functextz
                SELECT COUNT(*) 
                FROM activity_records 
                WHERE COALESCE(developer_name, CAST(developer_id AS TEXT)) = :dev_name
                OR application_name LIKE :app_pattern
            %dev_nameapp_patternz!Error getting activity count for : z%SELECT COUNT(*) FROM activity_recordsz Returning total activity count: N)

sqlalchemyrW   rX   r   executescalarrG   rH   warningrQ   )r   rV   rW   rX   resultcountrK   totalr   r   r   rA      s$    


z9EnvironmentBasedDeveloperService._get_activity_count_safec              
   C   s   zFddl m} | j|d|d| dd}| }|rB| ndW S  tk
r } z td| d|  W Y dS d}~X Y nX dS )	z-Safely get last activity time for a developerr   rX   a  
                SELECT MAX(COALESCE(activity_timestamp, timestamp, created_at))
                FROM activity_records 
                WHERE COALESCE(developer_name, CAST(developer_id AS TEXT)) = :dev_name
                OR application_name LIKE :app_pattern
            rY   rZ   Nz%Error getting last activity time for r]   )	r^   rX   r   r_   r`   rD   rG   rH   ra   )r   rV   rX   rb   Z	last_timerK   r   r   r   rE      s    

z=EnvironmentBasedDeveloperService._get_last_activity_time_safeN)FTTF)__name__
__module____qualname____doc__r   r   boolr   r   r   r   rI   intrA   r   rE   r   r   r   r   r      s(        T   r   z/developersFT)r   r   r   r   r   c                    s   t |}|| |||S )z(Get developers list based on environment)r   r   )r   r   r   r   r   servicer   r   r   r      s    	r   z/activity-data/{developer_id})developer_id
start_dateend_dater   c              
      sn  z|rt |dd}nt tjjddddd}|rNt |dd}nt tj}t|}| }tfdd|d D d  st	d	d
dg }d}	 d dkr0zDt
 }
|
 r|
||}d}	td d  dt| d W n> tk
r. } ztd d  d|  W 5 d}~X Y nX |szvddlm} ||d d d d  d||d } fdd|D }d}	td d  dt| d W n8 tk
r } ztd|  g }W 5 d}~X Y nX | |	tdd |D | | dt|dW S  tk
rh } z0td  d|  t	d!d"t| dW 5 d}~X Y nX dS )#z*Get activity data for a specific developerZz+00:00r   )hourminutesecondmicrosecondc                 3   s   | ]}|d   kr|V  qdS )r)   Nr   ).0d)rm   r   r   	<genexpr>   s      z.get_developer_activity_data.<locals>.<genexpr>r5   Ni  zDeveloper not foundrN   r4   r,   r"   ZactivitywatchzRetrieved live data for r*   r]   z activitieszFailed to get live data for re   aE  
                    SELECT 
                        application_name,
                        window_title,
                        duration,
                        timestamp,
                        category,
                        detailed_activity,
                        url,
                        file_path,
                        COALESCE(developer_name, CAST(developer_id AS TEXT)) as dev_name
                    FROM activity_records
                    WHERE (
                        COALESCE(developer_name, CAST(developer_id AS TEXT)) = :dev_name
                        OR application_name LIKE :app_pattern
                    )
                    AND timestamp >= :start_date
                    AND timestamp <= :end_date
                    ORDER BY duration DESC
                    LIMIT 1000
                rY   )r[   r\   rn   ro   c                    s^   g | ]V} d  |j |j|jp d|jr0|j nd|jp:d|jpD|j|jpLd|jpTdd
qS )r*   r   NZOther )
rm   rV   application_namewindow_titleduration	timestampcategorydetailed_activityurl	file_path)	ry   rz   r{   r|   rD   r}   r~   r   r   )ru   record	developerrm   r   r   
<listcomp>%  s   
z/get_developer_activity_data.<locals>.<listcomp>zRetrieved database data for z Error getting database records: c                 s   s   | ]}|d  V  qdS )r{   Nr   )ru   itemr   r   r   rw   =  s     )startend)datar   data_source
total_time
date_ranger/   z Error getting activity data for rM   zError getting activity data: )r	   fromisoformatreplacerB   r   rC   r   r   nextr   r   test_connectionget_activity_datarH   rQ   rF   rG   ra   r^   rX   r_   fetchallr;   sumrD   rI   )rm   rn   ro   r   r   r   rl   developers_resultactivity_datar   clientrK   rX   Z
db_recordsr   r   r   get_developer_activity_data   sf    $,
$	r   )$fastapir   r   r   sqlalchemy.ormr   typingr   r   r   r	   r
   r   osloggingr4   r   modelsr   configr   developer_discoveryr   Zdynamic_activitywatch_clientr   r<   	getLoggerrf   rH   routerr   r@   rj   r   rI   r   r   r   r   r   <module>   sL   
 <