
    Ji>                     d    d Z ddlmZ ddlmZmZ ddlZddlmZ ddlm	Z	 ddl
mZ  G d d	      Zy)
zP
Productivity Calculator - Analyze user productivity based on activity patterns
    )datetime)DictListN)ActivityWatchClient)and_)Sessionc                      e Zd Zd ZdedefdZdedefdZde	e
j                     de	e   fdZd	edefd
ZdededefdZ	 ddededededef
dZdedede	dede	e   f
dZde	e
j                     defdZde	e
j                     defdZy)ProductivityCalculatorc                 R    dddddddd| _         dd	d
dd| _        ddddd| _        y )N      ?gffffff?皙?g        g?g333333?)developmentproductivitydatabasebrowserentertainmentsystemotherg333333?g?gffffff?g      ?)
peak_hourseveningnight
late_nightg?g?g      ?)short_focusmedium_focus
long_focus
deep_focus)category_weightstime_multipliersfocus_bonuses)selfs    =E:\timesheet\timesheet_new\backend\productivity_calculator.py__init__zProductivityCalculator.__init__   sS       !
 	!
 	
    hoursreturnc                 v    |dk(  ryt        |dz        }|dz  }|dz  }|dk(  r| dS |dk(  r| dS | d| dS )z@Convert decimal hours to readable format (e.g., 5.5 -> '5h 30m')r   0h<   mhzh )int)r    r$   total_minutes
hours_partminutes_parts        r!   format_time_readablez+ProductivityCalculator.format_time_readable+   si    A:EBJ"b(
$r)?"^1%%Q \## \L>33r#   	timestampc                 l    |j                   }d|cxk  rdk  ry d|cxk  rdk  ry d|cxk  rdk  ry yy)	z0Categorize time of day for productivity analysis	      r      r      r   r   )hour)r    r0   r6   s      r!   get_time_categoryz(ProductivityCalculator.get_time_category;   sI    ~~>r> 4_"_ 4_"_   r#   
activitiesc                    |sg S g }|d   j                   |d   j                  |d   j                  |d   j                  |d   gd}t        dt	        |            D ]  }||   }||dz
     }t        |j                  |j                  z
  j                               }|j                   |d   k(  }|dk  r=|r;|j                  |d<   |dxx   |j                  z  cc<   |d   j                  |       |d   d	k\  r|j                  |j                                |j                   |j                  |j                  |j                  |gd} |d   d	k\  r|j                  |       |S )
z:Identify focus sessions (continuous work on same category)r   )category
start_timeend_timedurationr8      r:   i,  r<   r=   r8   i  )	r:   r0   r=   rangelenabstotal_secondsappendcopy)	r    r8   focus_sessionscurrent_sessioniactivityprev_activitytime_gapsame_categorys	            r!   calculate_focus_sessionsz/ProductivityCalculator.calculate_focus_sessionsH   s{   I"1..$Q-11"1//"1..%a=/
 q#j/*A!!}H&q1u-M H..1H1HHWWYZH$--1LLM 3=.6.@.@
+
+x/@/@@+-44X> #:.$6"))/*>*>*@A !) 1 1"*"4"4 ( 2 2 ( 1 1#+*#% +6 :&$.!!/2r#   duration_secondsc                     |dz  }|dk\  r| j                   d   S |dk\  r| j                   d   S |dk\  r| j                   d   S |dk\  r| j                   d   S y	)
z4Get focus bonus multiplier based on session durationr(      r   x   r   r      r   r   )r   )r    rM   duration_minutess      r!   get_focus_bonusz&ProductivityCalculator.get_focus_bonusv   st    +b0s"%%l33$%%l33#%%n55#%%m44r#   
start_dateend_datec                 p   t               }	 |j                  ||      }|sddddddi ddddddgdS g }|D ]6  } t	        dd	|d
   |d   |d   |d   d             }|j                  |       8 | j                  dd|||      S # t        $ r)}t        d|        ddddddi ddddddgdcY d}~S d}~ww xY w)z=Calculate productivity score directly from ActivityWatch dataz#Error fetching ActivityWatch data: r   r'   z"Error fetching ActivityWatch data.)overall_score
