
     /iz2                        U d Z ddlZddlZddlZ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 	 ddlmZmZmZ dZ ej(                  d	      Z ej,                  ej.                  
       e G d d             Z G d d	      Zdaee   ed<   defdZedk(  r e       Z ed        ed ej@                  ejC                         d               ed ej@                  ejE                         d               ed ej@                  ejG                         d               ed ej@                  ejI                         d              erejK                         Z& ed       y ed       yy# e$ r dZY Gw xY w)z
Genesis Analytics Dashboard API
================================
REST API endpoint for analytics and metrics.

PM-045: Analytics Dashboard API
- Endpoints: /revenue, /tasks, /agents
- Returns JSON metrics
- Supports filtering and date ranges
    N)DictAnyListOptional)datetime	timedelta)	dataclassasdict)FlaskjsonifyrequestTFAnalyticsAPI)levelc                   :    e Zd ZU dZeed<   eeef   ed<   eed<   y)MetricSnapshotz)A snapshot of metrics at a point in time.	timestampmetricssourceN)__name__
__module____qualname____doc__str__annotations__r   r        //mnt/e/genesis-system/api/analytics_endpoint.pyr   r      s    3N#s(^Kr   r   c                   N   e Zd ZdZddZdedefdZdededeee	f   fdZ
	 	 	 dd	ed
ededeee	f   fdZddedeeee	f      fdZ	 	 ddededeee	f   fdZddedeee	f   fdZd dedeee	f   fdZ	 d!dededeee	f   fdZdeee	f   fdZdeee	f   fdZdee	   fdZy)"r   zp
    Analytics Dashboard API providing metrics endpoints.
    Supports revenue, tasks, and agent analytics.
    Nc                     || _         || _        || _        i | _        d| _        g | _        t        j                  d       y)z
        Initialize analytics API.

        Args:
            revenue_tracker: Optional RevenueTracker instance
            task_store: Optional task storage
            agent_registry: Optional agent registry
        <   zAnalytics API initializedN)revenue_tracker
task_storeagent_registrymetrics_cache	cache_ttlhistorical_metricsloggerinfo)selfr!   r"   r#   s       r   __init__zAnalyticsAPI.__init__-   sC      /$, 9; 9;/0r   	cache_keyreturnc                     || j                   vry| j                   |   }t        j                  |j                        }t        j                         |z
  j                         | j                  k  S )zCheck if cache is still valid.F)r$   r   fromisoformatr   utcnowtotal_secondsr%   )r)   r+   cachedcached_times       r   _cache_validzAnalyticsAPI._cache_validC   s]    D...##I.,,V-=-=>!K/>>@4>>QQr   r   c                    | j                  |      r| j                  |   j                  S  |       }t        t	        j
                         j                         ||      }|| j                  |<   | j                  j                  |       |S )z)Get cached metrics or compute fresh ones.)r   r   r   )	r3   r$   r   r   r   r/   	isoformatr&   append)r)   r+   
compute_fnr   r   snapshots         r   _get_cached_or_computez#AnalyticsAPI._get_cached_or_computeL   s~     Y'%%i0888,!oo'113

 )19%&&x0r   
start_dateend_dategroup_byc                 J      fd}d| d| d| } j                  ||d      S )a
  
        Get revenue metrics.

        Args:
            start_date: Start date filter (YYYY-MM-DD)
            end_date: End date filter (YYYY-MM-DD)
            group_by: Grouping (daily, weekly, monthly)

        Returns:
            Revenue metrics dict
        c                      j                   rWj                   j                         } j                   j                         }j                   j                  d      }| ||ddS ddddd	d
dddg ddS )N   )limitUSD)totals	by_sourcerecent_eventscurrencyg     @g     @g     @g    @)dailyweeklymonthlyall_timei:  i.  i@  )ghl_workflowtradie_funnelvoice_ai)r!   get_totals_summaryget_source_breakdownget_recent_events)rB   source_breakdownrD   r)   s      r   computez1AnalyticsAPI.get_revenue_metrics.<locals>.computem   s    ##--@@B#'#7#7#L#L#N  $ 4 4 F FR F P %!1%2 %	  ")")#+$-	 ).).$("
 &( % r   revenue__revenuer9   )r)   r:   r;   r<   rQ   r+   s   `     r   get_revenue_metricsz AnalyticsAPI.get_revenue_metrics_   s7    	< zl!H:QxjA	**9gyIIr   daysc                 J   g }t        j                         }t        |dd      D ]|  }|t        |      z
  j	                  d      }| j
                  r| j
                  j                  |      }nddl}|j                  dd      }|j                  |t        |d      d	       ~ |S )
z&Get revenue trend over specified days.)rW   z%Y-%m-%dr   Ni  i     )dateamount)r   r/   ranger   strftimer!   get_daily_totalrandomuniformr6   round)r)   rW   trendnowir[   r\   r`   s           r   get_revenue_trendzAnalyticsAPI.get_revenue_trend   s    ootR$ 	A)++55jAD##--==dCT2LL* 	 r   statusr@   c                 L      fd}d d } j                  ||d      S )z
        Get task metrics.

        Args:
            status: Filter by status (pending, running, completed, failed)
            limit: Max tasks to return

        Returns:
            Task metrics dict
        c                  :   j                   rj                   j                        } j                   j                         }|j                  dd      |j                  di       |j                  dd      |j                  dd      | d d dS d	d
