import numpy as np
import pandas as pd
import os
import logging
from sklearn.metrics.pairwise import cosine_similarity
from tensorflow.keras.models import load_model
from elasticsearch import Elasticsearch, ElasticsearchException

def main():
    # Configuración básica de logging
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    
    # Verificar si el modelo entrenado existe
    if not os.path.exists("my_model.h5"):
        logging.error("El modelo 'my_model.h5' no existe. Asegúrate de ejecutar 'train_model.py' primero.")
        return

    # Cargar el modelo entrenado
    model = load_model("my_model.h5")

    # Verificar si el archivo 'salida.csv' existe
    if not os.path.exists('salida.csv'):
        logging.error("El archivo 'salida.csv' no existe. Asegúrate de ejecutar 'procesador_txt.py' primero.")
        return

    # Cargar datos tokenizados desde el archivo CSV
    df = pd.read_csv('salida.csv')

    # Verificar que las columnas esperadas existen
    if 'texto_procesado' not in df.columns or 'texto_original' not in df.columns:
        logging.error("El archivo 'salida.csv' no tiene las columnas esperadas.")
        return

    sequences = [list(map(int, str(seq).split(','))) for seq in df['texto_procesado']]

    # Obtener las representaciones incrustadas para todas las noticias
    embeddings = model.predict(np.array(sequences))

    # Inicializar el cliente de Elasticsearch
    es = Elasticsearch(
        hosts=[{'host': 'localhost', 'port': 9200}],
        http_auth=('usuario', 'contraseña'),  # Cambia a tus propias credenciales
    )

    # Umbral de similitud del coseno
    SIMILARITY_THRESHOLD = 0.75  # Ajusta este valor según tus necesidades

    # Iterar sobre cada noticia para calcular y guardar las relaciones
    for i, current_news in enumerate(sequences):
        similarities = cosine_similarity(embeddings[i].reshape(1, -1), embeddings)[0]

        # Obtenemos noticias con similitud por encima del umbral (excluyendo la noticia actual)
        related_indices = [idx for idx in range(len(similarities)) if similarities[idx] > SIMILARITY_THRESHOLD and idx != i]
        
        related_news = [{"id": idx, "score": similarities[idx]} for idx in related_indices]
        
        document = {
            "id": i,
            "content": df['texto_original'].iloc[i],
            "related_news": related_news,
            # Añade tus nuevos campos aquí
            "title": df.get('title', 'N/A').iloc[i],  # Sustituye 'N/A' por un valor por defecto apropiado si 'title' no existe
            "theme": df.get('theme', 'General').iloc[i],  # Asume 'General' si 'theme' no existe
            "author": df.get('author', 'Anonymous').iloc[i],  # Asume 'Anonymous' si 'author' no existe
            "timestamp": df.get('timestamp', 'Unknown').iloc[i],  # Asume 'Unknown' si 'timestamp' no existe
        }

        try:
            # Guardar el documento en Elasticsearch
            es.index(index="news", body=document)
        except ElasticsearchException as e:
            logging.error(f"Error al indexar el documento en Elasticsearch: {e}")
        except Exception as e:
            logging.error(f"Something is fucked up Sorry about that .  {e}")

    logging.info("B-)  Todo a ido como la seda , muchas gracias por tu aportaciòn <3 . ")

if __name__ == "__main__":
    main()
