U
    h1                  E   @   s^  d dl mZ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 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eeZe Zdd	 Zd
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNgEdOdPdQdRdSdTdUdVdWg	dXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsgdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddg!dZdeeeedddZeddddeefeee ee ee edddZedddeefeee ee edddZ e!deefedddZ"dS )    )	APIRouterDependsHTTPExceptionQuery)Session)textand_func)get_db)datetimetimezone	timedelta)OptionalListDictNc                 C   sF   | d }t |d }t |d d }t |d }| d| d| dS )z/Convert milliseconds to hours, minutes, seconds    <   zh zm s)int)ZmillisecondsZtotal_secondshoursZminutesZseconds r   ./enhanced_activity_api.pyformat_duration   s
    r   zcode.execodez
cursor.exeZcursorz
devenv.exeznotepad++.exezsublime_text.exezatom.exezbrackets.exeZvimZemacszpycharm.exezpycharm64.exezidea.exez
idea64.exezwebstorm.exezphpstorm.exezrubymine.exez
goland.exez	clion.exez	rider.exezdatagrip.exezstudio64.exezeclipse.exeznetbeans.exezword.exezwinword.exez	excel.exezpowerpnt.exezoutlook.exez	teams.exez	slack.exezdiscord.exezzoom.exez	skype.exez
notion.exezobsidian.exezonenote.exezevernote.exeztodoist.exez
trello.exez	asana.exezclickup.exeterminalzcmd.exezpowershell.exeZbashzgit-bash.exez
conemu.exez	hyper.exeZiterm2ZwarpZ	alacrittyzpostman.exezinsomnia.exezfiddler.exeztableplus.exezdbeaver.exezheidisql.exeznavicat.exezgit.exezgitkraken.exezsourcetree.exezfork.exez
docker.exezdockerdesktop.exezvirtualbox.exez
vmware.exezfilezilla.exez
chrome.exezfirefox.exez
msedge.exez	opera.exez	brave.exezvivaldi.exeZsafariziexplore.exebrowserz
winscp.exez	putty.exezmobaxterm.exezsecurecrt.exez
xshell.exez	royal tsxztermius.exezcyberduck.exeZtransmitZforkliftzexpandrive.exez	mysql.exezpsql.exez	mongo.exezredis-cli.exezpgadmin4.exeZ
phpmyadminZadminerz
sequel prozmongodb compass.exezrobo 3t.exezredis desktop manager.exeZapacheZnginxZhttpdznode.exezphp.exez
python.exezspotify.exezvlc.exezmpv.exezwmplayer.exez
itunes.exeznetflix.exezdisney+.exezprime videozyoutube musicz	steam.exezepicgameslauncher.exez
origin.exez	uplay.exezleagueoflegends.exezvalorant.exezminecraft.exez
roblox.exezobs.exez	obs64.exezstreamlabs obs.exez
xsplit.exezphotoshop.exezillustrator.exezpremiere.exezaftereffects.exezblender.exezmaya.exez
3dsmax.exezcinema4d.exezwhatsapp.exeztelegram.exez
signal.exezmessenger.exe)productivityr   servernon-work )app_namewindow_titleurlreturnc                    s   | sdS |    |r|  ndt D ]f\}}t fdd|D r(|dkrrdddd	d
dddddg
}tfdd|D r dS |  S q(dksdkrdS tfdddD rdS tfdddD rdS dS )zDCategorize activity based on application name, window title, and URLuncategorizedr    c                 3   s   | ]}| kV  qd S Nr   ).0app)	app_lowerr   r   	<genexpr>M   s     z&categorize_activity.<locals>.<genexpr>r   ZgithubZstackoverflowZdocsZapiZ	localhostZjiraZ
confluenceZawsZazurezgoogle cloudc                 3   s   | ]}|   kV  qd S r&   )lower)r'   domain)r#   r   r   r*   S   s     r   ZyoutubeZnetflixr   c                 3   s   | ]}| kV  qd S r&   r   r'   Ztermtitle_lowerr   r   r*   [   s     )Zsshr   ZconsoleZcommandr   c                 3   s   | ]}| kV  qd S r&   r   r-   r.   r   r   r*   ^   s     )z.pyz.jsz.htmlz.cssz.javaz.cpp)r+   APP_CATEGORIESitemsany)r!   r"   r#   categoryZappsZwork_domainsr   )r)   r/   r#   r   categorize_activityC   s0    
    
