U
    ph1                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlZddl	Z	e	j
e	jd e	eZe Zede  eeZedded	Zd
ddgddgddgddgddgdZddddddZdd Zdd Zdd  Zd!d" Zd#d$ Zed%kred& e  e  dS )'z
Script to extract and update project names from window titles
This script analyzes activity records and attempts to extract project names
from window titles and file paths
    )create_enginetext)sessionmaker)ConfigN)levelzConnecting to: F)Z
autocommitZ	autoflushZbindz+^(.+?)\s*-\s*(.+?)\s*-\s*Visual Studio Codeu2   ^(.+?)\s*●?\s*-\s*(.+?)\s*-\s*Visual Studio Codez+^\[(.+?)\]\s*(.+?)\s*-\s*Visual Studio Codez^(.+?)\s*-\s*(.+?)\s*-\s*Cursoru&   ^(.+?)\s*●?\s*-\s*(.+?)\s*-\s*Cursoru    ^(.+?)\s*–\s*(.+?)\s*\[(.+?)\]z^(.+?)\s*-\s*PyCharmz^(.+?)\s*-\s*IntelliJ IDEAz%^(.+?)\s*-\s*(.+?)\s*-\s*Sublime Textu'   ^(.+?)\s*•\s*(.+?)\s*-\s*Sublime TextZvscodeZcursorpycharmintellijZsublimezgithub\.com/([^/]+)/([^/\s]+)zgitlab\.com/([^/]+)/([^/\s]+)z bitbucket\.org/([^/]+)/([^/\s]+)zlocalhost:\d+z([A-Z]{2,10}-\d+))githubgitlab	bitbucket	localhostjirac                    sL  | sdS |r|  nd t D ]\}}| kr |D ]}t|| }|r4|dkrvt| dkrv|d     S t| dkr|d     S t| dkr4|d     S q4q t	 fddd	D rHt
 D ]`\}}t|| tj}|r|d
kr|d  S |dkr8d|d   S |dkr dS qdS )z;Extract project name from window title based on applicationN )r   r	            c                 3   s   | ]}| kV  qd S N ).0browser	app_lowerr   ./extract_projects.py	<genexpr>M   s     z4extract_project_from_window_title.<locals>.<genexpr>)ZchromeZfirefoxZedgeZsafariZbraver
   r   r   r   zJIRA-r   zLocal Development)lowerIDE_PATTERNSitemsresearchlengroupsgroupstripanyBROWSER_PATTERNS
IGNORECASE)window_titleapplication_nameidepatternspatternmatchservicer   r   r   !extract_project_from_window_title7   s2    

r/   c           	      C   s   | sdS dddddddd	d
ddg}|D ]&}t || t j}|r&|d  S q&dddddg}|D ]\}||  kr`| ddd}t|D ]0\}}| |kr|dkr||d      S qq`dS )z#Extract project name from file pathNz/([^/]+)/src/z/([^/]+)/app/z/([^/]+)/lib/z/([^/]+)/backend/z/([^/]+)/frontend/z/([^/]+)/client/z/([^/]+)/server/z\\([^\\]+)\\src\\z\\([^\\]+)\\app\\z\\([^\\]+)\\backend\\z\\([^\\]+)\\frontend\\r   zpackage.jsonzpom.xmlzbuild.gradlezrequirements.txtzsetup.py\/r   )r   r    r'   r#   r   replacesplit	enumerate)		file_pathZproject_indicatorsr,   r-   Zcommon_filesfilepartsipartr   r   r   extract_project_from_file_pathZ   s4    r:   c                    s  | sdS |   }|r|  nd |r,|  ndt fdddD rd|ks^d|ks^d|krbd	S d
|kszd|kszd|kr~dS d|ksd|krdS dS t fdddD rdS t fdddD rdS t fdddD rdS t fdddD rdS dS )z'Categorize the project based on context)ZOtherGeneralr   c                 3   s   | ]}| kV  qd S r   r   )r   r*   r   r   r   r      s     z%categorize_project.<locals>.<genexpr>r   ZbackendZapiserver)DevelopmentZBackendZfrontendZclientZweb)r=   ZFrontendZmobileZapp)r=   ZMobile)r=   r;   c                 3   s   | ]}| kV  qd S r   r   )r   dbr   r   r   r      s     )ZdatagripZpgadminZmysqlZmongodb)ZDatabaseAdministrationc                 3   s   | ]}| kp|kV  qd S r   r   )r   r<   r   Ztitle_lowerr   r   r      s   )ZpleskZcpanelZsshZputtyZ	filezilla)zServer Managementr?   c                 3   s   | ]}| kV  qd S r   r   )r   docr   r   r   r      s     )ZwordZdocsZnotionZ
confluence)ZDocumentationZWritingc                 3   s   | ]}| kV  qd S r   r   )r   Zcommr   r   r   r      s     )ZteamsZslackZzoomZmeet)ZCommunicationZMeeting)ZWorkr;   )r   r%   )project_namer(   r)   Zproject_lowerr   r@   r   categorize_project~   s0    rC   c                  C   s  t  } z| td }tdt| d d}i }|D ]Z}|\}}}}}	d}
t||}
|
st|rtt|}
|
s|	rd|pd	 krt
 D ]2\}}t||	tj}|r|dkr|d	}
 qq|
rB|
 }
t|
d
kr|
dd
 }
t|
||\}}| td|
||d |d7 }|
|kr:dt t d||
< ||
 d  d7  < ||
 d | |rx||
 d | |d
 dkrB|   td| d qB|   td tdt|  td|  tdt|  |rtd t| dd dddd }|D ]p\}}td| d td |d   td!d"|d   td#d"t|d dd$   qW n> tk
r } ztd%|  |    W 5 d}~X Y nX W 5 Q R X dS )&z:Update activity records with extracted project informationa'  
                SELECT id, window_title, application_name, file_path, url
                FROM activity_records
                WHERE project_name IS NULL
                AND timestamp >= NOW() - INTERVAL '30 days'
                ORDER BY timestamp DESC
                LIMIT 5000
            zFound z activities to processr   Nr   r   r   r   d   z
                        UPDATE activity_records
                        SET project_name = :project_name,
                            project_type = :project_type
                        WHERE id = :id
                    )rB   project_typeidr   )counttypesappsrG   rH   rI   zUpdated z records...z$
=== PROJECT EXTRACTION COMPLETE ===zTotal activities processed: z Activities with projects found: zUnique projects found: z
=== TOP PROJECTS ===c                 S   s   | d d S )Nr   rG   r   )xr   r   r   <lambda>      z%update_project_info.<locals>.<lambda>T)keyreverse   
:z  Activities: z	  Types: z, z  Apps: r   zError updating project info: )SessionLocalexecuter   fetchallloggerinfor!   r/   r:   r   r&   r   r   r    r'   r#   r$   rC   setaddZcommitsortedjoinlist	ExceptionerrorZrollback)r>   
activitiesupdatedZprojects_foundZactivityZactivity_idr(   Zapp_namer5   ZurlrB   r.   r,   r-   rE   Zproject_categoryZsorted_projectsprojectrV   er   r   r   update_project_info   s    
	


  




.rb   c                  C   s  t  } | td }td td|d   td|d   td|d  d	|d |d  d
 dd td|d   | td }td |D ]D\}}}}}t| d	| d td|dd| d| d qW 5 Q R X dS )z-Get statistics about projects in the databasea  
            SELECT 
                COUNT(DISTINCT project_name) as unique_projects,
                COUNT(*) as total_activities,
                COUNT(CASE WHEN project_name IS NOT NULL THEN 1 END) as activities_with_projects,
                COUNT(DISTINCT developer_id) as developers
            FROM activity_records
            WHERE timestamp >= NOW() - INTERVAL '30 days'
        z
=== PROJECT STATISTICS ===zUnique projects: r   zTotal activities: r   zActivities with projects: r   z (rD   z.1fz%)zActive developers: r   a  
            SELECT 
                project_name,
                project_type,
                SUM(duration) / 3600.0 as total_hours,
                COUNT(*) as activity_count,
                COUNT(DISTINCT developer_id) as developers
            FROM activity_records
            WHERE project_name IS NOT NULL
            AND timestamp >= NOW() - INTERVAL '30 days'
            GROUP BY project_name, project_type
            ORDER BY total_hours DESC
            LIMIT 15
        z
=== TOP PROJECTS BY HOURS ===z):z  z hours, z activities, z developersN)rR   rS   r   ZfetchonerU   rV   rT   )r>   ZstatsZtop_projectsr`   ZptypeZhoursr^   Zdevsr   r   r   get_project_statistics  s    

.
rc   __main__z&Starting project extraction process...)__doc__Z
sqlalchemyr   r   Zsqlalchemy.ormr   Zconfigr   r   ZloggingZbasicConfigINFOZ	getLogger__name__rU   Zget_database_urlZDATABASE_URLprintZenginerR   r   r&   r/   r:   rC   rb   rc   rV   r   r   r   r   <module>   sV   
#$'m)
