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
    Zapplication_name window_title	file_pathNproject_nameproject_typeZ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   Zproject_info r   ./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lockedZlockappZlogonuiZyoutubeZnetflixZspotifyZtwitchZdisneyZhuluzprime videoZmusicZvideoZmovieZ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 tabZuntitledznew filer	   z_^(.+?)\s*-\s*(.+?)\s*-\s*(Visual Studio Code|Cursor|Code|PyCharm|IntelliJ|Sublime|Atom|VS Code)DevelopmenttermiusZterminal - zServer: Server ManagementzTerminal Session)rematchgroupstriplenr   determine_project_typeclean_project_namesearchIsplit)r   r   r)   Zproject_partZapp_partr   r
   Z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\/)ZprojectsZreposZ	workspacesrcZ	documentsr!   r#   r&   ZFiler	   r"   )replacer1   	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   Zbrowserr   r   r   r      s     z,extract_from_app_patterns.<locals>.<genexpr>)ZchromeZfirefoxZedgeZsafariz
localhost:z
127.0.0.1:z (?:localhost|127\.0\.0\.1):(\d+)r!   Z3000r%   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   Zdbr=   r   r   r      s     )mysqlpostgresmongodbZdatagripZ
phpmyadminz(\w+)(?:\s*@\s*|\.|\s+database)zDB: DatabasezDatabase Managementc                 3   s   | ]}| kV  qd S r   r   )r   Zftpr=   r   r   r      s     )Z	filezillaZwinscpZ	cyberduckz1([a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|\d+\.\d+\.\d+\.\d+)zFTP: zFile TransferzRemote Server)	r    r(   r/   r*   r1   r,   r.   r   r0   )r   r   Z
port_matchZportZtitle_partsr
   Z
repo_matchZdomain_matchdomainZdb_matchZserver_matchr   r=   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   r%   r   r"   ZActivityr	   z.exer   ZApplicationGeneralN)r,   r1   r.   r-   r8   title)r   r   r3   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   r<   r   r   r   r      s      z%clean_project_name.<locals>.<genexpr>2   Nz...)r(   subr0   r1   joinr,   r+   )rI   r3   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   Zider   r   r   r     s     z)determine_project_type.<locals>.<genexpr>)ZcursorZvscodeZpycharmZintellijZsublimer#   c                 3   s   | ]}| kV  qd S r   r   )r   Zserverr   r   r   r   
  s     )r$   ZsshZputtyZrdpr'   c                 3   s   | ]}| kV  qd S r   r   r@   r   r   r   r     s     )rA   rB   rC   ZdatabaserD   c                 3   s   | ]}| kV  qd S r   r   )r   Zwebr   r   r   r     s     )r>   z	127.0.0.1ZwebpackZreactr?   c                 3   s   | ]}| kV  qd S r   r   )r   apir   r   r   r     s     )ZpostmanZinsomniarQ   zAPI Developmentc                 3   s   | ]}| kV  qd S r   r   )r   Zdesignr   r   r   r     s     )ZfigmaZ	photoshopZsketchZDesignc                 3   s   | ]}| kV  qd S r   r   )r   docr   r   r   r     s     )ZnotionZ
confluenceZjiraZtrelloZDocumentationrG   Nr   )r   r   r   r   r   r-     s     r-   )__doc__r(   typingr   r   strr   boolr   r   r   r   r   r.   r-   r   r   r   r   <module>   s   !0G