#
#   python_llm_traduccion_dataset.py
#
#   Traduce un Dataset de Inglés a Español generando un nuevo dataset
#
#   REQUISITOS:
#       Descargar el modelo "translategemma:12b" para Ollama de: https://ollama.com/search
#
#   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 inglés
DATASET_ENGLISH = "english_3.csv"
# Dataset nuevo que se va a crear con su traducción del inglés al español
DATASET_SPANISH = "spanish_3.csv"
# LLM que se utilizará para la traducción
LLM_MODEL_TRANSLATION_ENGLISH_SPANISH = "translategemma:12b"

# Función que llama al LLM para traducir de inglés a español una frase
def llm_translation_english_spanish(phrase: str, model_name: str) -> str:
    system_prompt = (
       "You are an expert English-to-Spanish translator. "
       "Translate the user's English text into natural Spanish. "
       "Provide ONLY the direct Spanish translation 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 traducción precisa
                "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("\nTraducción de un Dataset de Inglés a Español\n")
inicio = datetime.now()
with open(
    DATASET_ENGLISH, mode="r", newline="", encoding="utf-8") as entrada, open(
         DATASET_SPANISH, 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_ingles = prev_row[0] 
                print(contador, " Inglés: ", texto_ingles)
                spanish = llm_translation_english_spanish(texto_ingles, LLM_MODEL_TRANSLATION_ENGLISH_SPANISH)
                print(contador, " Español: ", spanish)
                standard_writer.writerow([spanish])
            prev_row = current_row
    if prev_row is not None:
            contador = contador + 1
            texto_ingles = prev_row[0] 
            print(contador, " Inglés: ", texto_ingles)
            spanish = llm_translation_english_spanish(texto_ingles, LLM_MODEL_TRANSLATION_ENGLISH_SPANISH)
            print(contador, " Español: ", spanish)
            #csv.writer(salida, lineterminator="").writerow([spanish])
            #standard_writer.writerow([spanish])
            csv.writer(salida, lineterminator="").writerow([spanish])
print("\nProceso Terminado!")
fin = datetime.now()
tiempo_total = fin - inicio
print("\nTiempo total: " + str(tiempo_total), "\n")