
    Ji1                         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j,                  e      Z e       Zd Zg d	g d
g dg ddZddedededefdZej=                  d      ddd ee      fdedee   dee   dee   def
d       Zej=                  d      dd ee      fdedee   dee   defd       Z ejC                  d       ee      fdefd       Z"y)    )	APIRouterDependsHTTPExceptionQuery)Session)textand_func)get_db)datetimetimezone	timedelta)OptionalListDictNc                 |    | dz  }t        |dz        }t        |dz  dz        }t        |dz        }| d| d| dS )z/Convert milliseconds to hours, minutes, seconds    <   zh zm s)int)millisecondstotal_secondshoursminutessecondss        ;E:\timesheet\timesheet_new\backend\enhanced_activity_api.pyformat_durationr      sW     4'M%&E=4'B./G-"$%GWBwir'!,,    )Ezcode.execodez
cursor.execursorz
devenv.exeznotepad++.exezsublime_text.exezatom.exezbrackets.exevim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.exebashzgit-bash.exez
conemu.exez	hyper.exeiterm2warp	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.exe)	z
chrome.exezfirefox.exez
msedge.exez	opera.exez	brave.exezvivaldi.exesafariziexplore.exebrowser)z
winscp.exez	putty.exezmobaxterm.exezsecurecrt.exez
xshell.exez	royal tsxztermius.exezcyberduck.exetransmitforkliftzexpandrive.exez	mysql.exezpsql.exez	mongo.exezredis-cli.exezpgadmin4.exe
phpmyadminadminerz
sequel prozmongodb compass.exezrobo 3t.exezredis desktop manager.exeapachenginxhttpdznode.exezphp.exez
python.exe)!z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                 h   | sy| j                         |r|j                         ndt        j                         D ]>  \  }}t        fd|D              s|dk(  rrg d}t        fd|D              r y|c S  dv sd	v ry
t        fddD              ryt        fddD              ryy)zDCategorize activity based on application name, window title, and URLuncategorized c              3   &   K   | ]  }|v  
 y wN ).0app	app_lowers     r   	<genexpr>z&categorize_activity.<locals>.<genexpr>M   s     04Csi4   r*   )
githubstackoverflowdocsapi	localhostjira
confluenceawsazurezgoogle cloudc              3   B   K   | ]  }|j                         v   y wr=   )lower)r?   domainr7   s     r   rB   z&categorize_activity.<locals>.<genexpr>S   s     H<v,<s   r2   youtubenetflixr4   c              3   &   K   | ]  }|v  
 y wr=   r>   r?   termtitle_lowers     r   rB   z&categorize_activity.<locals>.<genexpr>[   s     
U+T44;+TrC   )sshr$   consolecommandr3   c              3   &   K   | ]  }|v  
 y wr=   r>   rS   s     r   rB   z&categorize_activity.<locals>.<genexpr>^   s     
\+[44;+[rC   )z.pyz.jsz.htmlz.cssz.javaz.cpp)rN   APP_CATEGORIESitemsany)r5   r6   r7   categoryappswork_domainsrA   rU   s     `   @@r   categorize_activityr`   C   s     I*6,$$&BK )..0$04009$ UH<HH)O 1 K9#;

U+T
UU

\+[
\\r   z!/api/activity-data/{developer_id}developer_id
start_dateend_dater]   dbc                   K   	 |r&t        j                  |j                  dd            }n6t        j                  t        j
                        j                  dddd      }|r&t        j                  |j                  dd            }n#t        j                  t        j
                        }t        d      }|j                  || ||d      }g }	d}
dddddd}|D ]  }|d   xs d	}|d
   xs d	}|d   xs d	}|d   xs d}i }|d   r1	 t        |d   t              rt        j                  |d         n|d   }|d   r|d   }nt        |||      }|r||k7  r|d   |d   |||||d   r|d   j                         nd||d   |d
}|	j                  |       |
|z  }
||xx   |z  cc<    i }|j                         D ]2  \  }}|t!        |
dkD  r||
z  dz  ndd      t!        |dz  d      d||<   4 |	t#        |
      t%        |	      ||j                         |j                         ddS #  Y xY w# t&        $ r3}t(        j+                  d|        t-        dt        |            d}~ww xY ww)z6Get categorized activity data for a specific developerZz+00:00r   )hourminutesecond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
        )dev_idrb   rc   r2   r*   r3   r4   r:      r;                        N	   )