total_timeproductive_timetotal_time_formattedproductive_time_formattedproductivity_percentagecategory_breakdownrE   longest_focus_sessionlongest_focus_session_formattedaverage_focus_sessionaverage_focus_session_formattedrecommendationsN+No activity data available for this period.MockActivity r:   r=   application_namer0   )r:   r=   rf   r0   )r   get_activity_data	ExceptionprinttyperC   calculate_productivity_score)	r    rT   rU   	aw_clientactivity_dataemock_activitiesrH   mock_activitys	            r!   /calculate_productivity_score_from_activitywatchzFProductivityCalculator.calculate_productivity_score_from_activitywatch   s+   ')		%77
HMM& !"#$(,-1+,&("#)*37)*37$Q#R " %HD$Z0$Z0$,-?$@%k2	6  M ""=1 & 00tZSbcc]  	7s;<!"#$(,-1+,&("#)*37)*37$H#I 	s   B 	B5B0*B50B5Ndbuser_idc                 f   ||j                  t        j                        j                  t	        t        j                  j
                  |k(  t        j                  j                  |k\  t        j                  j                  |k              j                  t        j                  j                  j                               j                         }|sddddi g dgdS t        d |D              }d}i }i }	|D ]  }
|
j                  }|
j                  }| j                  j                  |d      }| j                  |
j                        }| j                   j                  |d      }||z  |z  }||z  }||vr
d||<   d|	|<   ||xx   |z  cc<   |	|xx   |z  cc<    | j#                  |      }d}|D ]H  }| j%                  |d         }| j                  j                  |d   d      }|d   |z  |dz
  z  }||z  }J ||z  }|dkD  r||z  d	z  nd}t'        d	|      }i }|j)                         D ]5  \  }}|	|   ||	|   dkD  r||	|   z  d	z  nd|dkD  r|	|   |z  d	z  ndd
||<   7 | j+                  ||||      }t-        |d      ||| j/                  |dz        | j/                  |dz        t-        |d      |t1        |      |rt3        |D cg c]  }|d   	 c}      nd|r.| j/                  t3        |D cg c]  }|d   	 c}      dz        nd|r(t        |D cg c]  }|d   	 c}      t1        |      z  nd|r:| j/                  t        |D cg c]  }|d   	 c}      t1        |      z  dz        nd|| j5                  |      | j7                  |      dS c c}w c c}w c c}w c c}w )z*Calculate comprehensive productivity scorer   rc   )rW   rX   rY   r\   r]   rE   rb   c              3   4   K   | ]  }|j                     y wNr=   ).0rH   s     r!   	<genexpr>zFProductivityCalculator.calculate_productivity_score.<locals>.<genexpr>   s     F:x**:   r   r   r=   r:   d   )
time_spentrY   productivity_ratepercentage_of_totalr>   i  r'   )rW   rX   rY   rZ   r[   r\   r]   rE   r^   r_   r`   ra   rb   time_distributionproductivity_trend)querymodelsActivityRecordfilterr   rs   r0   order_byascallsumr:   r=   r   getr7   r   rL   rS   minitems_generate_recommendationsroundr/   r@   max_get_time_distribution_get_productivity_trend)r    rr   rs   rT   rU   r8   rX   rY   category_scorescategory_timesrH   r:   r=   base_weighttime_categorytime_multiplierweighted_timerE   focus_bonus_timesessionfocus_bonus
bonus_timer\   rW   r]   scorerb   ss                               r!   rk   z3ProductivityCalculator.calculate_productivity_score   sb   
 &"7"78??))11W<))33zA))33x? hv,,66::<=cce  !"#$+,&("$$Q#R  F:FF
 #H((H((H //33HcBK !2283E3EFM"3377sKO %{2_DM},O .,-)+,x(H%6%8$0$+ #0 66zB%G..wz/BCK//33GJ4GMK ,{:kC>OPJ
*	 & 	++ KUWX.?Z#?##E^_ C!89  .446OHe,X6#(Q_`hQilmQmenX.F&F&LstXbefXfx(@:(MPS(Slm	,x(  7 88-~z

 #=!4$.$($=$=j4>O$P)-)B)B?UYCY)Z',-Da'H"4!.1UcS)PA!J-)P%QijHV 04/H/HN;NqQz]N;<tC0E\`#1 &))PA!J-)P%QTWU  & 78 -; 04/H/H#O]O_O] bcqQ[}O]O_ K`bec K #'J( 0)@D.!%!<!<Z!H"&">">z"J'
 	
 *Q;)PO_s   N8N$N)N."r   
