
    Ji*              	          d Z ddlZddlmZmZ dedeeee   f   fdZdededefd	Zdededeeee   f   fd
Z	dedeeee   f   fdZ
dededeeee   f   fdZdededeeee   f   fdZdedefdZdededefdZy)zT
Improved Project Extractor - Better extraction of project names from window titles
    N)DictOptionalactivity_datareturnc                    | j                  dd      xs dj                         }| j                  dd      xs d}| j                  dd      }t        ||      rddddS t        ||      }|j                  d      r|S |rt	        |      }|j                  d      r|S t        ||      }|j                  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_infos        @E:\timesheet\timesheet_new\backend\improved_project_extractor.pyextract_project_infor      s     !!"4b9?RFFHH $$^R8>BL!!+r2I L(3 $dDQQ
 -\8DL' -i8N+ -\8DL' #<::    r
   r   c                 ^    |  d| j                         g d}t        fd|D              S )z%Check if activity is non-work related )zlock screenlockedlockapplogonuiyoutubenetflixspotifytwitchdisneyhuluzprime videomusicvideomoviegamesteamz
epic gamesoriginz
battle.netc              3   &   K   | ]  }|v  
 y wN ).0patterncombineds     r   	<genexpr>z'is_non_work_activity.<locals>.<genexpr>4   s     D2Cww("2C   r   any)r
   r   non_work_patternsr2   s      @r   r   r   )   s8    q
+113H D2CDDDr   c                    t        j                  d|       }|r{|j                  d      j                         }|j                  d      j                         }t	        |      dkD  r/|j                         dvrt        ||      }t        |      }|||dS d}t        j                  || t         j                        }|rM|j                  d      j                         }	t        |j                  d      j                               }|d|	dS d|j                         v sd	|j                         v r;| j                  d
      }
t	        |
      dk\  r|
d   j                         }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   rC   project_partapp_partr   r   ide_pattern	ide_match	file_namepartsserver_names               r   r   r   6   sc    HH-|<E{{1~++-;;q>'') |q ););)=Ad)d1(HEL .l;L !- , (  uK		+|RTT:IOOA&,,.	))//!*<*B*B*DE()%
 	
 HNN$$
hnn6F(F""5)u:?)//+K"*;- 8 3 2  Ir   r   c                 h   | si S | j                  dd      j                  d      }t        |      D ]I  \  }}|j                         dv s|dz   t	        |      k  s+t        ||dz            }|d|r|d   nddc S  t	        |      d	k\  r't        |d
         }|rt	        |      d	kD  r	|d|d   dS i S )zExtract project from file path\/)projectsrepos	workspacesrc	documentsr9   r<   r@   Filer   r:   )replacerK   	enumerater   rF   rH   )r   
path_partsipartr   s        r   r   r   f   s    	 ""4-33C8J Z(4::<QQ1us:&1*QU2CD$0$16@JrNf 	 ) :!)*R.9C-1 , - *2  Ir   c                 l   t        fddD              rd| v sd| v rt        j                  d|       }|r|j                  d      nd}| j	                  d      }t        |      dkD  r+t        |d	         }|r|j                         d
vr	|dd| dS d| dd| dS d| v sd| v r0t        j                  d|       }|rd|j                  d       dddS t        j                  d|       }|r-|j                  d      xs |j                  d      }d| dddS t        fddD              r?t        j                  d| t        j                        }	|	rd|	j                  d       dddS t        fdd D              r0t        j                  d!|       }
|
rd"|
j                  d       d#d$dS i S )%z.Extract based on specific application patternsc              3   &   K   | ]  }|v  
 y wr.   r/   )r0   browserr   s     r   r3   z,extract_from_app_patterns.<locals>.<genexpr>   s     
V.U77h.Ur4   )chromefirefoxedgesafariz
localhost:z
127.0.0.1:z (?:localhost|127\.0\.0\.1):(\d+)r9   3000r?   r   )z	react appzvue app	localhostWeb Developmentr   z
Local Dev:z
github.comz
gitlab.comu#   ([^/\s]+/[^/\s]+?)(?:\s*[-·]|\s*$)zGitHub: 
RepositoryzSource Controlz1https?://([^/\s]+)|([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})r:   zWeb: zWeb BrowsingWebsitec              3   &   K   | ]  }|v  
 y wr.   r/   )r0   dbr   s     r   r3   z,extract_from_app_patterns.<locals>.<genexpr>   s     
