U
    "hx6                     @   sX  d dl mZmZmZmZ d dlmZ d dlmZ d dl	m	Z	 d dl
mZ d dlZeddgd	Zed
eefeedddZedeeeefeeedddZeddd ZedddeefeeedddZedddeefeeeedddZedddeefeeeedddZed eefed!d"d#ZdS )$    )	APIRouterDependsHTTPExceptionHeader)Session)text)datetime)get_dbNz/api/multi-devzmulti-developer)prefixtags.)authorizationdbc                 C   sR   |  dstddd| dd}|tdd|i }|sJtddd|d	 S )
NzBearer i  zInvalid token formatstatus_codedetail z[SELECT developer_id FROM developer_api_tokens WHERE api_token = :token AND is_active = truetokenzInvalid tokenr   )
startswithr   replaceexecuter   fetchone)r   r   r   result r   7/var/www/html/timesheet/backend/simple_multi_dev_api.pyvalidate_token   s    
r   z/activity/upload)
activitiesdeveloper_idr   c                 C   sl   d}| D ]P}| td||dd|dd|dd|d|d	d
d |d7 }q|  d|dS )Nr   z
                INSERT INTO activity_records 
                (developer_id, application_name, window_title, duration, timestamp, category)
                VALUES (:dev_id, :app, :title, :duration, :timestamp, :category)
            application_nameUnknownwindow_titler   duration	timestampcategoryother)dev_idapptitler    r!   r"      success)status	processed)r   r   getcommit)r   r   r   countactivityr   r   r   upload_activities   s    




r/   z/healthc                   C   s   ddiS )Nr)   healthyr   r   r   r   r   health_check9   s    r1   z/developers-summary)
start_dateend_dater   c           $      C   s  zddl m }m}m} ddlm}m} | r8|| }n||jj	ddddd}|rb||}	n||j}	|d}
|
|
||	d }g }d}d}d}|D ]}|d }|d }|d pd}|d	 }|d
 }|d }||7 }||7 }d}|r(||j|j	|jd }| dk }|r(|d7 }|d}|
||||	d }g }|D ]2}|d }|d d }|||ddd qPtdtdt|d }|r||j|j	|jd }| dk rt| d  d} n0| dk rt| d  d} n
|d} nd} ||||||| |d q|rTtdd |D t| nd}!||||!t|d }"|"|| |	 d!d"W S  tk
r }# ztd#d$t|# d%W 5 d&}#~#X Y nX d&S )'z)Get summary of all developers' activitiesr   )r   	timedeltatimezoner   funchourminutesecondmicroseconda  
            SELECT 
                ar.developer_id,
                COUNT(*) as activity_count,
                SUM(ar.duration) as total_duration,
                MAX(ar.timestamp) as last_activity,
                COUNT(DISTINCT ar.application_name) as unique_apps
            FROM activity_records ar
            WHERE ar.developer_id IS NOT NULL
            AND ar.timestamp >= :start_date
            AND ar.timestamp <= :end_date
            GROUP BY ar.developer_id
            ORDER BY total_duration DESC
        )r2   r3   r'                  @F)tzinfoi  a  
                SELECT 
                    ar.application_name,
                    SUM(ar.duration) as total_duration
                FROM activity_records ar
                WHERE ar.developer_id = :dev_id
                AND ar.timestamp >= :start_date
                AND ar.timestamp <= :end_date
                GROUP BY ar.application_name
                ORDER BY total_duration DESC
                LIMIT 3
            r$   r2   r3   z.1fh)r%   r    _      i  <   z min agoiQ zh agoz%Y-%m-%dNever)name	is_activehours_todayproductivityactivities_count	last_seenrecent_activitiesc                 s   s   | ]}|d  V  qdS )rK   Nr   ).0devr   r   r   	<genexpr>   s     z)get_developers_summary.<locals>.<genexpr>)Zactive_developerstotal_hourstotal_activitiesavg_productivitytotal_developersstartend)overview
developers
date_range  z"Error getting developers summary: r   N)r   r4   r5   
sqlalchemyr   r7   fromisoformatnowutcr   r   fetchalltotal_secondsappendminmaxintstrftimesumlen	isoformat	Exceptionr   str)$r2   r3   r   r   r4   r5   r   r7   rW   rX   developers_queryZdevelopers_resultrZ   rR   rS   active_countZdev_rowr   activity_countduration_secondslast_activityZunique_appsrJ   rI   Z	time_diffZrecent_activities_queryZrecent_resultrN   r.   app_nameZapp_durationrK   rM   rT   rY   er   r   r   get_developers_summary=   s    