idra   application_namer6   r7   duration	timestampr]   project_nameactivity_detailsd   r   )rx   
percentager   )startend)data
total_timetotal_activitiescategory_breakdown
date_rangezError fetching activity data:   status_codedetail)r   fromisoformatreplacenowr   utcr   execute
isinstancestrjsonloadsr`   	isoformatappendr[   roundr   len	Exceptionloggererrorr   )ra   rb   rc   r]   rd   r~   r   queryresult
activitiestotal_durationr   rowr5   r6   r7   rx   r{   activity_categoryactivitycategory_percentagescates                          r   get_developer_activity_datar   c   s    p<**:+=+=c8+LMELL.66AaPQ_`6aE(()9)9#x)HIC,,x||,C   & E"$
  

 C1v|Hq6<RLa&,BC1v{H  "1v=GAPS=Ttzz#a&'9Z]^_Z`$
 1v$'F! %8,PS$T! -9 !f #A$, ,$36q6SV--/t- #A$4H h'h&N01X=1Q V  "/557MC$#Z[I[X%>%Dabdefx$2) % 8 ).9 #J"6*}}	
 		
Qd  <5aS9:CF;;<sB   I4DH5 0H.;C2H5 -I4.H20H5 5	I1>.I,,I11I4z'/api/activity-categories/{developer_id}c                   K   	 t        | ||d|       d{   }g g g g g d}|d   D ]   }|d   }||v s||   j                  |       " i }|j                         D ]  \  }}	i }
|	D ]   }|d   }||
vrd|
|<   |
|xx   |d   z  cc<   " t        |
j                         d d	
      dd }|	dd t	        |	      t        d |	D              dz  |D cg c](  \  }}||t        |d   dkD  r||d   z  dz  ndd      d* c}}d||<    ||d   |d   dS 7 c c}}w # t        $ r3}t        j                  d|        t        dt        |            d}~ww xY ww)z'Get activity data grouped by categoriesNrl   r   r]   rw   r   rx   c                     | d   S )Nrs   r>   )xs    r   <lambda>z,get_activity_by_categories.<locals>.<lambda>  s    adr   T)keyreverse
   r|   c              3   &   K   | ]	  }|d      yw)rx   Nr>   )r?   as     r   rB   z-get_activity_by_categories.<locals>.<genexpr>  s     %HZa
mZs   r   r   rs   )namerx   r}   )r   r   r   top_applicationsr   r   )
categoriessummaryr   z'Error fetching categorized activities: r   r   )r   r   r[   sortedr   sumr   r   r   r   r   r   )ra   rb   rc   rd   all_datacategorized_datar   r]   category_statsr   app_durationsr5   top_appsr@   rx   r   s                   r   get_activity_by_categoriesr      s    ;<4*hb
 
 
 !(H
+H++ *11(; ) $4$:$:$< HjM&#$67=0./M(+h'8J+??'	 ' ##%" r	H )#.$'
O"%%HZ%H"H"M *2% *2X	 !$$,&+YabnYorsYsX8N-NQT-Tyz|}&~
 *2%	(N8$ %=< ) 45"<0
 	
c
N%   <>qcBCCF;;<sP   ED DD BD -D>D ED D 	E&.EEEz/api/update-activity-categoriesc                   K   	 t        d      }| j                  |      }d}|D ]T  }|d   }|d   xs d}|d   xs d}|d   xs d}t        |||      }	t        d      }
| j                  |
|	|d       |dz  }V | j                          d	|d
| ddS # t        $ rC}| j                          t        j                  d|        t        dt        |            d}~ww xY ww)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   rs   r;   rm   rn   z}
                UPDATE activity_records
                SET category = :category
                WHERE id = :id
            )r]   rv   TzSuccessfully categorized z activities)successupdated_countmessagezError updating categories: r   r   N)
r   r   r`   commitr   rollbackr   r   r   r   )rd   r   r   r   r   activity_idr5   r6   r7   r]   update_queryr   s               r   update_activity_categoriesr   #  s    -<   E"Ca&K1v|Hq6<RLa&,BC +8\3GH   ! L JJ|$!& 
 QM+ . 			 *2=/M
 	
  <
21#67CF;;<s)   C$BB C$	C!>CC!!C$)r;   r;   )#fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   r	   r
   databaser   r   r   r   typingr   r   r   r   logging	getLogger__name__r   routerr   rZ   r   r`   getr   r   postr   r>   r   r   <module>r      s   < < " ' '  2 2 ' '  			8	$	-$	A*X# S C QT @ /0 !%""&/x<x<x< smx< sm	x<
 	x< 1x<t 56 !%"&/	B<B<B< smB< 		B< 7B<H ./3:6? /< /< 0/<r   