o
     h+                     @   s  d dl mZmZ d dlmZ d dlmZmZmZm	Z	 d dl
Zd dlZd dlmZ d dlmZ d dlmZ d dlmZmZ ed	d
dZeddZdaG dd deZG dd deZG dd deZG dd deZdd Zeddd Z e!ddd Z"e!ddd  Z#ej$d!ed"d#efd$d%Z%ej$d&ed"d#efd'd(Z&G d)d* d*eZ'ej$d+ee(e	f d"d#e'fd,d-Z)e!d.d/d0 Z*dS )1    )FastAPIHTTPException)	BaseModel)ListOptionalDictAnyN)RecommenderLoggerMABSimulation)UnifiedRecommendationEnv)DataControllerDataManagerMAB Recommendation API1.0.0)titleversionapi)namec                   @   sN   e Zd ZU eed< dZee ed< dZee ed< i Z	ee
eef  ed< dS )RecommendationRequestuser_id   n_recommendationsepsilon_greedyalgorithm_typealgorithm_paramsN)__name__
__module____qualname__int__annotations__r   r   r   strr   r   r    r"   r"   H/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/app/api.pyr      s
   
 r   c                   @   s6   e Zd ZU eed< eed< eed< dZee ed< dS )FeedbackRequestr   item_id
event_typeN	timestamp)r   r   r   r   r    r!   r'   r   r"   r"   r"   r#   r$      s
   
 r$   c                   @   s>   e Zd ZU eed< ee ed< eed< dZeee	  ed< dS )RecommendationResponser   recommended_itemsr   Nconfidence_scores)
r   r   r   r   r    r   r!   r*   r   floatr"   r"   r"   r#   r(      s
   
 r(   c                   @   s6   e Zd ZU eed< eed< dZeeeef  ed< dS )FeedbackResponsestatusmessageNupdated_rewards)	r   r   r   r!   r    r/   r   r   r   r"   r"   r"   r#   r,   %   s   
 r,   c               
   C   s   z\z$ddl } | j| j| j| jtd}td|iddddd	}W n& tyK } zt	d
t
|  G dd d}| }W Y d}~nd}~ww t|dddidatd W dS  tyy } ztdt
|  W Y d}~dS d}~ww )z*Initialize the MAB simulation environment.r   Nzenhanced_recommender.dbdb_path2   r   *   T)Zdata_sourcemax_armsn_suggestionsseedZuse_user_contextz!Failed to create DB environment: c                   @   $   e Zd Zdd Zdd Zdd ZdS )z.initialize_simulation.<locals>.MockEnvironmentc                 S      d| _ d| _d| _d S Nr1   r   r3   r4   Z
n_productsselfr"   r"   r#   __init__=      
z7initialize_simulation.<locals>.MockEnvironment.__init__c                 S      ddii fS Nr   r   r"   r:   r"   r"   r#   resetA      z4initialize_simulation.<locals>.MockEnvironment.resetc                 S      i ddddg ifS Ng        FZevent_typesr"   r;   actionr"   r"   r#   stepC      z3initialize_simulation.<locals>.MockEnvironment.stepNr   r   r   r<   r@   rF   r"   r"   r"   r#   MockEnvironment<   s    rI   r   epsilon皙?r   r   z'MAB Simulation initialized successfullyz!Failed to initialize simulation: F)ospathjoindirnameabspath__file__r   	Exceptionloggerwarningr!   r   
simulationinfoerror)rM   r0   envZ	env_errorrI   er"   r"   r#   initialize_simulation*   s2   &
	
r[   startupc               
      s   t d t sZt d t d z'ddlm}  ddlm} G dd d}| }||d	d
didat d W dS  t	yY } zt dt
|  daW Y d}~dS d}~ww dS )z!Initialize simulation on startup.zStarting API initialization...z*Failed to initialize simulation on startupz%Attempting fallback initialization...r   )EpsilonGreedyMABr
   c                   @   r6   )z&startup_event.<locals>.MockEnvironmentc                 S   r7   r8   r9   r:   r"   r"   r#   r<   `   r=   z/startup_event.<locals>.MockEnvironment.__init__c                 S   r>   r?   r"   r:   r"   r"   r#   r@   e   rA   z,startup_event.<locals>.MockEnvironment.resetc                 S   rB   rC   r"   rD   r"   r"   r#   rF   h   rG   z+startup_event.<locals>.MockEnvironment.stepNrH   r"   r"   r"   r#   rI   _   s    rI   r   rJ   rK   rL   z,Fallback simulation initialized successfullyz%Fallback initialization also failed: N)rT   rW   r[   rX   Zrl_recommender.mabalgorithmsr]   rl_recommender.simulationr   rV   rS   r!   )r]   r   rI   rY   Zfallback_errorr"   r"   r#   startup_eventP   s$   


