
    )i!                    (   d Z ddlm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 ddlmZmZ ddlmZ dd	lmZmZ  ej(                  d
d      Z ej(                  dd      Z ej(                  dd      Z ej(                  dd      Z G d d      ZddZy)zP
High-level orchestrator that downloads MCP data and stores it in the local DB.
    )annotationsN)AnyDictListOptional)DataController)ProductCatalogUserDemographics   )MCPSSEClient)normalize_customernormalize_productMCP_URLzhttps://api.recomai.one/mcpMCP_AUTH_KEYz1+FiDOuHBrVo4X0SfW5KrEQ==:y0R6zQZbj7K6wXN5jxgmTg==MCP_CHATBOT_KEYz1y3e5eb1lW26miVh/iKq8NA==:pTn0aD820uuRGj7hKyPyEw==RECS_DB_PATHzrecommender_system.dbc                     e Zd ZdZeeeef	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZ		 	 d	 	 	 	 	 ddZ
ddd	 	 	 	 	 dd	Zdd
Z	 	 	 	 	 	 	 	 	 	 ddZddZdd	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZedd       Zedd       Zy)MCPDataSynczHSyncs remote chatbot data (products/customers/orders) into the local DB.c                \    || _         || _        || _        || _        t	        |      | _        y N)db_pathmcp_urlauth_keychatbot_keyr   data_controller)selfr   r   r   r   s        c/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/recommender/data_sync/sync_service.py__init__zMCPDataSync.__init__   s.      &-g6    NFc                R    t        j                  | j                  ||||            S N)	page_size	max_pagessearchdry_run)asynciorun_sync_products_async)r   r"   r#   r$   r%   s        r   sync_productszMCPDataSync.sync_products,   s.     {{%%	YW]gn%o
 	
r   c                N    t        j                  | j                  ||            S N
batch_sizemax_batches)r&   r'   _sync_customers_async)r   r-   r.   s      r   sync_customerszMCPDataSync.sync_customers7   s$    
 {{455Yd5effr   Tr)   r0   c               N    t        j                  | j                  ||            S )Nr1   )r&   r'   _sync_all_async)r   r)   r0   s      r   sync_allzMCPDataSync.sync_all>   s$     {{4//m\j/kllr   c                Z  K   i }t        | j                  | j                  | j                        4 d {   }|r| j	                  |dd        d {   |d<   |r| j                  |dd        d {   |d<   d d d       d {    |S 7 X7 <7 7 # 1 d {  7  sw Y   |S xY ww)N   )r"   r#   productsr,   	customers)r   r   r   r   _sync_products_with_client_sync_customers_with_client)r   r)   r0   resultsclients        r   r3   zMCPDataSync._sync_all_asyncI   s     "$dmmT=M=MNNRX,0,K,KF^amq,K,r&r
#-1-M-Mfadrv-M-w'w$	 ON
  O&r'w	 ONNN
 sh   2B+BB+BB B3B4B;B+BB+BBB+B(BB(#B+c                  K   t        | j                  | j                  | j                        4 d {   }| j	                  |||||       d {   cd d d       d {    S 7 37 7 	# 1 d {  7  sw Y   y xY wwr!   )r   r   r   r   r9   )r   r"   r#   r$   r%   r<   s         r   r(   z MCPDataSync._sync_products_asyncR   sr       dmmT=M=MNNRX88## 9   ONN ONNNsV   0BA&BA,A(A,B A*!B(A,*B,A>2A53A>:Bc                  K   t        | j                  | j                  | j                        4 d {   }| j	                  |||       d {   cd d d       d {    S 7 17 7 	# 1 d {  7  sw Y   y xY wwr+   )r   r   r   r   r:   )r   r-   r.   r<   s       r   r/   z!MCPDataSync._sync_customers_asyncb   s`     dmmT=M=MNNRX99&Zep9qq ONNq ONNNsV   0A?A$A?A*A&A*A?A(A?&A*(A?*A<0A31A<8A?)r%   c                 K   d}d}d}d}		 | j                   |	|d}
|r||
d<   |j                  d|
       d {   }| j                  |      }| j                  |      }|sn}|t	        |      z  }t        |      }|t	        |      z  }|s)|D ]#  }| j                  j                  |      s|dz  }% n|t	        |      z  }t	        |      |k  rn|r|	|k\  rn|	dz  }	|r|	nd||||dS 7 w)Nr   r   )
