
    Ji+                     V    d Z ddlZddlmZmZmZmZ  G d d      Zedk(  r e       Z	yy)zW
Activity Categorizer - Categorizes activities based on window titles and applications
    N)DictListOptionalTuplec            	           e Zd ZdZd Zddededeeef   fdZdede	e   de
fd	Zdede	e   defd
ZddededefdZde	e   de	e   fdZy)ActivityCategorizerzFCategorizes activities into Productive, Browser, and Server categoriesc                 n    g d| _         g d| _        g d| _        g d| _        | j                  | _        y )N)dzvisual studiovscodezvs codecursorsublimeatomintellijpycharmwebstormphpstormrubymineeclipsenetbeansvimemacsznotepad\+\+claudegitzgithub desktop
sourcetree	gitkrakendocker
kubernetespostmaninsomniadatagripdbeaverzmysql workbenchpgadminzmongodb compassredisterminalcmd
powershellwslubuntubashzsh	filezillawinscp	cyberduckputtysshftpsftpscpcpanelpleskwhmdirectadminwebmin
phpmyadminadminerfigmasketchzadobe xd	photoshopillustratornotionobsidian
confluencejiratrelloasanamondayclickuplinearz\.js$z\.ts$z\.py$z\.php$z\.java$z\.cs$z\.cpp$z\.c$z\.rb$z\.go$z\.rs$z\.swift$z\.html$z\.css$z\.scss$z\.json$z\.xml$z\.yaml$z\.md$z\.txt$z\.sql$z\.sh$z\.bat$	timesheetprojectdevelopment	workspacerepos
repositorysrcappbackendfrontend)/chromefirefoxedgesafarioperabraver   chatgptzchat\.openaibardgeminicopilot
perplexityphindzyou\.comstackoverflowzgithub\.comgitlab	bitbucketzdeveloper\.mozilla	w3schools
codecademyfreecodecampudemycourserapluralsightzdocs\.documentationzapi\.	referencetutorialguidemanualwikigmailoutlookslackdiscordteamstwitterlinkedinfacebookredditzgoogle\.comz	bing\.com
duckduckgosearch)@awszamazon web servicesec2s3lambdacloudformationelasticbeanstalkrdsdynamodbgcpzgoogle cloudzcompute enginezcloud storagezcloud functionsbigqueryfirebaseazurezmicrosoft azurezazure portalzazure devopsdigitaloceanlinodevultrherokunetlifyvercel
cloudflare	namecheapgodaddyr.   rdpzremote desktopvnc
teamvieweranydeskparsectermiusopenvpnvpndatadogz	new relicgrafana
prometheuselastickibanasplunksentryjenkinstravisz
circle ?ciz	gitlab cizgithub actionszbitbucket pipelinesbambooteamcityr   k8sr   rancher	openshift	portainer	containerpodcluster)youtubenetflixspotifytwitchdisneyhuluzprime videomusicvideomoviegamesteamz
epic gamesoriginzbattle\.netzlock screenlockedlockappscreensaveridleafkaway)productive_patternsbrowser_patternsserver_patternsnon_work_patternsnon_work_keywords)selfs    :E:\timesheet\timesheet_new\backend\activity_categorizer.py__init__zActivityCategorizer.__init__   s;    $$
 L!
2 
>"
 "&!7!7    window_titleapp_namereturnc                 4   | d j                         | j                  | j                        ry| j                  | j                        | j                  | j
                        | j                  | j                        d}t        ||j                        }||   }|dk  rlt        j                  d      ryt        fdd	D              rt        fd
dD              ryyt        fddD              ryt        fddD              ryy||fS )z
        Categorize an activity based on window title and application name
        Returns: (category, confidence_score)
         )znon-workg?)
