#!/usr/bin/env python3
"""Pasa JARVIS a castellano: voz, idioma y personalidad.

    flatpak run --command=python3 io.github.qwersyk.Newelle//master \
        ~/COFRE/CODERS/JARVIS/config/set_castellano.py

La voz es em_alex, la mas grave de las dos masculinas en español que trae
Kokoro. Medido con las muestras de comparar_voces_es.py:

    em_alex        129 Hz
    em_alex grave  117 Hz   <- elegida
    em_santa       140 Hz
    em_santa grave 132 Hz

El descenso de tono no va aqui sino en la cadena de audio (tts.py), porque se
aplica a la reproduccion y no a la seleccion de voz. Se ajusta con
JARVIS_TTS_GRAVEDAD.

Sustituye la personalidad inglesa en vez de añadir otra: dos personalidades
activas se pisan y el modelo acaba mezclando idiomas.
"""
import json
import sys

from gi.repository import Gio

SCHEMA = "io.github.qwersyk.Newelle"
VOZ = "em_alex"
CLAVE = "jarvis_persona"

TEXTO = """Eres JARVIS, un asistente de voz que funciona entero en esta maquina.

Como hablas:
- En castellano, siempre. Registro sobrio y contenido, sin efusividad.
- Trata al usuario de usted y llamale SIEMPRE "señor". En la primera
  frase de cada respuesta, sin excepcion.
- Se breve: una o dos frases salvo que te pidan detalle. Lo que dices se
  escucha en voz alta, y los parrafos largos son insufribles de oir.
- No anuncies lo que vas a hacer. Hazlo y di como ha quedado.
- Ironia seca de vez en cuando. Nunca servil, nunca efusivo.

Que dices:
- Tienes acceso real a esta maquina. Antes que suponer, comprueba: si te
  preguntan por el disco, la memoria, los procesos o la grafica, ejecuta el
  comando y responde con la cifra de verdad.
- Di los numeros redondeados y en palabras: "quedan 846 gigabytes", no
  "846.3 GiB disponibles en /dev/nvme0n1p2".
- Si algo va a borrar datos, cambiar la configuracion del sistema o necesita
  sudo, di lo que va a hacer y espera confirmacion.
- Si no lo sabes, dilo en una frase. No especules.
- Ejemplos del tono: "Enseguida, señor." / "Quedan 774 gigabytes, señor." /
  "No he podido, señor: el disco esta desmontado."
- Si ves algo raro en la maquina, mencionalo aunque no te pregunten."""

ENTRADA = {
    "key": CLAVE,
    "text": TEXTO,
    "title": "JARVIS",
    "description": ("Castellano, trata de señor, registro sobrio, respuestas "
                    "breves para voz, comprueba en vez de suponer"),
}


def main():
    settings = Gio.Settings.new(SCHEMA)

    # voz
    try:
        voces = json.loads(settings.get_string("tts-voice") or "{}")
    except json.JSONDecodeError:
        voces = {}
    voces.setdefault("kokoro", {})["voice"] = VOZ
    settings.set_string("tts-voice", json.dumps(voces))

    # personalidad, sustituyendo la que hubiera con la misma clave
    try:
        prompts = json.loads(settings.get_string("user-custom-prompts") or "[]")
    except json.JSONDecodeError:
        prompts = []
    prompts = [p for p in prompts if p.get("key") != CLAVE]
    prompts.append(ENTRADA)
    settings.set_string("user-custom-prompts", json.dumps(prompts))

    Gio.Settings.sync()

    # releer de gsettings, no fiarse de lo que acabamos de escribir
    voz = json.loads(settings.get_string("tts-voice")).get("kokoro", {}).get("voice")
    guardados = json.loads(settings.get_string("user-custom-prompts"))
    entrada = next((p for p in guardados if p.get("key") == CLAVE), None)

    print(f"voz:          {voz}")
    print(f"personalidad: {'castellano' if entrada and 'castellano' in entrada['text'] else '?'}")

    ok = voz == VOZ and entrada is not None and entrada["text"] == TEXTO
    print("verificado" if ok else "FALLO: no quedo como se pidio")
    return 0 if ok else 1


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