#!/usr/bin/env python3
"""
sipi_ia_traducir.py - CLI standalone del traductor SPIR <-> SiPi.

Uso:
    python3 sipi_ia_traducir.py a-sipi archivo.spir [salida.sipi]
    python3 sipi_ia_traducir.py a-spir archivo.sipi [salida.spir]
    python3 sipi_ia_traducir.py prompt-ia [salida.md]
    python3 sipi_ia_traducir.py ejecutar archivo.spir   # traduce y corre de una
    python3 sipi_ia_traducir.py generar-ia "descripcion" [salida.sipi]  # la IA escribe en SPIR y se auto-corrige

Pensado para gente que integra SiPi IA en su propia IA/pipeline sin
pasar por el editor grafico -- por ejemplo, un script que recibe SPIR
de un modelo por API, lo traduce, y lo corre.
"""
import subprocess
import sys

import sipi_ia_lang as lang
from sipi_ia_spec import generar_prompt_sistema


def _leer(ruta):
    with open(ruta, "r", encoding="utf-8") as f:
        return f.read()


def _escribir(ruta, contenido):
    with open(ruta, "w", encoding="utf-8") as f:
        f.write(contenido)


def main(argv):
    if len(argv) < 2:
        print(__doc__)
        return 1

    accion = argv[1]

    if accion == "prompt-ia":
        prompt = generar_prompt_sistema()
        if len(argv) >= 3:
            _escribir(argv[2], prompt)
            print(f"Prompt guardado en {argv[2]}")
        else:
            print(prompt)
        return 0

    if accion in ("a-sipi", "a-spir"):
        if len(argv) < 3:
            print(f"Falta el archivo de entrada para '{accion}'")
            return 1
        entrada = _leer(argv[2])
        try:
            if accion == "a-sipi":
                salida = lang.traducir_a_sipi(entrada)
            else:
                salida = lang.traducir_desde_sipi(entrada)
        except lang.ErrorTraduccionSpir as e:
            print(f"[SiPi IA] Error de traduccion en la linea {e.linea}: {e}")
            return 1
        if len(argv) >= 4:
            _escribir(argv[3], salida)
            print(f"Traducido -> {argv[3]}")
        else:
            print(salida, end="")
        return 0

    if accion == "ejecutar":
        if len(argv) < 3:
            print("Falta el archivo .spir a ejecutar")
            return 1
        entrada = _leer(argv[2])
        try:
            sipi_code = lang.traducir_a_sipi(entrada)
        except lang.ErrorTraduccionSpir as e:
            print(f"[SiPi IA] Error de traduccion en la linea {e.linea}: {e}")
            return 1
        import tempfile
        import os
        with tempfile.NamedTemporaryFile(mode="w", suffix=".sipi", delete=False, encoding="utf-8") as tmp:
            tmp.write(sipi_code)
            ruta_tmp = tmp.name
        try:
            aqui = os.path.dirname(os.path.abspath(__file__))
            resultado = subprocess.run([sys.executable, os.path.join(aqui, "sipi.py"), ruta_tmp])
            return resultado.returncode
        finally:
            os.unlink(ruta_tmp)

    if accion == "generar-ia":
        if len(argv) < 3:
            print("Falta la descripcion entre comillas, ej: generar-ia \"un contador del 1 al 10\"")
            return 1
        try:
            import sipi_ia
            import sipi_ia_generador_spir as generador_spir
        except ImportError:
            print("Falta 'sipi_ia.py' / 'sipi_ia_generador_spir.py' junto a este archivo.")
            return 1
        if not sipi_ia.hay_api_key_configurada():
            print(
                "No hay ninguna clave de API configurada para SiPi IA.\n"
                "Configurala desde el editor (boton 'SiPi IA') o con la variable de entorno "
                "ANTHROPIC_API_KEY / OPENAI_API_KEY segun tu proveedor."
            )
            return 1
        import os
        aqui = os.path.dirname(os.path.abspath(__file__))
        ruta_motor = os.path.join(aqui, "sipi.py")

        def _log_intento(numero, spir, sipi_code, ok, salida, error):
            estado = "OK" if ok else ("?" if ok is None else "FALLO")
            print(f"  intento {numero}: {estado}" + (f" -- {error}" if error and not ok else ""))

        print("Generando en SPIR (mucho mas rapido que en SiPi normal) y verificando contra el motor real...")
        resultado = generador_spir.generar_con_auto_correccion_spir(
            argv[2], ruta_motor, on_intento=_log_intento,
        )
        print(f"\n{resultado.motivo_fin}\n")
        print(resultado.codigo_final)
        if len(argv) >= 4:
            _escribir(argv[3], resultado.codigo_final)
            print(f"\nGuardado en {argv[3]}")
        return 0 if resultado.exito else 1

    print(f"Accion desconocida: '{accion}'\n\n{__doc__}")
    return 1


if __name__ == "__main__":
    sys.exit(main(sys.argv))
