U
    7h%                  =   @   sX  d dl mZmZ d dlZd dlZd dlmZ d dlZd dlm	Z	 e	  e
de ZeeZdddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBg=dCdDdEdFdGdHdIdJdKdLdMdNdOdPdQgdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddgdedfdgdhdidjdkdldmdndodpdqdrdsdtdudvgdwZdxdy Zdzd{ Zed| e Zed} eed~Ze Zeded    eded   eded   ed d kred d kred ed  ed eedZd ZeD ]\Zzeeer0eeneZed7 Zede d edejedddd  d ee\Z Z!ede  de!re!dd nd d W n2 e"k
r Z# zede#  W 5 dZ#[#X Y nX qed eedZe$ Z%zd Z&d Z'eD ]\Z(Zee\Z)Z*e)r
ee)Z+eede(e)dd e*rTe*dd nde+d e&d7 Z&e'd7 Z'e&d d kr
ede& d q
ed eedZeD ]0\Z(Z)ee)Z+eede(e+d e'd7 Z'qe%,  ed ede& d ede' d W n< e"k
rL Z# ze%-  ede#   W 5 dZ#[#X Y nX ed ed eedZeD ] \Z Z.ede  de. d qped eedZeD ]&\Z/Z.ede/pd de. d qed eedZeD ]:\Z Z/Z!ede/ de  de!re!dd nd d qW 5 Q R X ed ed ed ed dS )    )create_enginetextN)Config)load_dotenvDATABASE_URLzcode.execodez
cursor.exeZcursorz
devenv.exeznotepad++.exezsublime_text.exezatom.exezbrackets.exeZvimZemacszpycharm.exezpycharm64.exezidea.exez
idea64.exezwebstorm.exezphpstorm.exezrubymine.exez
goland.exez	clion.exez	rider.exezdatagrip.exezstudio64.exezeclipse.exeznetbeans.exezword.exezwinword.exez	excel.exezpowerpnt.exezoutlook.exez	teams.exez	slack.exezdiscord.exezzoom.exez	skype.exez
notion.exezobsidian.exezonenote.exezevernote.exeZterminalzcmd.exezpowershell.exeZbashzgit-bash.exezpostman.exezinsomnia.exezgit.exez
python.exeznode.exepython3ZnpmZyarnZpipZpip3zgnome-terminalZkonsoleZxterm
terminatorZtilixZvscodezvisual studio codez
chrome.exezfirefox.exez
msedge.exez	opera.exez	brave.exezvivaldi.exeZsafariziexplore.exebrowserZchromiumzgoogle-chromeZfirefoxzmicrosoft-edgeZchromeZedgezfilezilla.exez
winscp.exez	putty.exezmobaxterm.exez	mysql.exezpsql.exezpgadmin4.exeZ
phpmyadminZapacheZnginxZhttpdZsshZsshdZ	systemctlZdockerzdocker-composeZkubectlZmysqlZ
postgresqlzspotify.exezvlc.exezmpv.exezwmplayer.exez	steam.exezepicgameslauncher.exezwhatsapp.exeztelegram.exez
signal.exezmessenger.exeZspotifyZvlcZmpvZ	rhythmboxztelegram-desktopZyoutubeZnetflixZdiscord)Zproductivityr
   Zserverznon-workc                    sD   | sdS |    t D ]&\}}t fdd|D r|  S qdS )z+Categorize an application based on its nameZuncategorizedc                 3   s   | ]}| kV  qd S )N ).0appZ	app_lowerr   ./fix_all_activities.py	<genexpr>:   s     z!categorize_app.<locals>.<genexpr>)lower
CATEGORIESitemsany)app_namecategoryZappsr   r   r   categorize_app2   s    
r   c              
   C   s  z| sW dS t | tr"t| }n| }d}d}t |trd|krt |d tr|d }|dph|d}|dp||d}n2|dp|dp|d}|dp|d}|sd	|kr|d	 }||fW S  tk
r } ztd
|  W Y dS d}~X Y nX dS )zAExtract application name and window title from activity_data JSON)NNNdatar   Zapplicationtitlewindow_titleZapplication_nameZurlzError parsing JSON: )
isinstancestrjsonloadsdictget	Exceptionprint)Zactivity_datar   r   r   Z
event_dataer   r   r   extract_app_info?   s*    


r$   z.=== Comprehensive Fix for Activity Records ===z
1. Checking current state...z
        SELECT 
            COUNT(*) as total,
            COUNT(CASE WHEN application_name IS NULL THEN 1 END) as null_app,
            COUNT(CASE WHEN category IS NULL OR category = '' THEN 1 END) as null_category
        FROM activity_records
    z   Total records: z"   Records with NULL application:    z   Records without category:    u?   
✅ All records already have application names and categories!z(
2. Examining activity_data structure...z
        SELECT activity_data 
        FROM activity_records 
        WHERE activity_data IS NOT NULL 
        AND activity_data != ''
        AND activity_data != '{}'
        LIMIT 5
    z
   Sample :z   Structure:    )indenti,  z...z   Extracted: app='z
', title='2   'z
   Error: z,
3. Extracting application data from JSON...z
        SELECT id, activity_data
        FROM activity_records
        WHERE (application_name IS NULL OR application_name = '')
        AND activity_data IS NOT NULL 
        AND activity_data != '{}'
    a  
                    UPDATE activity_records
                    SET application_name = :app_name,
                        window_title = COALESCE(:window_title, window_title),
                        category = :category
                    WHERE id = :id
                   i  )idr   r   r   d   z   Processed z records...z%
4. Categorizing remaining records...z
            SELECT id, application_name
            FROM activity_records
            WHERE (category IS NULL OR category = '')
            AND application_name IS NOT NULL
        z}
                UPDATE activity_records
                SET category = :category
                WHERE id = :id
            )r-   r   u$   
✅ Successfully processed records:z   - Extracted app data: z recordsz   - Categorized: u   
❌ Error during processing: z
5. Final Results:z
   Top Applications:z
        SELECT application_name, COUNT(*) as count
        FROM activity_records
        WHERE application_name IS NOT NULL
        GROUP BY application_name
        ORDER BY count DESC
        LIMIT 15
    z      z: z
   Category Distribution:z
        SELECT category, COUNT(*) as count
        FROM activity_records
        GROUP BY category
        ORDER BY count DESC
    ZNULLz"
   Sample Categorized Activities:z
        SELECT application_name, category, window_title
        FROM activity_records
        WHERE category IS NOT NULL
        AND application_name IS NOT NULL
        ORDER BY timestamp DESC
        LIMIT 10
    z      [z] <   zNo titleuD   
✅ Fix complete! Your dashboard should now show proper categories.uC   
📝 Note: If some records still have NULL applications, it means:z;   - The activity_data JSON doesn't contain app informationzF   - The sync script needs to be updated to properly capture this data)0Z
sqlalchemyr   r   r   sysZconfigr   osZdotenvr   getenvZget_database_urlr   Zenginer   r   r$   r"   ZconnectZconnZexecuteresultZfetchoneZstatsexitZsample_countZdata_strr   r   r   r   dumpsr   r   r!   r#   ZbeginZtransZupdated_countZcategorized_countZ	record_idr   r   r   ZcommitZrollbackcountcatr   r   r   r   <module>   s                                                                                           ##
	
",$


		 	<