
    Jix6              
       \   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	      Z ed
       ee      fdedefdZej!                  d       ee       ee      fdededefd       Zej'                  d      d        Zej'                  d      dd ee      fdededefd       Zej'                  d      dd ee      fdedededefd       Zej'                  d      dd ee      fdedededefd       Zej'                  d       ee      fdefd       Zy)    )	APIRouterDependsHTTPExceptionHeader)Session)text)datetime)get_dbNz/api/multi-devzmulti-developer)prefixtags.authorizationdbc                     | j                  d      st        dd      | j                  dd      }|j                  t	        d      d|i      j                         }|st        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   results       :E:\timesheet\timesheet_new\backend\simple_multi_dev_api.pyvalidate_tokenr      sw    ##I.4JKK!!)R0EZZjk	% hj 
 ODD!9    z/activity/upload
activitiesdeveloper_idc                 *   d}| D ]x  }|j                  t        d      ||j                  dd      |j                  dd      |j                  dd      |j                  d      |j                  d	d
      d       |dz  }z |j                          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activitys        r   upload_activitiesr2      s     E


   '||$6	B!nb9$LLQ7%\\+6$LLW=	
 	
# & IIKe44r   z/healthc                  
    ddiS )Nr,   healthy r5   r   r   health_checkr6   9   s    i  r   z/developers-summary
start_dateend_datec                 (   	 ddl m }m}m} ddlm}m} | r |j                  |       }n/ |j                  |j                        j                  dddd      }|r |j                  |      }	n |j                  |j                        }	 |d      }
|j                  |
||	d      j                         }g }d}d}d}|D ]  }|d   }|d   }|d   xs d}|d	   }|d
   }|dz  }||z  }||z  }d}|rS |j                  |j                        |j                  |j                        z
  }|j                         dk  }|r|dz  } |d      }|j                  ||||	d      j                         }g }|D ]'  }|d   }|d   dz  }|j                  ||ddd       ) t        dt        dt!        |dz                    }|r |j                  |j                        |j                  |j                        z
  }|j                         dk  r t!        |j                         dz         d} nG|j                         dk  r t!        |j                         dz         d} n|j#                  d      } nd} |j                  |||||| |d        |rt%        d |D              t'        |      z  nd}!||||!t'        |      d}"|"||j)                         |	j)                         d d!S # t*        $ r}#t-        d"d#t/        |#       $      d%}#~#ww xY w)&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
        )r7   r8   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'   r7   r8   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              3   &   K   | ]	  }|d      yw)rQ   Nr5   ).0devs     r   	<genexpr>z)get_developers_summary.<locals>.<genexpr>   s     Ijss>2js   )active_developerstotal_hourstotal_activitiesavg_productivitytotal_developersstartend)overview
