
    i=%                     $   d dl 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 d dlmZ d dlmZ da ed	      Zd
edefdZde defdZedefd       Zededefd       Zededefd       Zeddededefd       Zededefd       Zy)    )datetime	timedeltaN)Path)tool)Chroma)
TextLoader)OpenAIEmbeddings)RecursiveCharacterTextSplitterchromabase_dir
openai_keyc                    | dz  }t        d|        |j                         st        d| d       d ay 	 t        |dd      5 }t	        j
                  |      }d d d        j                  dg       }|st        d	       d ay g }|D ]  }|j                  d
      }|s| |j                  dd      z  }	|	j                         rNt        d|	j                          t        t        |	      d      }
|j                  |
j                                t        d|	         |st        d       d ay t        dd      }|j                  |      }t        |      }t        j                         r-dd l}	 |j#                  t               t        dt         d       t'        j(                  ||t        t                    at        dt+        |       dt+        |       d       y # 1 sw Y   xY w# t$        $ r}t        dt         d|        Y d }~zd }~ww xY w# t$        $ r}t        d|        d aY d }~y d }~ww xY w)Nmanifest.jsonu/   🧠 Inicializando base de conocimiento desde: u   ⚠️ z no existe.rutf-8encoding	documentsu3   ⚠️ No se encontraron documentos en el manifest.knowledge_base_path\/u   📖 Cargando: u   ⚠️ Archivo no encontrado: u&   ⚠️ No se cargó ningún documento.i     )
chunk_sizechunk_overlap)openai_api_keyr   u    🧹 Directorio de persistencia z
 limpiado.u   ⚠️ No se pudo limpiar z: )persist_directoryu"   ✅ Base de conocimiento cargada: z fragmentos de z
 archivos.u)   ❌ Error cargando base de conocimiento: )printexistsvector_storeopenjsonloadgetreplacenamer   strextendr
   split_documentsr	   CHROMA_PERSIST_DIRshutilrmtree	Exceptionr   from_documentslen)r   r   manifest_pathfmanifestdocuments_metadataall_docsdoc_inforel_path	file_pathloadertext_splittertexts
embeddingsr*   es                   4/opt/aeropuerto/back/client/app/tools/definitions.pyinit_knowledge_baser=      sD    .M	;M?
KL!k234-w7 	$1yy|H	$ &\\+r:!GHL* 	DH||$9:HX !8#3#3D##>>I!	'789#C	NWE.6ykBC	D :;L6$VYZ--h7%Z@
 $$&N0189K8LJWX ,,!"45

 	23u:,ocRZm_\fgha	$ 	$P  N23E2FbLMMN  9!=>sh   H  G()H  B-H  3AH  6(G5 A	H  (G2-H  5	H>HH  HH   	I)H>>Ifechareturnc                 Z    g d}| j                  d       d|| j                             dS )uC   Formatea una fecha como YYYY-MM-DD (día de la semana en español).)lunesmartesu
   miércolesjuevesviernesu   sábadodomingoz%Y-%m-%dz ())strftimeweekday)r>   diass     r<   _formatear_fecha_esrJ   T   s0    WDnnZ()D,A+B!DD    c                  <    t        t        j                               S )u   Devuelve la fecha actual con el día de la semana. Útil para saber qué día es hoy. 
    RECUERDA: Las herramientas de tiempo real (MCP) SOLO funcionan para esta fecha.)rJ   r   now rK   r<   obtener_fecha_actualrO   Y   s     x||~..rK   dias_offsetc                 Z    t        j                         t        |       z   }t        |      S )u  
    Calcula una fecha relativa a hoy sumando o restando días.
    Útil para fechas como 'mañana', 'ayer' o 'en 3 días'.
    Devuelve la fecha en formato YYYY-MM-DD (día de la semana).
    Args:
        dias_offset: Número de días a sumar (positivo) o restar (negativo).
    )days)r   rM   r   rJ   )rP   r>   s     r<   calcular_fecharS   _   s$     LLNYK88Eu%%rK   pregunta_usuarioc                 h    | j                         }g d}g d}|D ]  }||v s y |D ]  }||v s y y)u   
    Analiza la pregunta del usuario para determinar si busca información de TIEMPO_REAL 
    o información HISTORICA/PLANIFICADA.
    )