$		rt   z*/developer/{developer_id}/activity-summary)r   r2   r3   r   c              
   C   s  z@ddl m }m} ddlm}m} |r4||}n||jjddddd}|r^||}	n||j}	|d}
|	|
| ||	d
 }g }d}ddd	d
ddg}t|D ]H\}}|d }|d d }||7 }||||d ||t|  d q|d}|	|| ||	d }|r"|d nd}|||| |	 ddW S  tk
r| } ztddt| dW 5 d}~X Y nX dS )zNGet activity summary for a specific developer (like your dashboard screenshot)r   r   r5   r6   r8   a  
            SELECT 
                COALESCE(ar.category, 'Unknown') as category,
                SUM(ar.duration) as total_duration,
                COUNT(*) as activity_count
            FROM activity_records ar
            WHERE ar.developer_id = :dev_id
            AND ar.timestamp >= :start_date
            AND ar.timestamp <= :end_date
            GROUP BY ar.category
            ORDER BY total_duration DESC
        rB   z#8884d8z#82ca9dz#ffc658z#ff7300z#8dd1e1z#d084d0r'   r@   r=   )r"   r    r-   colora  
            SELECT COUNT(DISTINCT 
                CASE 
                    WHEN ar.window_title IS NOT NULL THEN ar.window_title
                    ELSE ar.application_name
                END
            ) as project_count
            FROM activity_records ar
            WHERE ar.developer_id = :dev_id
            AND ar.timestamp >= :start_date
            AND ar.timestamp <= :end_date
        rV   )data
total_timeactive_projectsr[   r\   z Error getting activity summary: r   N)r   r5   r]   r   r7   r^   r_   r`   r   r   ra   	enumeraterc   ri   r   rj   rk   r   rl   )r   r2   r3   r   r   r5   r   r7   rW   rX   Zactivity_queryactivities_resultactivity_datarx   colorsir.   r"   Zduration_hoursZprojects_queryZproject_resultry   rs   r   r   r   get_developer_activity_summary   sX    

r   z"/developer/{developer_id}/detailedc              
   C   s  zddl m }m} |r"||}n||jjddddd}|rL||}n||j}td}||| ||d }	g }
|	D ]2}|
	|d |d |d |d |d	 
 d
 q| |
t|
|
 |
 ddW S  tk
r } ztddt| dW 5 d}~X Y nX dS )z3Get detailed activity data for a specific developerr   ru   r8   a  
            SELECT 
                application_name,
                window_title,
                category,
                duration,
                timestamp
            FROM activity_records
            WHERE developer_id = :dev_id
            AND timestamp >= :start_date
            AND timestamp <= :end_date
            ORDER BY timestamp DESC
            LIMIT 100
        rB   r'   r=   r>   r?   )r   r   r"   r    r!   rV   )r   r   rS   r[   r\   z!Error getting developer details: r   N)r   r5   r^   r_   r`   r   r   r   ra   rc   rj   ri   rk   r   rl   )r   r2   r3   r   r   r5   rW   rX   Zactivities_queryr{   r   r.   rs   r   r   r   get_developer_detailed-  s@    

	
r   z/developers-list)r   c              
   C   s   z\t d}| | }g }|D ]2}||d |d |d rH|d  ndd q d|iW S  tk
r } ztdd	t| d
W 5 d}~X Y nX dS )z Get list of all known developersaF  
            SELECT DISTINCT 
                ar.developer_id,
                COUNT(*) as activity_count,
                MAX(ar.timestamp) as last_activity
            FROM activity_records ar
            WHERE ar.developer_id IS NOT NULL
            GROUP BY ar.developer_id
            ORDER BY last_activity DESC
        r   r'   r=   N)r   ro   rq   rZ   r\   zError getting developers list: r   )r   r   ra   rc   rj   rk   r   rl   )r   rm   r   rZ   rowrs   r   r   r   get_developers_listp  s    

r   )fastapir   r   r   r   sqlalchemy.ormr   r]   r   r   databaser	   jsonrouterrl   r   postlistr/   r+   r1   rt   r   r   r   r   r   r   r   <module>   sb   
 ^B