productivebrowserserver)key333333?z/\.(py|js|php|java|cs|cpp|html|css|json|xml|sql))r   gffffff?c              3   &   K   | ]  }|v  
 y wN ).0r   combined_texts     r   	<genexpr>z:ActivityCategorizer.categorize_activity.<locals>.<genexpr>   s     [=Z'W-=Z   )rP   rQ   rR   c              3   &   K   | ]  }|v  
 y wr   r   )r   dev_termr   s     r   r   z:ActivityCategorizer.categorize_activity.<locals>.<genexpr>   s     wAvXx=0Avr   )	localhostz	127.0.0.1z:3000z:8000z:5000)r   g333333?)r   g      ?c              3   &   K   | ]  }|v  
 y wr   r   )r   	prod_termr   s     r   r   z:ActivityCategorizer.categorize_activity.<locals>.<genexpr>   s     vAuIY-/Aur   )mailemailcalendarmeetingdocument)r   g?c              3   B   K   | ]  }|j                         v   y wr   )lower)r   sys_appr   s     r   r   z:ActivityCategorizer.categorize_activity.<locals>.<genexpr>   s      v@uWW 00@us   )explorerfindersettingssystemshell)r   r   )r   r   )r   _matches_patternsr   _calculate_scorer   r   r   maxgetreru   any)r   r   r   scoresmax_category	max_scorer   s     `   @r   categorize_activityz'ActivityCategorizer.categorize_activityv   s    (.(4::< !!-1G1GH" //t?W?WX,,]D<Q<QR++M4;O;OP
 6vzz2<(	 s?yyK][([=Z[[wAvww,)vAuvv(v@uvv( &Y&&r   textpatternsc                 `    |D ])  }t        j                  ||t         j                        s) y y)z)Check if text matches any of the patternsTF)r   ru   
IGNORECASE)r   r   r   patterns       r   r   z%ActivityCategorizer._matches_patterns   s(    Gyy$6   r   c                     d}|D ]-  }t        j                  ||t         j                        s)|dz  }/ t        |dz  d      S )z'Calculate matching score for a categoryr      g      @g      ?)r   ru   r   min)r   r   r   matchesr   s        r   r   z$ActivityCategorizer._calculate_score   sA    Gyy$61  
 7S=#&&r   c                 J   | j                  ||      \  }}| d| j                         }d}|dk(  rt        j                  d|      rd}nQt        j                  d|      rd}n7t        j                  d|      rd	}nt        j                  d
|      rd}nt        j                  d|      rd}nt        j                  d|      rd}n|dk(  rdt        j                  d|      rd}nt        j                  d|      rd}nt        j                  d|      rd}nt        j                  d|      rkd}nh|dk(  rct        j                  d|      rd}nJt        j                  d|      rd}n1t        j                  d|      rd}nt        j                  d|      rd }|||||d!S )"z>
        Get detailed categorization with subcategory
        r   generalr   z.(cursor|vscode|visual studio|intellij|pycharm)codingz(filezilla|winscp|putty|ssh)zserver-managementz(git|github desktop|sourcetree)zversion-controlz(mysql|postgres|mongodb|redis)databasez(figma|photoshop|sketch)designz(notion|confluence|jira)re   r   z(claude|chatgpt|bard)zai-assistancez(stackoverflow|github\.com)zdevelopment-researchz(docs\.|documentation|api\.)z(gmail|outlook|slack)communicationr   z(aws|ec2|s3)rv   z(gcp|google cloud)r~   z(azure)r   z(kubernetes|docker)
containers)categorysubcategory
confidencer   r   )r   r   r   ru   )r   r   r   r   r   r   r   s          r   get_detailed_categoryz)ActivityCategorizer.get_detailed_category   s     $77hO* (.(4::<|#yyJMZ&:MJ1=}M/<mL(6F&6F-"yy1=A-9=I4:MJ-3]C-!yy-8#0-@#:}5%1=A* !&$( 
 	
r   
activitiesc                     g }|D ]a  }|j                  dd      }|j                  dd      }| j                  ||      }|d   |d<   |d   |d<   |d   |d<   |j                  |       c |S )z2
        Categorize a batch of activities
        r    application_namer   r   r   category_confidence)r   r   append)r   r  categorizedactivityr   r   category_infos          r   categorize_batchz$ActivityCategorizer.categorize_batch   s     "H#<<;L||$6;H 66|XNM $1#<HZ &3M&BH]#.;L.IH*+x( # r   N)r  )__name__
__module____qualname____doc__r   strr   floatr   r   boolr   r   r   r   r
  r   r   r   r   r      s    Pi8V,' ,'s ,'ERUW\R\L] ,'\c T#Y 4 'S 'DI '% '2
# 2
 2
d 2
h4: $t* r   r   __main__)
r  r   typingr   r   r   r   r   r  categorizerr   r   r   <module>r     s9    
 . .s sn z%'K r   