septiembreoctubre	noviembre	diciembreenerofebreromarzoabrilmayojuniojulioagostoz
mes pasadozmeses pasadoszmeses anterioresu   año pasadou	   este año20262025202420232022u
   históricou   estadísticareportezitinerario mensualu   cuántos vuelos huboztotal de vuelos enu   comparación	tendencia)hoyahoraactualactualmentezen este momento	HISTORICOTIEMPO_REAL)lower)rT   pregunta_lowerhistorico_keywordstiempo_real_keywordsks        r<   detectar_tipo_consultart   p   s]     &++-N
   3{3 " 5}5 rK   mesanioc                 &   t        d|  d| d       t        t              j                         j                  j                  j                  }|dz  }|j                         st        d|        y	 t        |dd	      5 }t        j                  |      }d
d
d
       d
}| j                         }t        d| d| d       j                  dg       D ]v  }|j                  dd      j                         }	|j                  dd      j                         }
||
v s||	v sL|r	||
v s||	v sW|j                  d      }t        d|         n |st        d|  d| d       d|  d| dS ||j                  dd      z  }|j                         sd| dS t        |dd	      5 }|j                         }d
d
d
       d| j                          d| d S # 1 sw Y   AxY w# 1 sw Y   /xY w# t        $ r}dt        |       cY d
}~S d
}~ww xY w)u3  
    Lee el contenido completo del itinerario mensual de vuelos para un mes y año específicos.
    Útil para tener la visión completa de los vuelos programados.
    Args:
        mes: Nombre del mes (ej: 'enero', 'febrero', 'diciembre').
        anio: Año (ej: '2025', '2026'). Por defecto '2026'.
    u/   🔍 Herramienta leer_itinerario_mensual: mes='z	', anio=''r   u%   ❌ No se encontró manifest.json en uH   Error: No se encontró el archivo manifest.json en la raíz del cliente.r   r   r   Nu'   📂 Buscando coincidencia para slug: 'u   ' y año: 'r   original_name r   u   ✨ Coincidencia encontrada: u'   ⚠️ No se encontró itinerario para  z en el manifest.u#   No se encontró un itinerario para r   r   zError: El archivo u    no existe físicamente.z--- CONTENIDO DEL ITINERARIO (z) ---

zError al leer el itinerario: )r   r   __file__resolveparentr   r    r!   r"   ro   r#   r$   readupperr,   r&   )ru   rv   r   r/   r0   r1   
found_pathmes_slugdoc	orig_namekb_pathr6   contentr;   s                 r<   leer_itinerario_mensualr      s1    
;C5	$q
QRH~%%'..55<<H.M!5m_EFY!8-w7 	$1yy|H	$ 
99;7zTFRSTU<<R0 		C4::<Igg3R8>>@G 7"h)&;tw$)2C!$)>!?J9*FG		 ;C5$GWXY8QtfDTUUz11$<<	!'	{2JKK)S73 	qffhG	 0		}AdV9WIVV;	$ 	$4	 	
  8.s1vh778sg   3G/ GB	G/ !
G/ ,>G/ +*G/ G/ $G#5 G/ G G/ #G,(G/ /	H8HHHconsultac                    t        d|  d       t        t        d       y	 t        j                  | d      }|syg }|D ]t  }d	}t        |d
      rE|j                  r9|j                  j                  dd	      }|rt        |      j                  }d| d}|j                  | |j                          v dj                  |      S # t        $ r}dt        |       cY d}~S d}~ww xY w)u   
    Realiza una búsqueda semántica en la base de datos de itinerarios (Markdown/PDF).
    Útil para consultar vuelos de fechas específicas (ayer, mañana, próxima semana)
    o planes de vuelo futuros que no están en el sistema de tiempo real.
    u"   🔍 Buscando en documentos RAG: 'rx   Nu*   ❌ El vector_store no está inicializado.u7   La base de conocimiento histórica no está disponible.   )rs   u<   No se encontró información en los itinerarios históricos.rz   metadatasource[z] z

---

u+   Error al buscar en documentos históricos: )r   r   similarity_searchhasattrr   r#   r   stemappendpage_contentjoinr,   r&   )r   docs
resultadosr   metadata_strr   filenamer;   s           r<   buscar_en_documentosr      s     
.xj
:;:;HF--h!-<Q
 	CCLsJ'CLL))(B7#F|00H%&xj#3Ls/?/?.@AB	C !!*-- F<SVHEEFs#   C	 BC	 		C*C%C*%C*)rb   )r   r   localer!   pathlibr   langchain.toolsr    langchain_community.vectorstoresr   $langchain_community.document_loadersr   langchain_openair	   langchain.text_splitterr
   r   r)   r&   r=   rJ   rO   intrS   rt   r   r   rN   rK   r<   <module>r      s   (      3 ; - B(^ ?$ ?C ?LEx EC E
 /c / /
 	& 	& 	& 	&  S S  < 18 18C 18S 18 18f F3 F3 F FrK   