U
    i!                     @   s   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	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d dlZe Zd	Zd
d Zdd Zedededeefeee ee edddZdS )    )	APIRouterDependsHTTPExceptionQuery)Session)text)datetimetimezone	timedelta)OptionalDict)get_db)ActivityCategorizerNz%timestamp AT TIME ZONE 'Asia/Kolkata'c                 C   s  | sdi fS i }| D ]B}|j  }||kr2g ||< || |j |jpFd|j|jd qd}i }| D ]\}}|jdd d |d d }|d }|d t|d d	 }	t	|	| 
 d
}
ttdd |D }| |	 |
t|
d dt||d|t|< ||
7 }qh||fS )Nr   )	timestampdurationapplication_namewindow_titlec                 S   s   | d S )Nr    xr   r   >/var/www/html/timesheet/backend/activity_categorization_api.py<lambda>*       z-calculate_actual_work_hours.<locals>.<lambda>)keyr   r   secondsi   c                 s   s   | ]}|d  r|d  V  qdS )r   Nr   .0ar   r   r   	<genexpr>2   s      z.calculate_actual_work_hours.<locals>.<genexpr>     )
start_timeend_timeduration_secondsduration_hoursactivity_countZunique_applications)r   dateappendr   r   r   itemssortr
   mintotal_secondslenset	isoformatroundstr)Zdb_rowsZdailyrowdtotalZdaily_outputactsZ
first_timelast	last_timer   unique_appsr   r   r   calculate_actual_work_hours   s>    

	
r:   c                 C   sJ   t | } | dkr$t| d d dS | dkr@t| d d dS |  dS )Nr!      h<   ms)intr1   r   r   r   r   format_durationF   s    rA   z'/api/activity-categories/{developer_id})developer_id
start_dateend_datedbc                    sn  z2t  }|r t|ddnttjjddddd}|rPt|ddn
ttj}tdt dt d}|	|| ||d
 }t|\}	}
d	d
ddg}dd |D }d}|D ]}|j|jpd|jpd|jpd|j |j|j|j|jd	}||d |d }|d }||kr d
}|| | ||d 7 }qi }| D ]\}}i }|D ]^}|d   }||kr|ddd||< || d  |d 7  < || d  d7  < qXt| }|D ],}|d }t|d d|d< t||d< qt|dd dd||< qHd d |D }| D ]B\}}|D ]2}|| d!  d7  < || d  |d 7  < q2q&|D ]P}|| d }t|d d|| d< |dkrt|| d" d#nd|| d$< qni }| D ]$\}}d%d& |d d' D ||< q| | | t |
d(|	t|	d d#|
|t|d d#|||d)
W S  t!k
rh } zt"d*t#|d+W 5 d }~X Y nX d S ),NZz+00:00r   )hourminutesecondmicroseconda  
            SELECT 
                id, developer_id, application_name, window_title,
                duration, timestamp, url, file_path, project_name,
                project_type, category
            FROM activity_records
            WHERE developer_id = :dev_id
              AND (z$) >= :start_date
              AND (z:) <= :end_date
            ORDER BY timestamp ASC
        )dev_idrC   rD   
productivebrowserserverznon-workc                 S   s   i | ]
}|g qS r   r   r   cr   r   r   
<dictcomp>   s      z.get_categorized_activities.<locals>.<dictcomp> )	idr   r   r   r   project_nameproject_typeurl	file_pathr   r   categoryr   )r   r'   r'   r;   r!      r&   duration_displayc                 S   s   | d S )Nr   r   r   r   r   r   r      r   z,get_categorized_activities.<locals>.<lambda>T)r   reversec                 S   s   i | ]}|d d dqS )r   )countr   r   rO   r   r   r   rQ      s      r\   d   r"   
percentagec                 S   s6   g | ].}||d  t |d  t|d  d ddqS )r   r!   rY   )r   rZ   r&   )rA   r1   r   r   r   r   
<listcomp>   s   
z.get_categorized_activities.<locals>.<listcomp>
   )startenddays)
rB   
date_rangeactual_work_secondsZactual_work_hoursZdaily_work_breakdownZtotal_tracked_secondsZtotal_tracked_hours
statisticsZactivities_by_categorytop_activities_by_categoryi  )status_codedetail)$r   r   fromisoformatreplacenowr	   utcr   TIMEZONE_CORRECTED_TIMESTAMPexecutefetchallr:   rS   r   r   r   r   r0   rT   rU   rV   rW   get_detailed_categoryr)   r*   striplowerlistvaluesr1   rA   sortedr.   	Exceptionr   r2   )rB   rC   rD   rE   categorizerra   rb   queryrowsre   Zdaily_breakdown
categoriesZcat_rawZtracked_total_secr3   ZactZcicatZgrouped_outputr6   Zdedupr   r   Zmerged_listitemr4   Z	cat_statsZdurrg   er   r   r   get_categorized_activitiesS   s    

	

 	
r   )fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   r   r	   r
   typingr   r   databaser   activity_categorizerr   jsonrouterrn   r:   rA   getr2   r   r   r   r   r   <module>   s*   2