ddddddg dS )N)rg   r@   totalr   	by_statuscompletion_rateavg_durationr?   )total_tasksrk   rl   avg_duration_secondsrecent_tasksi        i     )pendingrunning	completedfailedg33333X@gF@)r"   	get_tasksget_statisticsget)tasksstatsr@   r)   rg   s     r   rQ   z.AnalyticsAPI.get_task_metrics.<locals>.compute   s    11u1M668 $)99Wa#8!&;!;',yy1BA'F,1IIna,H$)#2J  $(#%#$%)"$	" (,,0$& r   tasks_rS   r{   rU   )r)   rg   r@   rQ   r+   s   ```  r   get_task_metricszAnalyticsAPI.get_task_metrics   s1    	6 VHAeW-	**9gwGGr   hoursc           	      B    |dddt        d|z  d      t        dd      dS )zGet task throughput metrics.         rZ   g.-@)period_hourstasks_startedtasks_completedtasks_failedthroughput_per_hourfailure_rate)rb   )r)   r   s     r   get_task_throughputz AnalyticsAPI.get_task_throughput   s2     " "#(ua#8!-3
 	
r   agent_idc                 B      fd}d } j                  ||d      S )z
        Get agent metrics.

        Args:
            agent_id: Optional specific agent ID

        Returns:
            Agent metrics dict
        c                  H   j                   rqj                   j                         } t        d | D              }t        |       |t        |       |z
  s| dS | D cg c]  }|j	                  d      k(  s| c}dS dddddd	d
dddd
dddd
dddd
dddd
gdS c c}w )Nc              3   J   K   | ]  }|j                  d       dk(  sd  yw)rg   active   N)rz   ).0as     r   	<genexpr>zBAnalyticsAPI.get_agent_metrics.<locals>.compute.<locals>.<genexpr>   s     N1!%%/X2MQNs   ##id)total_agentsactive_agentsidle_agentsagents   rr      aivar   i  )r   rg   r   ralphi@  claudei  geminiidle   opusd   )r#   list_agentssumlenrz   )r   r   r   r   r)   s      r   rQ   z/AnalyticsAPI.get_agent_metrics.<locals>.compute   s    "",,88:NNN %(K%+#&v;#7,4f	 
 $*;QUU4[H-D;	  %&%&#$%cR&(sS'8PST'6cR%cR	 ;s   B
6B
agents_r   rU   )r)   r   rQ   r+   s   ``  r   get_agent_metricszAnalyticsAPI.get_agent_metrics   s+    	8 hZ(	**9gxHHr   period_daysc                     ||dddddS )z-Get performance metrics for a specific agent.Y   g     W@i  gX@)r   r   r   success_rateavg_response_time_msuptime_percentr   )r)   r   r   s      r   get_agent_performancez"AnalyticsAPI.get_agent_performance  s      !&! $("
 	
r   c           	      X    t        j                         j                         ddddddddS )	zGet overall system metrics.healthyi  i   g     A@   rr   g      ?)r   rg   uptime_hoursmemory_usage_mbcpu_usage_percentactive_connectionsqueue_deptherror_rate_percent)r   r/   r5   r)   s    r   get_system_metricszAnalyticsAPI.get_system_metrics  s6     "*446#!%"$"%	
 		
r   c                     t        j                         j                         | j                         | j	                         | j                         | j                         dS )z#Get consolidated dashboard summary.)r   rT   r{   r   system)r   r/   r5   rV   r~   r   r   r   s    r   get_dashboard_summaryz"AnalyticsAPI.get_dashboard_summary  sQ     "*446//1**,,,.--/
 	
r   c                 "  
 t         st        j                  d       yt        t              }| 
|j                  ddg      
fd       }|j                  ddg      
fd       }|j                  d	dg      
fd
       }|j                  ddg      
