#
#   python_llm_sinonimos_dataset.py
#
#   A partir de un dataset con frases en español genera uno nuevo con sinónimos de las frases del dataset original
#
#   REQUISITOS:
#       Para pruebas descargar los siguientes modelos de Ollama de: https://ollama.com/search
#           gemma4:12b
#           qwen2.5:14b
#           translategemma:12b  (recomendado)
#
#   Rogelio Ferreira Escutia - octubre/2026
#

# Bibliotecas necesarias (no requieren instalar nada a través de PyPi)
import csv
import sys
import time
from datetime import datetime

# Bibliotecas utilizadas que hay que instalar
import ollama
from ollama import Client, ResponseError

# Dataset original en español
DATASET_SPANISH_ORIGINAL = "dataset_034_robot_ordenes_spanish_100.csv"
# Dataset nuevo que se va a crear con frases sinónimas
DATASET_SPANISH_SYNONYMS = "dataset_035_robot_ordenes_spanish_sinonimos_100.csv"
# LLM que se utilizará para la traducción
LLM_MODEL_SYNONYMS = "translategemma:12b"

# Función que pregunta por los metadatos
def preguntar_metadatos():
     lista = []
     return lista

# Función que llama al LLM para generar los sinónimos
def llm_synonyms(phrase: str, model_name: str) -> str:
    system_prompt = (
       "You are an expert in Spanish linguistics and stylistics. "
       "Your task is to generate synonymous rewrites of complete sentences while preserving the exact meaning, verb tense, and intent of the original text. "
       "Return only the phrase that is synonymous with the original, without any intro, extra explanation, or quotes."
    )
    try:
        response = ollama.chat(
             model=model_name,
             messages=[
                 {"role": "system", "content": system_prompt},
                 {"role": "user", "content": phrase},
            ],
            options={
                "temperature": 0.1,		# Baja temperatura para una alta precisión
                "keep_alive": '-1',		# Para que se mantenga cargado el modelo en memoria de forma indefinida
            },
        )
        return response["message"]["content"].strip()
    except ollama.ResponseError as e:
        print(f"Ollama API error: {e.error}", file=sys.stderr)
        sys.exit(1)
    except Exception as e:
        print(f"Unexpected error: {e}", file=sys.stderr)
        sys.exit(1)
    
# PROGRAMA PRINCIPAL
print("\nGeneración de un dataset de sinónimos a partir de otro dataset\n")

# AQUI VOY

inicio = datetime.now()
with open(
    DATASET_SPANISH_ORIGINAL, mode="r", newline="", encoding="utf-8") as entrada, open(
         DATASET_SPANISH_SYNONYMS, mode="w", newline="", encoding="utf-8") as salida:
    reader = csv.reader(entrada)
    standard_writer = csv.writer(salida)
    prev_row = None
    contador = 0
    for current_row in reader:
            if prev_row is not None:
                contador = contador + 1
                texto_original = prev_row[0] 
                print(contador, " Original: ", texto_original)
                sinonimo = llm_synonyms(texto_original, LLM_MODEL_SYNONYMS)
                print(contador, " Sinónimo: ", sinonimo)
                standard_writer.writerow([sinonimo])
            prev_row = current_row
    if prev_row is not None:
            contador = contador + 1
            texto_original = prev_row[0] 
            print(contador, " Original: ", texto_original)
            sinonimo = llm_synonyms(texto_original, LLM_MODEL_SYNONYMS)
            print(contador, " Sinónimo: ", sinonimo)
            csv.writer(salida, lineterminator="").writerow([sinonimo])
print("\nProceso Terminado!")
fin = datetime.now()
tiempo_total = fin - inicio
print("\nTiempo total: " + str(tiempo_total), "\n")