developers
date_range  z"Error getting developers summary: r   N)r	   r:   r;   
sqlalchemyr   r=   fromisoformatnowutcr   r   fetchalltotal_secondsappendminmaxintstrftimesumlen	isoformat	Exceptionr   str)$r7   r8   r   r	   r:   r;   r   r=   r_   r`   developers_querydevelopers_resultrb   rZ   r[   active_countdev_rowr   activity_countduration_secondslast_activityunique_appsrP   rO   	time_diffrecent_activities_queryrecent_resultrT   r1   app_nameapp_durationrQ   rS   r\   ra   es$                                       r   get_developers_summaryr   =   s   Hc::) *H**:6E HLL.66AaPQ_`6aE((((2C(,,x||,C   !  JJ'7:
  8: 	
 
(G"1:L$QZN&qzQ#AJM!!*K +V3K;&K. I(HLL69N9NV^VbVb9N9cc	%335<	 A%L '+ , '# JJ'>&#A  xz	  !#)#A;'{V3!((##/"4A 6*  * r3q#kB.>*?#@AL (HLL69N9NV^VbVb9N9cc	**,t3#&y'>'>'@2'E#F"Gx PI,,.6#&y'>'>'@4'G#H"I OI - 6 6z BI#	$&* ,$2&%6 A )V `j3IjIICPZO[op ".& 0 0 #J
 !$*}}
 	
  c6XY\]^Y_X`4abbcs   K'K* *	L3LLz*/developer/{developer_id}/activity-summaryc                    	 ddl m }m} ddlm}m} |r |j
                  |      }n/ |j                  |j                        j                  dddd      }|r |j
                  |      }	n |j                  |j                        }	 |d      }
|j                  |
| ||	d      j                         }g }d}g d}t        |      D ]?  \  }}|d   }|d   d	z  }||z  }|j                  |||d
   ||t        |      z     d       A  |d      }|j                  || ||	d      j                         }|r|d   nd}||||j                         |	j                         ddS # t         $ r}t#        ddt%        |             d}~ww xY w)zNGet activity summary for a specific developer (like your dashboard screenshot)r   r	   r;   r<   r>   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
        rH   )z#8884d8z#82ca9dz#ffc658z#ff7300z#8dd1e1z#d084d0r*   rF   rC   )r%   r#   r0   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
        r^   )data
total_timeactive_projectsrc   rd   z Error getting activity summary: r   N)r	   r;   re   r   r=   rf   rg   rh   r   r   ri   	enumeraterk   rq   r   rr   rs   r   rt   )r   r7   r8   r   r	   r;   r   r=   r_   r`   activity_queryactivities_resultactivity_datar   colorsir1   r%   duration_hoursprojects_queryproject_resultr   r   s                          r   get_developer_activity_summaryr      s   Ua/) *H**:6E HLL.66AaPQ_`6aE((((2C(,,x||,C    JJ~"8
  8:	 	 
S$%67KAx{H%a[61N.(J  $*!!CK0	"  8    N"5
  8:	 	 0>.+1 "$.*}}	
 	
  a6VWZ[\W]V^4_``as   E E# #	F
,FF
z"/developer/{developer_id}/detailedc           	         	 ddl m }m} |r |j                  |      }n/ |j                  |j                        j                  dddd      }|r |j                  |      }n |j                  |j                        }t        d      }|j                  || ||d      j                         }	g }
|	D ]6  }|
j                  |d   |d   |d   |d   |d	   j                         d
       8 | |
t        |
      |j                         |j                         ddS # t        $ r}t        ddt        |             d}~ww xY w)z3Get detailed activity data for a specific developerr   r   r>   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
        rH   r*   rC   rD   rE   )r    r"   r%   r#   r$   r^   )r   r   r[   rc   rd   z!Error getting developer details: r   N)r	   r;   rf   rg   rh   r   r   r   ri   rk   rr   rq   rs   r   rt   )r   r7   r8   r   r	   r;   r_   r`   activities_queryr   r   r1   r   s                r   get_developer_detailedr   -  sf   9b/ *H**:6E HLL.66AaPQ_`6aE((((2C(,,x||,C   !  JJ'7":
  8:	 	 
)H$,QK ($QK$QK%a[224  * )$ #J*}}	
 	
  b6WX[\]X^W_4`aabs   DD 	E#D<<Ez/developers-listc                 ,   	 t        d      }| j                  |      j                         }g }|D ]5  }|j                  |d   |d   |d   r|d   j	                         ndd       7 d|iS # t
        $ r}t        dd	t        |       
      d}~ww xY w)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*   rC   N)r   ry   r{   rb   rd   zError getting developers list: r   )r   r   ri   rk   rr   rs   r   rt   )r   ru   r   rb   rowr   s         r   get_developers_listr   p  s    ` 	! 	 ,-668
C #A"%a&7:1vQ!1!1!34   j)) `6UVYZ[V\U]4^__`s   A)A, ,	B5BB)fastapir   r   r   r   sqlalchemy.ormr   re   r   r	   databaser
   jsonrouterrt   r   postlistr2   r.   r6   r   r   r   r   r5   r   r   <module>r      s   = = "    	*2C1D	E )/s76? #       /&/555 	5 !58 I! ! !"&/NcNcNc 	Nc #Nc` 89 &/	\a\a\a \a 		\a :\a| 01 &/	@b@b@b @b 		@b 2@bD &-fo `G `  `r   