U
    h*                     @   s   d Z ddlZddlmZmZ eeeee f dddZeeeddd	Zeeeeee f dd
dZ	eeeee f dddZ
eeeeee f dddZeeeeee f dddZeedddZeeedddZdS )zT
Improved Project Extractor - Better extraction of project names from window titles
    N)DictOptional)activity_datareturnc                 C   s   |  ddpd }|  ddp"d}|  dd}t||rFddddS t||}| dr^|S |rxt|}| drx|S t||}| dr|S t||S )zL
    Extract project information from activity data with improved logic
    application_name window_title	file_pathNproject_nameproject_typeproject_filer   )getloweris_non_work_activityextract_from_window_titleextract_from_file_pathextract_from_app_patternsextract_generic_project)r   app_namer   r	   project_info r   =/var/www/html/timesheet/backend/improved_project_extractor.pyextract_project_info   s     





r   )r   r   r   c                    sR   |  d|    dddddddd	d
ddddddddddg}t fdd|D S )z%Check if activity is non-work related zlock screenlockedlockappZlogonuiyoutubenetflixspotifytwitchZdisneyZhuluzprime videomusicvideomoviegameZsteamz
epic gamesoriginz
battle.netc                 3   s   | ]}| kV  qd S Nr   ).0patternZcombinedr   r   	<genexpr>4   s     z'is_non_work_activity.<locals>.<genexpr>r   any)r   r   Znon_work_patternsr   r)   r   r   )   s,                   r   c                 C   s   t d| }|rb|d }|d }t|dkrb| dkrbt||}t|}|||dS d}t || t j	}|r|d }	t|d }|d|	dS d| ksd	| kr| 
d
}
t|
dkr|
d  }d| dddS i S )z1Extract project from common window title patternsz^([^-]+?)\s*-\s*(.+)$      )znew tabuntitledznew filer
   z_^(.+?)\s*-\s*(.+?)\s*-\s*(Visual Studio Code|Cursor|Code|PyCharm|IntelliJ|Sublime|Atom|VS Code)Developmenttermiusterminal - zServer: Server ManagementzTerminal Session)rematchgroupstriplenr   determine_project_typeclean_project_namesearchIsplit)r   r   r7   Zproject_partZapp_partr   r   ide_patternZ	ide_match	file_namepartsZserver_namer   r   r   r   6   s:    

r   )r	   r   c                 C   s   | si S |  ddd}t|D ]P\}}| dkr"|d t|k r"t||d  }|d|rf|d ndd  S q"t|d	krt|d
 }|rt|d	kr|d|d dS i S )zExtract project from file path\/)projectsZreposZ	workspacesrcZ	documentsr-   r0   r4   Filer
   r.   )replacer?   	enumerater   r:   r<   )r	   
path_partsipartr   r   r   r   r   f   s&    r   c                    s  t  fdddD rd| ks(d| krtd| }|rB|dnd}| d	}t|dkrt|d
 }|r| dkr|dd| dS d| dd| dS d| ksd| krtd| }|rd|d dddS td| }|r|dp|d}d| dddS t  fdddD rXtd| tj}	|	rXd|	d dddS t  fd dd!D rtd"| }
|
rd#|
d d$d%dS i S )&z.Extract based on specific application patternsc                 3   s   | ]}| kV  qd S r&   r   )r'   browserr   r   r   r*      s     z,extract_from_app_patterns.<locals>.<genexpr>)chromefirefoxedgesafariz
localhost:z
127.0.0.1:z (?:localhost|127\.0\.0\.1):(\d+)r-   3000r3   r   )z	react appzvue app	localhostWeb Developmentr
   z
Local Dev:z
github.comz
gitlab.comu#   ([^/\s]+/[^/\s]+?)(?:\s*[-·]|\s*$)zGitHub: Z
RepositoryzSource Controlz1https?://([^/\s]+)|([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})r.   zWeb: zWeb BrowsingZWebsitec                 3   s   | ]}| kV  qd S r&   r   r'   dbrO   r   r   r*      s     )mysqlpostgresmongodbdatagrip
phpmyadminz(\w+)(?:\s*@\s*|\.|\s+database)zDB: DatabasezDatabase Managementc                 3   s   | ]}| kV  qd S r&   r   )r'   ftprO   r   r   r*      s     )	filezillaZwinscpZ	cyberduckz1([a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|\d+\.\d+\.\d+\.\d+)zFTP: zFile TransferzRemote Server)	r,   r6   r=   r8   r?   r:   r<   r   r>   )r   r   
port_matchportZtitle_partsr   Z
repo_matchdomain_matchdomaindb_matchserver_matchr   rO   r   r      sZ    
r   c                 C   s   | rHt | dkrH| d}t|d }|rHt |dkrH|t| |ddS |rtt |dkrt|dd }|d	d
dS ddddS )z&Generic project extraction as fallback   r3   r   r.   Activityr
   z.exer   ApplicationGeneralN)r:   r?   r<   r;   rI   title)r   r   rB   r   Z	app_cleanr   r   r   r      s$    
r   )namer   c                 C   s   | sdS t dd| } t dd| } t jdd| t jd} d| ksHd| krht d	| }dd
d |D } t| dkr| dd d } |  S )z"Clean and standardize project namer   z	^\W+|\W+$z\s+r   z+\.(py|js|html|css|php|java|cpp|c|rb|go|rs)$)flags_-z[_-]c                 s   s   | ]}|r|  V  qd S r&   )
capitalize)r'   rM   r   r   r   r*      s      z%clean_project_name.<locals>.<genexpr>2   Nz...)r6   subr>   r?   joinr:   r9   )rl   rB   r   r   r   r<      s    r<   c                    s   |  d|    t fdddD r,dS t fdddD rFdS t fd	dd
D r`dS t fdddD rzd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 dS dS )z'Determine project type based on contextr   c                 3   s   | ]}| kV  qd S r&   r   )r'   ider)   r   r   r*     s     z)determine_project_type.<locals>.<genexpr>)cursorvscodepycharmintellijsublimer0   c                 3   s   | ]}| kV  qd S r&   r   )r'   serverr)   r   r   r*   
  s     )r1   sshZputtyrdpr5   c                 3   s   | ]}| kV  qd S r&   r   rW   r)   r   r   r*     s     )rY   rZ   r[   databaser^   c                 3   s   | ]}| kV  qd S r&   r   )r'   Zwebr)   r   r   r*     s     )rU   z	127.0.0.1webpackreactrV   c                 3   s   | ]}| kV  qd S r&   r   )r'   apir)   r   r   r*     s     )postmaninsomniar   zAPI Developmentc                 3   s   | ]}| kV  qd S r&   r   )r'   designr)   r   r   r*     s     )figma	photoshopsketchDesignc                 3   s   | ]}| kV  qd S r&   r   )r'   docr)   r   r   r*     s     )notion
confluencejiratrelloZDocumentationrj   Nr+   )r   r   r   r)   r   r;     s     r;   )__doc__r6   typingr   r   strr   boolr   r   r   r   r   r<   r;   r   r   r   r   <module>   s   !0G