chatbotKeypagelimitr$   get_products)pages_processedremote_items
normalized	persistedr%   )r   call_tool_json_extract_data_extract_productslen_normalize_productsr   add_product)r   r<   r"   r#   r$   r%   total_remotetotal_normalizedtotal_persistedrA   payloadresponsedatar7   rF   products                   r   r9   z&MCPDataSync._sync_products_with_clienti   s2     ".."'G
 $*!#22>7KKH%%h/D--d3HCM)L,X6JJ/)G++77@'1,  *  3z?28}y(TY.AID? D (4t(*(
 	
1 Ls   6C-C+A2C-,A C-c               L  K   d}d}d}d }	 | j                   |d}|r||d<   |j                  d|       d {   }	| j                  |	      }
t        |
t              r|
j                  dg       ng }t        |
t              r|
j                  di       ni }|sn|t        |      z  }|D ]?  }t        |      }| j                  |      r | j                  j                  |       |dz  }A |dz  }|j                  d      sn|j                  d	      }|r||k\  rn|||d
S 7 w)Nr   )r@   firstafterget_customersr8   pageInfor   hasNextPage	endCursor)batches_processedrE   inserted)r   rH   rI   
isinstancedictgetrK   r   _user_existsr   add_user)r   r<   r-   r.   rN   r]   batchescursorrQ   rR   rS   r8   	page_infocustomer
user_models                  r   r:   z'MCPDataSync._sync_customers_with_client   sB      $595E5EPZ&[G#) #22?GLLH%%h/D5?d5Kb1QSI4>tT4JR0PRIC	N*L%/9
((4((11*=MH	 & qLG==/]];/Fw+53 8 ")( 
 	
- Ms   5D$D"BD$AD$c                n    |j                   sy| j                  j                  |j                         }|d uS )NF)namer   get_user_by_name)r   userexistings      r   ra   zMCPDataSync._user_exists   s1    yy''88Ct##r   c                    t        | t              si S d| v r>t        | d   t              r+| d   j                  d      }t        |t              r|S | d   S d| v rt        | d   t              r| d   S | S )NoutputrS   )r^   r_   r`   )rR   rS   s     r   rI   zMCPDataSync._extract_data   s|    (D)IxJx/A4$HH%))&1D$%H%%X*Xf-=t"DF##r   c                   | j                  d      }t        |t              r!|D cg c]  }t        |t              s| c}S t        |t              rt|j                  d      }t        |t              rSg }|D ]J  }t        |t              s|j                  d      xs |}t        |t              s:|j	                  |       L |S g S c c}w )Nr7   edgesnode)r`   r^   listr_   append)rS   r7   prp   rF   edgerq   s          r   rJ   zMCPDataSync._extract_products   s    88J'h%'?x!:a+>Ax??h%LL)E%&35
!D!$-#xx/74%dD1&--d3	 "
 "!	 @s
   C	C	)r   strr   rv   r   rv   r   rv   )r6   NNF)
r"   intr#   Optional[int]r$   Optional[str]r%   boolreturnDict[str, Any])r6   N)r-   rw   r.   rx   r{   r|   )r)   rz   r0   rz   r{   r|   )r<   r   r"   rw   r#   rx   r$   ry   r%   rz   r{   r|   )r<   r   r-   rw   r.   rx   r{   r|   )rk   r
   r{   rz   )rR   r|   r{   r|   )rS   r|   r{   List[Dict[str, Any]])__name__
__module____qualname____doc__DEFAULT_DB_PATHDEFAULT_MCP_URLDEFAULT_AUTH_KEYDEFAULT_CHATBOT_KEYr   r)   r0   r4   r3   r(   r/   r9   r:   ra   staticmethodrI   rJ    r   r   r   r      s   R '&(.77 7 	7
 7$ #' $	
	
 !	
 		

 	
 
	
 %)gg #g 
	g ##	m m 	m
 
m ! 	
  
 r 5
5
 	5

 !5
 5
 5
 
5
n+
+
 	+

 #+
 
+
`$ 
 
  r   r   c                V    g }| D ]!  }t        |      }|s|j                  |       # |S r   )r   rs   )r7   rF   rT   normalized_products       r   rL   rL      s6    ')J.w701  r   )r7   r}   r{   zList[ProductCatalog])r   
__future__r   r&   ostypingr   r   r   r   dbr   	db.modelsr	   r
   
mcp_clientr   normalizersr   r   getenvr   r   r   r   r   rL   r   r   r   <module>r      s    #  	 , ,  6 $ >"))I'DE299^-`a bii7  "))N,CDY Yxr   