r4   z!/api/activity-data/{developer_id})developer_id
start_dateend_dater3   dbc                    s\  z|rt |dd}nt tjjddddd}|rNt |dd}nt tj}td}||| ||d}g }	d}
dddddd}|D ]}|d pd	}|d
 pd	}|d pd	}|d pd}i }|d rz(t|d t	rt
|d n|d }W n   Y nX |d r |d }nt|||}|r>||kr>q|d |d |||||d rh|d  nd||d |d
}|	| |
|7 }
||  |7  < qi }| D ]@\}}|t|
dkr||
 d nddt|d dd||< q|	t|
t|	|| | ddW S  tk
rV } z$td|  tdt	|dW 5 d}~X Y nX dS )z6Get categorized activity data for a specific developerZz+00:00r   )ZhourZminutesecondZmicroseconda  
            SELECT 
                id,
                developer_id,
                application_name,
                window_title,
                url,
                duration,
                timestamp,
                activity_data,
                category,
                project_name
            FROM activity_records
            WHERE developer_id = :dev_id
              AND timestamp >= :start_date
              AND timestamp <= :end_date
            ORDER BY timestamp DESC
        )Zdev_idr6   r7   r   r   r   r   r%      r                         N	   )
idr5   application_namer"   r#   durationZ	timestampr3   Zproject_nameactivity_detailsd   r   )rG   
percentager   )startend)data
total_timetotal_activitiescategory_breakdown
date_rangezError fetching activity data:   Zstatus_codeZdetail)r   ZfromisoformatreplaceZnowr   Zutcr   execute
isinstancestrjsonloadsr4   Z	isoformatappendr1   roundr   len	Exceptionloggererrorr   )r5   r6   r7   r3   r8   rK   rL   queryresult
activitiestotal_durationrP   rowr!   r"   r#   rG   rH   Zactivity_categoryactivityZcategory_percentagescater   r   r   get_developer_activity_datac   s    	

(


rh   z'/api/activity-categories/{developer_id})r5   r6   r7   r8   c              
      s`  zt | ||d|I dH  g g g g g d} d D ]"}|d }||kr2|| | q2i }| D ]\}}i }	|D ]0}|d }
|
|	krd|	|
< |	|
  |d 7  < qrt|	 dd	 d
ddd }|dd t|tdd |D d  fdd|D d||< qb| d  d dW S  tk
rZ } z$td|  t	dt
|dW 5 d}~X Y nX dS )z'Get activity data grouped by categoriesNr;   rM   r3   rF   r   rG   c                 S   s   | d S )NrB   r   )xr   r   r   <lambda>      z,get_activity_by_categories.<locals>.<lambda>T)keyreverse
   rI   c                 s   s   | ]}|d  V  qdS )rG   Nr   )r'   ar   r   r   r*     s     z-get_activity_by_categories.<locals>.<genexpr>r   c                    s>   g | ]6\}}||t  d  dkr.| d   d ndddqS )rN   r   rI   rB   )namerG   rJ   )r[   )r'   r(   rG   Zall_datar   r   
<listcomp>  s
   $z.get_activity_by_categories.<locals>.<listcomp>)rb   rO   rc   Ztop_applicationsrP   rQ   )
categoriesZsummaryrQ   z'Error fetching categorized activities: rR   rS   )rh   rZ   r1   sortedr\   sumr]   r^   r_   r   rW   )r5   r6   r7   r8   Zcategorized_datare   r3   Zcategory_statsrb   Zapp_durationsr!   Ztop_appsrg   r   rq   r   get_activity_by_categories   s^        


rv   z/api/update-activity-categories)r8   c              
      s   zt d}| |}d}|D ]^}|d }|d p2d}|d p>d}|d pJd}t|||}	t d}
| |
|	|d |d7 }q|   d	|d
| ddW S  tk
r } z,|   td|  tdt	|dW 5 d}~X Y nX dS )z:Update all uncategorized activities with proper categoriesz
            SELECT id, application_name, window_title, url
            FROM activity_records
            WHERE category IS NULL OR category = ''
        r   rB   r    r<   r=   z}
                UPDATE activity_records
                SET category = :category
                WHERE id = :id
            )r3   rE   TzSuccessfully categorized z activities)successupdated_countmessagezError updating categories: rR   rS   N)
r   rU   r4   Zcommitr]   Zrollbackr^   r_   r   rW   )r8   r`   ra   rx   rd   Zactivity_idr!   r"   r#   r3   Zupdate_queryrg   r   r   r   update_activity_categories#  s2    


rz   )r    r    )#Zfastapir   r   r   r   Zsqlalchemy.ormr   Z
sqlalchemyr   r   r	   Zdatabaser
   r   r   r   typingr   r   r   rX   ZloggingZ	getLogger__name__r^   Zrouterr   r0   rW   r4   getrh   rv   Zpostrz   r   r   r   r   <module>   sf  
                                                                                 
                         , zD