categoriesrE   rX   c                    g }|dk  r|j                  d       n(|dk  r|j                  d       n|j                  d       |j                  di       j                  dd      }|j                  d	i       j                  dd      }||d
z  kD  r|j                  d       ||dz  kD  r|j                  d       t        |      dk  r|j                  d       nt        |      dkD  r|j                  d       |j                  di       j                  dd      }|dkD  r,||dz  k  r|j                  d       |S |j                  d       |S )z2Generate personalized productivity recommendationsrQ   uI   🔴 Low productivity detected. Consider reducing distracting activities.r(   u9   🟡 Moderate productivity. There's room for improvement.u3   🟢 Good productivity! Keep up the excellent work.r   r|   r   r   g333333?uT   🌐 High browser usage detected. Consider using website blockers during work hours.r   uI   🎮 Significant entertainment time. Try scheduling specific break times.   uO   🎯 Try to create longer focus sessions (30+ minutes) for better productivity.   uQ   ⚡ Many short sessions detected. Consider consolidating work into longer blocks.r   g?u?   💻 Consider dedicating more time to focused development work.uB   💻 Great development focus! You're spending quality time coding.)rC   r   r@   )	r    r   r   rE   rX   rb   browser_timeentertainment_timedev_times	            r!   r   z0ProductivityCalculator._generate_recommendations(  sW     2:""#noRZ""#^_""#XY "~~i488qI'^^OR@DD\STU*s**""#yz
S 00""#no ~"""#tu 1$""#vw >>-488qIa<*s**&&'hi   &&'klr#   c                     i }|D ]8  }|j                   j                  }||vrd||<   ||xx   |j                  z  cc<   : |S )z7Get time distribution across different hours of the dayr   )r0   r6   r=   )r    r8   hour_distributionrH   r6   s        r!   r   z-ProductivityCalculator._get_time_distributionO  sU    "H%%**D,,*+!$'d#x'8'88#	 # ! r#   c                      |sdddS t        |      dz  }|d| }||d } fd} ||      } ||      }||z
  }t        |      dk  rd}	n
|dkD  rd}	nd	}	|	t        |d
      dS )z&Calculate productivity trend over timestabler   )trendchanger   Nc                 t    | syt        d | D              }t        fd| D              }|dkD  r||z  dz  S dS )Nr   c              3   4   K   | ]  }|j                     y wrv   rw   )rx   as     r!   ry   zaProductivityCalculator._get_productivity_trend.<locals>.calc_half_productivity.<locals>.<genexpr>i  s     AAQZZrz   c              3      K   | ]7  }|j                   j                  j                  |j                  d       z   9 yw)r   N)r=   r   r   r:   )rx   r   r    s     r!   ry   zaProductivityCalculator._get_productivity_trend.<locals>.calc_half_productivity.<locals>.<genexpr>j  s9      "(A 

T2266qzz3GG(s   =A r{   )r   )half_activitiesrX   rY   r    s      r!   calc_half_productivityzNProductivityCalculator._get_productivity_trend.<locals>.calc_half_productivitye  sN    "AAAJ! "(" O <F>Oj036PqPr#      	improving	decliningr>   )r@   rA   r   )
r    r8   	mid_point
first_halfsecond_halfr   first_productivitysecond_productivityr   r   s
   `         r!   r   z.ProductivityCalculator._get_productivity_trend[  s    %33 
Oq(	
+
 ,		Q 4J?4[A$'99v;?EaZEE%*:;;r#   rv   )__name__
__module____qualname__r"   floatstrr/   r   r7   r   r   r   r   rL   rS   rq   r   r+   rk   r   r   r   re   r#   r!   r
   r
      s/   
84% 4C 4  8    ,48M8M3N ,SWX\S] ,\ % 4d( 4d^f 4dko 4dn [_k
w k
 k
19k
EMk
cgk
Z%u %$ %26%DI%NRSVi%N
!f6K6K1L 
!QU 
!!<$v7L7L2M !<RV !<r#   r
   )__doc__r   typingr   r   r   my_activitywatch_clientr   
sqlalchemyr   sqlalchemy.ormr   r
   re   r#   r!   <module>r      s*       7  "n< n<r#   