r_   /c                   C   s   ddddddddS )	z#Root endpoint with API information.r   r   zGet recommendations for a userz#Submit feedback for recommendationszGet API and simulation statuszConfigure algorithm parameters)zGET /recommend_itemzPOST /feedbackzGET /statuszPOST /configure)r.   r   Z	endpointsr"   r"   r"   r"   r#   rootr   s   ra   z/statusc               
   C   s   t du r
ddddS z%t jt jjjt jjt jjd} ddd	| tt jd
dtt jddddW S  t	yL } zddt
| ddW  Y d}~S d}~ww )z1Get the current status of the API and simulation.NrX   Simulation not initializedF)r-   r.   simulation_readytypeclassn_armsr4   readyzSimulation readyTr3   zN/Ar4   )r3   r4   )r-   r.   rc   	algorithmenvironmentzError getting status: )rV   r   current_algorithm	__class__r   rg   r4   getattrrj   rS   r!   )algorithm_inforZ   r"   r"   r#   
get_status   s4   
ro   z/recommend_item)Zresponse_modelrequestc              
   C   s2  t du r
tdddzi| jt jks| jrt | j| j t jt j| j| jd}g }t	t jdrT|D ]!}|t
t jjk rMtdtdt jj| }|| q1|d	 q1nd
gt
| }tdt
| d| j  t| j|t j|dW S  ty } ztd| j dt|  tddt| dd}~ww )z+
    Get recommended items for a user.
    N  rb   status_codeZdetail)ri   r   r   arm_avg_rewardsrK   g      ?g      ?gffffff?z
Generated z recommendations for user )r   r)   r   r*   z*Error generating recommendations for user : z"Error generating recommendations: )rV   r   r   r   set_algorithmZinvoke_agentrk   r   r   hasattrlenrt   maxminappendrT   rW   r(   rS   rX   r!   )rp   Zrecommendationsr*   r%   Z
confidencerZ   r"   r"   r#   recommend_item   s>   r|   z	/feedbackc              
   C   sL  t du r
tdddzv| jg| jg| jg| jdu rtj nt| jgd}t	|}t 
| d}tt jdrht| j}d|  krLtt jjk rhn n| jtt jj| tt jj| tt jj| d}td	| j d
| j d| j  tdd|dW S  ty } ztd| j dt|  tddt| dd}~ww )z1
    Submit feedback for a recommended item.
    Nrq   rb   rr   )r   r%   r&   r'   rt   r   )r%   Zcurrent_avg_rewardZtotal_pullsZtotal_rewardzProcessed feedback from user z
 for item ru   successzFeedback processed successfully)r-   r.   r/   z$Error processing feedback from user zError processing feedback: )rV   r   r   r%   r&   r'   pd	TimestampnowZ	DataFrameZupdate_algorithmrw   rk   r   rx   rt   r+   Z
arm_countsZarm_rewardsrT   rW   r,   rS   rX   r!   )rp   Z
event_dataZevent_dfr/   Zitem_idxrZ   r"   r"   r#   feedback   s<    


 "r   c                   @   s.   e Zd ZU eed< i Zeeeef  ed< dS )ConfigureRequestr   r   N)	r   r   r   r!   r    r   r   r   r   r"   r"   r"   r#   r     s   
 r   z
/configurec              
   C   s   t du r
tdddz(t | j| jpi }td| j  dd| j | j|jj|j	|j
ddW S  tyS } ztd	t|  tdd	t| dd}~ww )
z&
    Configure the MAB algorithm.
    Nrq   rb   rr   zAlgorithm configured to r}   rd   )r-   r.   rn   zError configuring algorithm: )rV   r   rv   r   r   rT   rW   rl   r   rg   r4   rS   rX   r!   )rp   Znew_algorithmrZ   r"   r"   r#   configure_algorithm  s$   
r   z/healthc                   C   s   dt j  dS )zHealth check endpoint.Zhealthy)r-   r'   )r~   r   r   	isoformatr"   r"   r"   r#   health_check'  s   r   )+Zfastapir   r   Zpydanticr   typingr   r   r   r   Zpandasr~   Z	gymnasiumZgymZrl_recommender.loggerr	   r^   r   Z'rl_recommender.UnifiedRecommendationEnvr   Zdbr   r   apprT   rV   r   r$   r(   r,   r[   Zon_eventr_   getra   ro   postr|   r   r   r!   r   r   r"   r"   r"   r#   <module>   s@    
&
!

$./