U
    [MhH                     @   st  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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ddeefe!e!e!e!edddZ#e deef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)DiscoveredDeveloper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ee d
ddZee dddZdS ) EnvironmentBasedDeveloperServicez5Service to handle developer list based on environmentdbc                 C   s   || _ t|| _d S )N)r   r   	discovery)selfr    r   ./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   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  zLt  }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,n| |}|dkr| |}|d| ||ddddd| |||r| ndddd n,|d| ||ddddd|ddd
dd |dt|t	
tj |dW S  tk
r } z*td|  tddt| dW 5 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_Z	localhosti  Zdatabase_onlydatabasezHistorical data for NZ
local_new_ZofflinezLocal developer (no data yet))
developersenvironmenttotal_countdiscovered_atZlocal_developerzError getting local developer:   Zstatus_codeZdetail)socketZgethostnamer   ZLOCAL_DEVELOPER_NAMEr   Zdiscover_local_instancesappendget_get_activity_countr	   nowr   utc	isoformat_get_last_activity_timelen	Exceptionloggererrorr   str)	r   Zlocal_hostnameZlocal_developer_nameZlocal_instancesr6   instanceZdb_activity_countZlast_activityer   r   r   r    $   s    







z:EnvironmentBasedDeveloperService._get_local_developer_onlyc           
   
   C   sD  z|sJ|   }|rJ| j|}| | |dt|ttj	 ddW S t
d | jj|||d}|D ]^}| |dp|d |d< |d	sj| |dp|d |d	< |d	 rj|d	 	 |d	< qj| | |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)
productionT)r6   r7   r8   r9   Z
from_cachez&Performing full developer discovery...)r   r   r   r.   r-   r3   r4   Fz"Error discovering all developers: r:   zError discovering developers: r;   N)_get_cached_developersr   refresh_developer_status_update_developer_cacherD   r	   r@   r   rA   rB   rF   infoZdiscover_all_developersr?   r>   rC   rE   rG   r   rH   )
r   r   r   r   r   Zcached_developersZupdated_developersZdiscovered_developersdevrJ   r   r   r   r!   v   sD    
	


z4EnvironmentBasedDeveloperService._get_all_developers)developer_namer   c              
   C   s   zJddl m}m} | j|tj|tj	|ktj
|k }|pHdW S  tk
r } z td| d|  W Y dS d}~X Y nX dS )z"Get activity count for a developerr   )funcor_z!Error getting activity count for : N)
sqlalchemyrR   rS   r   querycountr   r-   filterrQ   developer_idZscalarrE   rF   warning)r   rQ   rR   rS   rW   rJ   r   r   r   r?      s    
z4EnvironmentBasedDeveloperService._get_activity_countc              
   C   s   zXddl m}m} | jtj|tj|ktj	|k
|tj }|rT|d ndW S  tk
r } z td| d|  W Y dS d}~X Y nX dS )z&Get last activity time for a developerr   )rS   descNz%Error getting last activity time for rT   )rU   rS   r[   r   rV   r   Z
created_atrX   rQ   rY   order_byfirstrE   rF   rZ   )r   rQ   rS   r[   Zlast_recordrJ   r   r   r   rC      s    z8EnvironmentBasedDeveloperService._get_last_activity_timec              
   C   s   zB| j ttjdktjt tdd k	 }dd |D W S  t
k
r| } ztd|  g  W Y S d}~X Y nX dS )z#Get cached developers from databaseT   )Zhoursc                 S   sT   g | ]L}|j |j|j|j|j|j|j|j|j|j	|j
r@|j
 nd |j|jdqS )Nr,   )r-   r.   r/   r$   r#   r0   r1   r2   r'   r3   r4   rB   r)   r+   ).0rP   r   r   r   
<listcomp>   s   zKEnvironmentBasedDeveloperService._get_cached_developers.<locals>.<listcomp>z!Error getting cached developers: N)r   rV   r   rX   	is_activer9   r	   r@   r
   allrE   rF   rZ   )r   cachedrJ   r   r   r   rL      s    z7EnvironmentBasedDeveloperService._get_cached_developers)r6   c                 C   s  zt| j ttjdi |D ]0}| j tj|d d }|r|d |_|d |_|d |_	|d |_
|d |_|d	 |_|d
 |_|d rt|d ddnd|_d|_t |_q t|d |d |d |d |d |d|d |d |d |d	 |dd|dd|d
 |d r<t|d ddnddd}| j | q | j   tdt| d W n> tk
