
    i                        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m	Z	 ddl
mZmZmZ ddlmZ ddlmZmZ ddlmZ  ej*                  e      Z ed	d
g      Zej3                  de ee      g       edd       edddd       edd      fdededefd       Zej3                  de ee      g      defd       Zej=                  de        ee      fd!efd"       ZejA                  d# ee      g$      d'd%e!fd&       Z"y)(u7   
Endpoints de sincronización y gestión de productos.
    N)	APIRouterDependsHTTPExceptionQuerystatus   )SyncProductsResponseSearchProductItemNeo4jSearchResponse)sync_products)verify_api_keyverify_token)parse_neo4j_productsz	/productsproducts)prefixtagsz/search)response_modeldependencies.u   Texto de búsqueda)description
      2   u   Número máximo de resultados)geler   vectoru(   Modo de búsqueda: 'vector' o 'fulltext'qlimitmodec                   K   ddl m} t        j                  d|  d| d|        t	        j                         }	 |dk(  r*t        j                  |j                  | |       d{   }n)t        j                  |j                  | |       d{   }t        t	        j                         |z
  d      }t        j                  dt        |       d| d       t        |d      D ]  \  }}	t        j                  d| d|	j!                  d       d|	j!                  d       d|	j!                  d       d|	j!                  d       d|	j!                  d       d|	j!                  dd               t#        | t        |      ||       S 7 &7 # t        $ r5}t        j                  d| d	
       t        dt        |            d}~ww xY ww)!u   
    Busca productos en Neo4j directamente a partir de un texto.
    - mode=vector  → búsqueda semántica por embeddings (default)
    - mode=fulltext → búsqueda por texto completo
    r   neo4j_clientu    🔍 [search_products_neo4j] q='z' limit=z mode=fulltextNu#   ❌ [search_products_neo4j] Error: Texc_info  status_codedetail   u   ✅ [search_products_neo4j] z resultados en sr   z   [z] id=idz | sku=sku_idz | nombre='namez' | precio=pricez	 | marca=brandz	 | score=scorezN/A)querytotal	elapsed_sr   )rag_service.neo4j_clientr!   loggerinfotimeasyncio	to_threadfulltext_search_products_fullvector_search_products_full	Exceptionerrorr   strroundlen	enumerategetr   )
r   r   r   r!   t0raweelapsedips
             3/opt/lhia/marcimex/agent/app/api/routes/products.pysearch_products_neo4jrJ      s     6
KK21#XeWF4&QR	B<:)),*T*TVWY^__C)),*R*RTUW\]]C
 DIIK"$a(G
KK.s3xjyPQRS#q! 
11#U155;-wquuX.? @uuV}o[w0@ AUU7^$IaeeGU.C-DF	

 Qc#h'TWXX! `] <:1#>NCF;;<sM   9G)F %F&)F FF C7GF F 	G0G		GGz/{product_id}
product_idc                   K   ddl m} t        j                  d|  d       t	        j                         }	 t        j                  |j                  |        d{   }|st        dd|  d
      t        t	        j                         |z
  d      }t        j                  d|  d| d       t        |g      d   S 7 c# t        $ r5}t        j                  d| d       t        d	t        |      
      d}~ww xY ww)u   
    Retorna el detalle completo de un producto buscándolo por su ID en Neo4j.
    Devuelve 404 si el producto no existe.
    r   r    u%   🔍 [get_product_by_id] product_id=''Nu   ❌ [get_product_by_id] Error: Tr#   r%   r&   i  zProducto con id 'z' no encontrador)   u$   ✅ [get_product_by_id] product_id='z' encontrado en r*   )r4   r!   r5   r6   r7   r8   r9   get_product_contextr<   r=   r   r>   r?   r   )rK   r!   rC   rD   rE   rF   s         rI   get_product_by_idrO   9   s      6
KK7
|1EF	B<%%l&F&F
SS
 6G
|Sb4cddDIIK"$a(G
KK6zlBRSZR[[\]^&q)) T <6qc:TJCF;;<s;   4D#C  B>C  AD>C   	C>	0C99C>>Dz/sync)r   _c                    K   	 t                d{   S 7 # t        $ rO}t        j                  dt	        |       d       t        t        j                  dt	        |             d}~ww xY ww)u   
    Sincroniza productos desde XML a Neo4j.

    - Si la BD está vacía: sube todos los productos con estado 'nuevo'
    - Si ya hay datos: sincronización incremental
    Nu   ❌ Error en sincronización: Tr#   u   Error en sincronización: r&   )r   r<   r5   r=   r>   r   r   HTTP_500_INTERNAL_SERVER_ERROR)rP   rE   s     rI   sync_products_to_neo4jrS   S   sh     
"_$$$ 
5c!fX>N==/Ax8
 	

s1   A3  A3 	A0A
A++A00A3z/all)r   confirmc                   K   ddl m} | st        t        j                  d      t
        j                  d|j                                 	 |j                         }t
        j                  d|d           |S # t        $ rM}t
        j                  dt        |              t        t        j                  d	t        |             d
}~ww xY ww)ug   
    Elimina todos los productos de Neo4j.
    ADVERTENCIA: operación destructiva e irreversible.
    r   r    uN   Debes pasar confirm=true para confirmar la eliminación de todos los productosr&   u!   🗄️ Eliminando productos de: u   🗑️ messageu    ❌ Error eliminando productos: zError eliminando productos: N)r4   r!   r   r   HTTP_400_BAD_REQUESTr5   r6   get_current_databasedelete_all_productsr<   r=   r>   rR   )rT   r!   resultrE   s       rI   rY   rY   e   s      633c
 	

 KK3L4U4U4W3XYZ	
113hvi0123 
7Ax@A==1#a&:
 	

s+   A
C,A: 9C:	CACCC)F)#__doc__r8   loggingr7   fastapir   r   r   r   r   modelsr	   r
   r   services.sync_servicer   authr   r   agent.conversation_utilsr   	getLogger__name__r5   routerrB   r>   intrJ   rO   postrS   deleteboolrY        rI   <module>rk      sS      D D Q Q 1 / 9			8	$	+ZL	9 I&9Q]I^H_`3$89raB4STh,VW!Y
!Y!Y !Y a!YH O,=WUaMbLcd* * e*2 W%9:*1.*A 
C 
 ;
" vW\%:$;<
t 
 =
rj   