_$^b2>$^r4   )mysqlpostgresmongodbdatagrip
phpmyadminz(\w+)(?:\s*@\s*|\.|\s+database)zDB: DatabasezDatabase Managementc              3   &   K   | ]  }|v  
 y wr.   r/   )r0   ftpr   s     r   r3   z,extract_from_app_patterns.<locals>.<genexpr>   s     
K&Js3(?&Jr4   )	filezillawinscp	cyberduckz1([a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|\d+\.\d+\.\d+\.\d+)zFTP: zFile TransferzRemote Server)	r6   rB   rI   rD   rK   rF   rH   r   rJ   )r
   r   
port_matchporttitle_partsr   
repo_matchdomain_matchdomaindb_matchserver_matchs    `         r   r   r      s    
V.U
VV<'<<+G#FUJ*4:##A&&D ',,U3K;!#1+a.AL$6$6$8@e$e(4(9*4TF(;  #-TF 3 1",TF 3  <'<<+G#I<XJ&.z/?/?/B.C$D$0$4  yy!UWcd!''*Cl.@.@.CF"'x 0 . )  
_$^
__99?rttT"&x~~a'8&9 : * 5  
K&J
KKyy!UWcd"'(:(:1(='> ? / /  Ir   c                    | rMt        |       dkD  r?| j                  d      }t        |d         }|rt        |      dkD  r|t        | |      ddS |r4t        |      dkD  r&|j	                  dd      j                         }|d	d
dS ddddS )z&Generic project extraction as fallback   r?   r   r:   Activityr   z.exer	   ApplicationGeneralN)rF   rK   rH   rG   r]   title)r
   r   rQ   r   	app_cleans        r   r   r      s     L)A-""5))%(3C-1 , 6|X N *  CMA%$$VR0668	%)%
 	
  r   namec                 j   | syt        j                  dd|       } t        j                  dd|       } t        j                  dd| t         j                        } d| v sd| v r.t        j                  d	|       }dj	                  d
 |D              } t        |       dkD  r| dd dz   } | j                         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              3   B   K   | ]  }|s|j                           y wr.   )
capitalize)r0   ra   s     r   r3   z%clean_project_name.<locals>.<genexpr>   s     Dedt)es   2   Nz...)rB   subrJ   rK   joinrF   rE   )r   rQ   s     r   rH   rH      s     66,D)D66&#t$D 66@"dRTRVRVWD d{cTk$'xxDeDD 4y2~CRy5 ::<r   c                 V   |  d| j                         t        fddD              ryt        fddD              ryt        fdd	D              ry
t        fddD              ryt        fddD              ryt        fddD              ryt        fddD              ryy)z'Determine project type based on contextr   c              3   &   K   | ]  }|v  
 y wr.   r/   )r0   ider2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     
]&\s3(?&\r4   )cursorvscodepycharmintellijsublimer<   c              3   &   K   | ]  }|v  
 y wr.   r/   )r0   serverr2   s     r   r3   z)determine_project_type.<locals>.<genexpr>
  s     Q.PFVx.Pr4   )r=   sshputtyrdprA   c              3   &   K   | ]  }|v  
 y wr.   r/   )r0   ro   r2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     S&RR8^&Rr4   )rp   rq   rr   databaseru   c              3   &   K   | ]  }|v  
 y wr.   r/   )r0   webr2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     W(VSH_(Vr4   )rj   z	127.0.0.1webpackreactrk   c              3   &   K   | ]  }|v  
 y wr.   r/   )r0   apir2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     G(FSH_(Fr4   )postmaninsomniar   zAPI Developmentc              3   &   K   | ]  }|v  
 y wr.   r/   )r0   designr2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     O.NFVx.Nr4   )figma	photoshopsketchDesignc              3   &   K   | ]  }|v  
 y wr.   r/   )r0   docr2   s     r   r3   z)determine_project_type.<locals>.<genexpr>  s     S(RSH_(Rr4   )notion
confluencejiratrelloDocumentationr   r5   )r
   r   r2   s     @r   rG   rG     s    q
+113H 
]&\
]]	Q.PQ	Q"	S&RS	S	W(VW	W 	G(FG	G 	O.NO	O	S(RS	Sr   )__doc__rB   typingr   r   strr   boolr   r   r   r   r   rH   rG   r/   r   r   <module>r      s!   
 !; ;c8C=6H1I ;BEs Ec Ed E.C .3 .4XVY]HZC[ .`c d33E.F >EC E3 E4XVY]HZC[ EN#  c8TW=FXAY >S S 0   r   