r } ztd|  | j   W 5 d}~X Y nX dS )z"Update developer cache in databaseFr-   )r-   r.   r/   r$   r#   r0   r2   r3   r4   Z+00:00NTr'   r1   r)   r*   r+   r   )r-   r.   r/   r$   r#   r'   r0   r1   r2   r)   r+   r3   r4   ra   zUpdated cache with z developersz Error updating developer cache: )r   rV   r   updatera   Z	filter_byr]   r.   r/   r$   r#   r0   r2   r3   r	   fromisoformatreplacer4   r@   Z
updated_atr>   addZcommitrF   rO   rD   rE   rG   Zrollback)r   r6   rP   existingZnew_devrJ   r   r   r   rN      sP     







$

"
z8EnvironmentBasedDeveloperService._update_developer_cacheN)FTTF)__name__
__module____qualname____doc__r   r   boolr   r"   r    r!   rH   intr?   r   r	   rC   r   rL   rN   r   r   r   r   r      s,        R  3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/discover-developersc                    s   t |}|| |||S )z#Discover developers (force refresh)rq   rr   r   r   r   discover_developers'  s    	rt   z/developers-statusr   c                    sb   t | }| }|s| S t| }||}|| |t rFdndt|t	
tj dS )z'Refresh status of all cached developersr&   rK   )Zdevelopers_statusr7   r8   Zrefreshed_at)r   rL   r"   r   rM   rN   r   r   rD   r	   r@   r   rA   rB   )r   rs   Zcached_devsr   Zupdated_devsr   r   r   refresh_developers_status3  s    

ru   z/activity-data/{developer_id})rY   
start_dateend_dater   c                    s  zh|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rzt
|}| rP|||}	d}
td|d  dt|	 d ddlm} |	D ]N}z|||dd W n4 tk
rJ } ztd|  W 5 d}~X Y nX q W n> tk
r } ztd|d  d|  W 5 d}~X Y nX |	s8ddlm}m} |t||tj ktj|d ktj|dktj|ktj|ktj ! "d# }dd |D }	d}
td|d  dt|	 d |	||
t$dd |	D |% |% d t|	d!W S  tk
r } z0t&d"  d|  t	d#d$t'| dW 5 d}~X Y nX dS )%z*Get activity data for a specific developerrd   re   r   )ZhourZminutesecondZmicrosecondc                 3   s   | ]}|d   kr|V  qdS )r-   Nr   )r_   drY   r   r   	<genexpr>b  s      z.get_developer_activity_data.<locals>.<genexpr>r6   Ni  zDeveloper not foundr;   r5   r0   r%   ZactivitywatchzRetrieved live data for r.   rT   z activities)safe_create_activity_recordr^   )Zuser_idzFailed to cache activity: zFailed to get live data for )and_rS   r'   i  c                 S   sH   g | ]@}|j |j|j|j|j|jr,|j nd |j|j|j	|j
d
qS )N)
rY   rQ   application_namewindow_titledurationZ	timestampcategorydetailed_activityurl	file_path)rY   rQ   r~   r   r   activity_timestamprB   r   r   r   r   )r_   recordr   r   r   r`     s   z/get_developer_activity_data.<locals>.<listcomp>zRetrieved database data for c                 s   s   | ]}|d  V  qdS )r   Nr   )r_   itemr   r   r   r{     s     )startend)data	developerdata_sourceZ
total_timeZ
date_ranger3   z Error getting activity data for r:   zError getting activity data: )(r	   rg   rh   r@   r   rA   r   r"   nextr   r   Ztest_connectionZget_activity_datarF   rO   rD   Zsafe_activity_cachingr|   rE   rZ   rU   r}   rS   rV   r   rX   rY   rQ   r'   r>   r   r\   r   r[   limitrb   sumrB   rG   rH   )rY   rv   rw   r   r   r   rs   Zdevelopers_resultr   Zactivity_datar   Zclientr|   ZactivityrJ   r}   rS   Z
db_recordsr   rz   r   get_developer_activity_dataJ  sz    
 *,


 	r   )'Zfastapir   r   r   Zsqlalchemy.ormr   typingr   r   r   r	   r
   r   osZloggingr5   r   Zmodelsr   r   Zconfigr   Zdeveloper_discoveryr   Zdynamic_activitywatch_clientr   r<   Z	getLoggerrk   rF   Zrouterr   r>   ro   r"   rt   ru   rH   r   r   r   r   r   <module>   sl   
  