U
    Sh{                  
   @   s   d dl mZmZ d dlZd dlZd dlmZ d dlmZ d dl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textN)load_dotenv)datetimeDATABASE_URLDB_HOSTZ	localhostDB_PORTZ5432DB_NAMEZtimesheet_dbDB_USERpostgresDB_PASSWORD zpostgresql://:@/c              
   C   s  zt | trt| }n| }t |ts,W dS d|krBt|d W S d|krvt |d trvd|d krvt|d d W S d|krd|krz,t|d }t|d }||  W W S    Y nX d|krt|d }|	drt|dd W S W n$ t
k
r } zW 5 d}~X Y nX dS )zExtract duration from JSON dataNdurationdataZ	timestampZend_timestamps)
isinstancestrjsonloadsdictfloatr   ZfromisoformatZtotal_secondsendswith	Exception)activity_datar   startendZdur_stre r!   ./fix_duration_data.pyextract_duration_from_json   s2    


r#   c                    s   d}| s|S |    t fdddD r8tdd}nxt fdddD r\td	d
}nTt fdddD rtdd}n0t fdddD rtdd}ntdd}|S )z2Generate realistic duration based on activity type   c                 3   s   | ]}| kV  qd S Nr!   ).0ZideZ	app_lowerr!   r"   	<genexpr>N   s     z.generate_realistic_duration.<locals>.<genexpr>)codeZvscodeZpycharmZsublimeZdevelopmenti,  i  c                 3   s   | ]}| kV  qd S r%   r!   )r&   browserr'   r!   r"   r(   Q   s     )r*   ZchromeZfirefoxx   iX  c                 3   s   | ]}| kV  qd S r%   r!   )r&   Zcommr'   r!   r"   r(   T   s     )ZslackZteamsZdiscord<   c                 3   s   | ]}| kV  qd S r%   r!   )r&   Zdbr'   r!   r"   r(   W   s     )Zmysqlr   Zdatabasei  )loweranyrandomZrandint)app_namewindow_titleZbase_durationr!   r'   r"   generate_realistic_durationC   s    r2   c                  C   s  t d t v} t d | td}| }t d|d   t d|d   |d dkrxt d W 5 Q R  d	S t d
 | td}g }d}d}|D ]}|\}}}	}
d	}|rt|}|r|dkr|d7 }|r|dkrt|	|
}|d7 }|||f t	|dkrt d| d|	 d|dd qt dt	| d t d|  t d|  |r4| 
 }zd}tdt	||D ]d}||||  }|D ] \}}| td||d qt dt|| t	| dt	| d q~|  t d W n< tk
r2 } z|  t d|   W 5 d	}~X Y nX t d | td}|D ]4\}}}}t d| d| d |d!d"|dd#	 qNW 5 Q R X d	S )$zFix missing duration dataz=== Fixing Duration Data ===
z%1. Checking current duration state...z
            SELECT 
                COUNT(*) as total,
                COUNT(CASE WHEN duration IS NULL OR duration = 0 THEN 1 END) as needs_fix
            FROM activity_records
        z   Total records: r   z   Records needing fix:    u&   
✅ All records have duration values!Nz4
2. Processing records with missing/zero duration...z
            SELECT id, activity_data, application_name, window_title
            FROM activity_records
            WHERE duration IS NULL OR duration = 0
           z   ID z: z -> z.0fz secondsz
3. Updating z records...z   Extracted from JSON: z   Generated realistic: i  z
                            UPDATE activity_records
                            SET duration = :duration
                            WHERE id = :id
                        )r   idz   Updated r   u   
✅ Duration fix completed!u   
❌ Error during update: z
4. Verification...aG  
            SELECT 
                developer_id,
                COUNT(*) as records,
                SUM(duration) / 3600 as total_hours,
                AVG(duration) as avg_seconds
            FROM activity_records
            WHERE duration > 0
            GROUP BY developer_id
            ORDER BY developer_id
        z   z
 records, z.1fz hours total, z	s average)printengineZconnectZexecuter   Zfetchoner#   r2   appendlenZbeginrangeminZcommitr   Zrollback)ZconnresultZstatsZupdatesZextracted_countZgenerated_countrecordZ	record_idr   r0   r1   r   ZtransZ
batch_sizeiZbatchr    Zdev_idZrecordsZhoursZavg_secr!   r!   r"   fix_duration_data^   sh    
 
,r?   __main__)Z
sqlalchemyr   r   r   osZdotenvr   r   r/   getenvr   r   r   r	   r
   r   r7   r#   r2   r?   __name__r!   r!   r!   r"   <module>   s(   
")f