U
    h5                  
   @   s   d dl mZmZmZmZ d dlZd dlZd dlmZ d dlm	Z	 e	  e
dZese
ddZe
dd	Ze
d
dZe
ddZe
ddZde de de de de 
ZeeZdd Zdd Zdd Zedkre  dS )    )create_enginetextColumnStringN)datetime)load_dotenvDATABASE_URLDB_HOSTZ	localhostDB_PORTZ5432DB_NAMEZtimesheet_dbDB_USERZpostgresDB_PASSWORD zpostgresql://:@/c                     sn  t  Z} | td}dd |D  td  D ]}td|  q4dddd	g} fd
d|D }|rTtd|  td |D ]}zf|dkr| td| d td|  n4|dks|dkr| td| d td|  W q tk
rH } z8dt|kr$td| d ntd| d|  W 5 d}~X Y qX q|    W  5 Q R  S Q R X dS )zACheck if the required columns exist in the activity_records tablez
            SELECT column_name 
            FROM information_schema.columns 
            WHERE table_name = 'activity_records'
            ORDER BY ordinal_position
        c                 S   s   g | ]}|d  qS )r    ).0rowr   r   ./flexible_dashboard_fix.py
<listcomp>#   s     z'check_table_columns.<locals>.<listcomp>z+Existing columns in activity_records table:z  - application_namewindow_titlecategoryproject_namec                    s   g | ]}| kr|qS r   r   )r   colcolumnsr   r   r   )   s      u   
⚠️ Missing columns: zCreating missing columns...)r   r   r   r   project_typez(ALTER TABLE activity_records ADD COLUMN z VARCHAR(255)u     ✓ Added column: url	file_pathz TEXTzalready existsz  - Column z already existsu     ❌ Error adding column : N)engineconnectexecuter   print	Exceptionstrcommit)connresultr   Zrequired_columnsZmissing_columnser   r   r   check_table_columns   s2    (r,   c              
   C   sR  zt | tr,|  dkr i W S t| }n| }dddddddd}t |trd|kshd|kshd	|kr|dp|dp|d	d|d	< d
|ksd|kr|d
p|dd|d< d|krt |d tr|d }d|kr|d |d	< d
|kr|d
 |d< d|kr|d |d< d|kr|dd}|r|dkr||d< |drdd|d	< d|d< nL|drd|d	< d|d< n.|drd|d	< d|d< nd|d	< d|d< |d s||d< d|kr|d dkr|d |d< d|d< d|kr8|d dkr8|d	 r|d	 dkr8|d  d|d	< d|d< d|kr|d |d< d |d	< d!|d< z.d"d#lm	} ||d j
}||d< d$|d< W n   Y nX d%|ksd&|kr|d%p|d&|d	< |d	 d'krd(|d	< |W S  tk
rL } zJtd)|  td*t| dd+  d, d-t|dd. d/d0 W Y S d}~X Y nX dS )1zA
    Flexible parser that can handle various JSON structures
    )r   z{}ZnullZUnknownr   Notherr   r   r   r    r   r   r   appZapplicationr   titler   datar   fileunknownr    z.phpzPHP DevelopmentZider   z.pyzPython Development)z.jsz.jsxz.tsz.tsxzJavaScript DevelopmentzCode EditorZprojectr   ZDevelopmentr   languagez DevelopmentzWeb BrowserZbrowserr   )urlparseZBrowsingZprocessZprogram)Nr   r3   Unknown ApplicationzError parsing activity data: zData:    ...zParse Errord   error)r   r   r   )
isinstancer'   stripjsonloadsdictgetendswithZurllib.parser5   Znetlocr&   r%   )activity_datar1   	extractednestedr    r5   domainr+   r   r   r   flexible_parse_activity_dataA   s    










rF   c            "      C   s:  t d t d t  t } t d | td}t d t|D ]t\}\}zHt|trht	
|n|}t d|d  d t d	t	j|d
d  W qH   t d|d  d Y qHX qHt d | td}g }d}d}|D ]}|\}	}
}}}t|
}|r|	|||d|}|| |dk r|ddkrt d|d  d t d|  t d|d   t d|dddd  d t d|dd  |drt d |d   |d7 }q|d7 }qt d!t| d"| d# |r4t d$ |  }zd%}tdt||D ]}||||  }|D ]}g }d&|d& i}d'D ]>}||krL|| dk	rL|| d(|  || ||< qL|r4d)d*| d+}| t|| q4t d,t|| t| d-t| d. q|  t d/ W n< tk
r2 } z|  t d0|   W 5 d}~X Y nX t d1 | td2}t d3 | }|r|D ] \}}t d4| d5| d6 qdnt d7 | td8}t d9 | }|r|D ]@\}}}} | r| nd}!t d4| d5| d:| d;|!d<d=	 qnt d> t d? t d@ t dA t dB t dC W 5 Q R X dS )Dz*Main function to update the dashboard dataz$=== Flexible Dashboard Data Fix ===
z1. Checking table structure...z
2. Analyzing current data...z
            SELECT activity_data 
            FROM activity_records 
            WHERE activity_data IS NOT NULL 
            AND activity_data != '{}' 
            AND activity_data != ''
            LIMIT 5
        z
   Sample JSON structures:z
   Sample    r   z      )indentz: Unable to parsez
3. Processing records...a  
            SELECT id, activity_data, developer_id, timestamp, duration
            FROM activity_records
            WHERE activity_data IS NOT NULL 
            AND activity_data != '{}'
            AND activity_data != ''
            ORDER BY timestamp DESC
        r   )iddeveloper_id	timestampduration   r   r6   z   Developer: z   App: z
   Title: r   zN/ANP   r8   z   Category: r   r-   r   z   Project: z

4. Found z records to update (z errors)z
5. Updating database...r9   rJ   r.   z = :z]
                                UPDATE activity_records
                                SET z, zL
                                WHERE id = :id
                            z   Updated r   z records...u&   
✅ Successfully updated all records!u   
❌ Error during update: z
6. Verification: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 10
        z
   Top applications:z   - r!   z recordsu      ❌ No applications found!a  
            SELECT 
                developer_id,
                COUNT(DISTINCT application_name) as app_count,
                COUNT(*) as record_count,
                SUM(duration) / 3600 as hours
            FROM activity_records
            WHERE application_name IS NOT NULL
            AND application_name != 'Unknown Application'
            GROUP BY developer_id
        z
   Developer activity:z apps, z
 records, z.1fz hoursu#      ❌ No developer activity found!u   
✅ Dashboard fix completed!z
Next steps:z$1. Restart your dashboard API serverz2. Clear your browser cachez3. Refresh the dashboard)r%   r,   r"   r#   r$   r   	enumerater;   r'   r=   r>   dumpsrF   appendr@   lenZbeginrangejoinminr(   r&   ZrollbackZfetchall)"r)   r*   idxr1   ZparsedZupdatesZsample_countZerror_countrecordZ	record_idrB   rK   rL   rM   rC   Zupdate_dataZtransZ
batch_sizeiZbatchZupdate_fieldsparamsZfieldZqueryr+   Zappsr/   countZdevsZdev_idZ	app_countZrecord_countZhoursZ	hours_valr   r   r   update_dashboard_data   s    		
 

,	*r\   __main__)Z
sqlalchemyr   r   r   r   r=   osr   Zdotenvr   getenvr   r	   r
   r   r   r   r"   r,   rF   r\   __name__r   r   r   r   <module>   s(   
"(q %