fd       }|j                  ddg      
fd       }|j                  ddg      
fd       }|j                  ddg      
fd       }|j                  ddg      
fd       }	|S )z$Create Flask app with all endpoints.z9Flask not available. Install flask to use HTTP endpoints.Nz/api/v1/analytics/revenueGET)methodsc                      t         j                  j                  d      } t         j                  j                  d      }t         j                  j                  dd      }t        j	                  | ||            S )Nr:   r;   r<   rF   )r   argsrz   r   rV   )r:   r;   r<   apis      r   rT   z.AnalyticsAPI.create_flask_app.<locals>.revenue4  s[     )),7J||''
3H||''
G<H322:xRSSr   z/api/v1/analytics/revenue/trendc                      t        t        j                  j                  dd            } t	        j                  |             S )NrW   rs   )intr   r   rz   r   rf   )rW   r   s    r   revenue_trendz4AnalyticsAPI.create_flask_app.<locals>.revenue_trend;  s4    w||''34D300677r   z/api/v1/analytics/tasksc                      t         j                  j                  d      } t        t         j                  j                  dd            }t	        j                  | |            S )Nrg   r@   r   )r   r   rz   r   r   r~   )rg   r@   r   s     r   r{   z,AnalyticsAPI.create_flask_app.<locals>.tasks@  sJ    \\%%h/F((#67E3//>??r   z"/api/v1/analytics/tasks/throughputc                      t        t        j                  j                  dd            } t	        j                  |             S )Nr      )r   r   r   rz   r   r   )r   r   s    r   task_throughputz6AnalyticsAPI.create_flask_app.<locals>.task_throughputF  s4    (("56E32259::r   z/api/v1/analytics/agentsc                  v    t         j                  j                  d      } t        j	                  |             S )Nr   )r   r   rz   r   r   )r   r   s    r   r   z-AnalyticsAPI.create_flask_app.<locals>.agentsK  s-    ||''
3H300:;;r   z//api/v1/analytics/agents/<agent_id>/performancec                     t        t        j                  j                  dd            }t	        j                  | |            S )NrW   r   )r   r   r   rz   r   r   )r   rW   r   s     r   agent_performancez8AnalyticsAPI.create_flask_app.<locals>.agent_performanceP  s6    w||''23D344XtDEEr   z/api/v1/analytics/systemc                  6    t         j                               S N)r   r   r   s   r   r   z-AnalyticsAPI.create_flask_app.<locals>.systemU  s    311344r   z/api/v1/analytics/dashboardc                  6    t         j                               S r   )r   r   r   s   r   	dashboardz0AnalyticsAPI.create_flask_app.<locals>.dashboardY  s    344677r   )FLASK_AVAILABLEr'   warningr   r   route)r)   apprT   r   r{   r   r   r   r   r   r   s             @r   create_flask_appzAnalyticsAPI.create_flask_app+  sV   NNVWHo	.	@	T 
A	T 
4ug	F	8 
G	8 
,ug	>	@ 
?	@
 
7%	I	; 
J	; 
-w	?	< 
@	< 
Dug	V	F 
W	F 
-w	?	5 
@	5 
05'	B	8 
C	8 
r   )NNN)NNrF   )rs   )Nr   )r   r   )r   )r   r   r   r   r*   r   boolr3   r   r   r9   rV   r   r   rf   r~   r   r   r   r   r   r   r   r   r   r   r   r   '   so   
1,Rc Rd R 47<@cN& 59,0,3-Jc -J&)-J&)-J8<S#X-J^c 4S#X3G , .2&)(Hs (H #(H.238n(HT	
 	
d38n 	
'I# 'Ic3h 'IT 34

c 

,/

8<S#X


DcN 

tCH~ 
2(3- 2r   _apir,   c                  .    t         
t               a t         S )z,Get or create global analytics API instance.)r   r   r   r   r   get_apir   d  s     |~Kr   __main__z
=== Analytics API Test ===z

Revenue: rZ   )indentz
Tasks: z	
Agents: z
Dashboard: z>
[INFO] Flask app created. Run with app.run() to start server.z<
[INFO] Flask not available. Install with: pip install flask)'r   osjsonloggingtypingr   r   r   r   r   r   dataclassesr	   r
   flaskr   r   r   r   ImportError	getLoggerr'   basicConfigINFOr   r   r   r   r   r   r   printdumpsrV   r~   r   r   r   r   r   r   r   <module>r      s  	 
   , , ( )--O 
		>	*   ',, '   v vt	  $h| #  z
.C	
() 
K


3#:#:#<QGH
IJ 
Ijdjj!5!5!7BC
DE 
Jztzz#"7"7"9!DE
FG 
M*$**S%>%>%@KL
MN ""$OPMN/ i
  Os   E6 6F F