#!/usr/bin/env python3
"""
sipi_ia_spec.py - Genera un texto autocontenido ("prompt del sistema")
que se puede pegar en CUALQUIER IA (ChatGPT, Claude, Gemini, un modelo
local, lo que sea) para que aprenda a escribir SPIR (SiPi IA) sin
necesitar ningun acceso a este repositorio ni a ninguna herramienta --
solo texto plano. Es la pieza que hace que "cualquier persona pueda
agregarle SiPi IA a sus IAs": copiar este texto una vez a las
instrucciones/prompt de sistema de su asistente favorito, y listo.
"""
from sipi_ia_tabla import cargar_o_crear_tabla

try:
    import sipi as _motor
    BLOQUES_QUE_ABREN = sorted(_motor.BLOQUES_QUE_ABREN)
except Exception:
    BLOQUES_QUE_ABREN = []


_EJEMPLO_SIPI = """programa \"contador\"
variable n = 0
funcion contar_hasta(limite)
    mientras (n < limite)
        decir n
        sumar n 1
    fin
fin
llamar contar_hasta(5)
"""

_EJEMPLO_SPIR = """$0 "contador"
$5 n = 0
$i contar_hasta(limite) {
$h (n < limite) {
$9 n
$7 n 1
}
}
$j contar_hasta(5)
"""


def generar_prompt_sistema():
    comando_a_codigo, _ = cargar_o_crear_tabla()
    lineas_tabla = "\n".join(
        f"{codigo}={comando}" for comando, codigo in sorted(comando_a_codigo.items(), key=lambda x: x[1])
    )
    bloques = ", ".join(BLOQUES_QUE_ABREN)

    return f"""# SPIR - dialecto de SiPi para que vos (la IA) escribas codigo SiPi rapido

Cuando el usuario te pida escribir un programa en SiPi, escribilo en
SPIR (mas abajo se explica), no en SiPi normal. Otro programa (el
traductor SiPi IA, incluido en el editor de SiPi) convierte SPIR a SiPi
de verdad automaticamente antes de ejecutarlo o mostrarselo a un humano
-- vos NO tenes que traducirlo, solo escribirlo bien.

## Reglas de SPIR (son solo 3)

1. CADA COMANDO SE ESCRIBE CON SU CODIGO, NO CON SU NOMBRE. Por ejemplo
   'decir' se escribe '$9', 'variable' se escribe '$5'. La tabla
   completa de codigos esta al final de este mensaje. Todo lo demas en
   la linea (numeros, texto entre comillas, nombres de variables,
   operadores +, -, *, /, ==, !=, <, >, <=, >=, y/o/no, parentesis,
   comas) se escribe EXACTAMENTE igual que en SiPi normal -- eso no
   cambia.

2. LOS BLOQUES SE MARCAN CON LLAVES '{{' Y '}}', NUNCA CON LA PALABRA
   'fin'. Un comando que abre un bloque en SiPi (({bloques})) se
   escribe seguido de un espacio y '{{' al final de la linea; el bloque
   se cierra con una linea que es solo '}}'. NUNCA escribas 'fin', 'fin'
   no existe en SPIR -- lo genera el traductor.

3. 'sino' (para si/sino) y 'capturar' (para intentar/capturar) cierran
   el bloque anterior y abren el siguiente en la MISMA linea, con la
   forma: '}} $codigo resto-de-la-linea {{'. Por ejemplo, un si/sino se
   ve asi:
       $c (condicion) {{
       ...
       }} $d {{
       ...
       }}
   (donde $c es 'si' y $d es 'sino' -- confirmalo en la tabla de abajo).

4. LA INDENTACION NO IMPORTA. Los bloques ya estan marcados por las
   llaves, asi que podes escribir todo pegado al margen izquierdo sin
   ningun problema -- de hecho es preferible, ahorra caracteres.

## Ejemplo completo

Este programa SiPi normal:

```
{_EJEMPLO_SIPI}```

se escribe en SPIR asi:

```
{_EJEMPLO_SPIR}```

## Tabla completa de codigos (formato: codigo=comando_real_en_sipi)

```
{lineas_tabla}
```

Cuando termines de escribir un programa en SPIR, entregaselo al usuario
tal cual, en un bloque de codigo, aclarando que es SPIR (SiPi IA) y que
lo puede traducir a SiPi normal desde el menu Herramientas del editor
('SiPi IA -- Traductor') o con 'sipi_ia_traducir.py' si tiene el
repositorio."""


if __name__ == "__main__":
    print(generar_prompt_sistema())
