U
    iq#                     @   s  d dl mZmZmZmZ d dlmZmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlZeeZe Zed	eefed
ddZeddeefeeedddZ edeeedededfeee ee edddZ!dS )    )	APIRouterDependsHTTPExceptionQuery)Session
joinedload)funcStringcast)ListOptional)datetimetimezone	timedelta)get_db)	DeveloperActivityRecordNz/api/developers-orm)dbc                    s  zDddl m} |d}| |}| }g }|D ]}|\	}}}	}
}}}}}d}d}|r|}t|drttj|j	tjd }nttj| }|
 dk rd	}n|
 d
k rd}||pd| |	|	dd|dd| d|pd| ||r| n|r| nddd|
|r| nd|d q2|dt|ttj ddW S  tk
r } z$td|  tdt|dW 5 d}~X Y nX dS )z:Get all developers using SQLAlchemy ORM with relationshipsr   )texta  
            SELECT 
                d.id,
                d.developer_id,
                d.name,
                d.email,
                d.active,
                d.created_at,
                d.last_sync,
                COALESCE(ac.activity_count, 0) as activity_count,
                ac.last_activity
            FROM developers d
            LEFT JOIN (
                SELECT 
                    developer_id::VARCHAR as developer_id,
                    COUNT(*) as activity_count,
                    MAX(timestamp) as last_activity
                FROM activity_records
                WHERE developer_id IS NOT NULL
                GROUP BY developer_id
            ) ac ON d.developer_id::VARCHAR = ac.developer_id::VARCHAR
            WHERE d.active = true
        offlineNreplace)tzinfoi  onlineiQ idledev_unknowni  databasezDeveloper with z activitieszN/A)idnamehostnamehostportstatussourcedescription	device_idactivity_count	last_seenversionbucket_countemail
created_atactive
productionorm_relationships)
developersenvironmenttotal_countdiscovered_atmethodz"Error getting developers via ORM:   status_codedetail)
sqlalchemyr   executefetchallhasattrr   nowr   utcr   total_secondsappend	isoformatlen	Exceptionloggererrorr   str)r   r   queryresultZdevelopers_with_statsZdeveloper_listrowdev_iddeveloper_idr   r*   r,   r+   	last_syncr&   last_activityr"   r'   	time_diffe rO   5/var/www/html/timesheet/backend/developers_orm_api.pyget_developers_using_orm   sh    
   


rQ   z(/api/developer/{developer_id}/activitiesd   )rJ   limitr   c           	         sN  z| ttj| k }|s,tddd| ttjdj	ttjtjkddtj| k
tj | }g }|D ]P\}}||j|j||j|j|jpd|j|jr|j nd|j|j|jd	 q~|j|j|jd
|t|dW S  tk
r    Y nD tk
rH } z$td|  tdt|dW 5 d}~X Y nX dS )z1Get activities for a specific developer using ORMi  zDeveloper not foundr5   developer_nameT)isouterOtherN)r   rJ   rT   application_namewindow_titlecategoryduration	timestampurl	file_pathproject_name)r   r   r*   )	developer
activitiestotal_activitiesz$Error getting developer activities: r4   )rF   r   filterrJ   firstr   r   r   labeljoinorder_byr[   descrS   allr?   r   rW   rX   rY   rZ   r@   r\   r]   r^   r*   rA   rB   rC   rD   rE   )	rJ   rS   r   r_   r`   Zactivities_listactivityrT   rN   rO   rO   rP   get_developer_activitiesi   s^    





rj   z/api/developers-with-stats   )r   
start_dateend_date
range_daysc                    s  zt tj}|r(t |dd}n|}|rDt |dd}n|t|d }| t	tj
|ktj
|ktj
  }i }|D ](}	|	j}
|
|krg ||
< ||
 |	 qg }d}| t	tjdk D ]}|j}||g }tdd |D \}}||7 }t|d }t|d d	 }|||j|j|| d
| d|rbt||d d  d dnd|rtdd |D  nd t|d q||t|d d dt|tt|d d d|dW S  tk
r } ztdt|dW 5 d }~X Y nX d S )NZz+00:00)daysr   Tc              
   S   s,   g | ]$}t d d|j|j|j|jd qS )RowrO   )r[   rZ   rW   rX   )typer[   rZ   rW   rX   .0arO   rO   rP   
<listcomp>   s   z-get_developers_with_stats.<locals>.<listcomp>i  <   zh m   rR      c                 S   s   g | ]
}|j qS rO   )r[   rs   rO   rO   rP   rv      s     )r   r   r*   Zactual_work_secondsZactual_work_displayproductivity_percentagerL   r&   h   )r/   Ztotal_hours_secondsZtotal_hours_displayZavg_hours_per_devrn   r4   r5   )r   r<   r   r=   fromisoformatr   r   rF   r   rb   r[   rf   ascrh   rJ   r?   r   r,   getZcalculate_actual_work_hoursintr   r*   roundmaxr@   rA   rB   r   rE   )r   rl   rm   rn   r<   endstartrowsZdeveloper_mapZactdevresultsZteam_total_secondsr_   rI   ZactsZwork_secondsZdaily_breakdownhoursminutesrN   rO   rO   rP   get_developers_with_stats   sl    
	 
r   )"fastapir   r   r   r   sqlalchemy.ormr   r   r8   r   r	   r
   typingr   r   r   r   r   r   r   modelsr   r   logging	getLogger__name__rC   routerr   rQ   rE   r   rj   r   rO   rO   rO   rP   <module>   s<   
Z>