#!/usr/bin/env bash
# Recorre el catalogo grupo por grupo, en voz alta y a ritmo de mirar.
#
# Distinto de demo_en_directo.sh: aquel probaba once acciones sueltas; este
# recorre TODOS los grupos con una muestra representativa de cada uno, anuncia
# el grupo antes de entrar, y deja pausas para que se pueda seguir en pantalla.
#
# Lo destructivo y lo que pide root no se ejecuta: en uso normal eso pasa por
# un dialogo que aprueba una persona.
#
#   ./recorrido.sh              todo, con voz
#   ./recorrido.sh --mudo       sin voz
#   ./recorrido.sh sistema      solo un grupo
set -uo pipefail
RAIZ=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")/.." && pwd)
CATALOGO=$RAIZ/newelle/data/acciones/acciones.json
MUDO=no; SOLO=""
for a in "$@"; do
  case "$a" in --mudo) MUDO=si;; *) SOLO=$a;; esac
done
WAV=$(mktemp --suffix=.wav); trap 'rm -f "$WAV"' EXIT

dice() {
  [ "$MUDO" = si ] && { sleep 0.4; return 0; }
  "$RAIZ/config/jarvis-voz.sh" "$WAV" "$1" >/dev/null 2>&1
  # < /dev/null: si no, se comen la entrada del bucle que los llama
  [ -s "$WAV" ] && { paplay "$WAV" </dev/null 2>/dev/null || aplay -q "$WAV" </dev/null 2>/dev/null; }
}

campo() { python3 -c "
import json,sys
d=json.load(open('$CATALOGO',encoding='utf-8'))
for a in d.get('acciones', d if isinstance(d,list) else []):
    if a['id']==sys.argv[1]: print(a.get(sys.argv[2],'') or ''); break
" "$1" "$2"; }

# grupo|id|frase que se diria|argumento
RECORRIDO='
sistema|disco_libre|cuanto espacio queda|
sistema|memoria|cuanta memoria|
sistema|temperatura|que temperatura hay|
sistema|uptime|cuanto lleva encendido|
sistema|procesos_top|que esta consumiendo|
sistema|red_ip|cual es mi ip|
sistema|red_wifi|a que wifi estoy conectado|
sistema|gpu_procesos|que usa la grafica|
sistema|pantallas|cuantas pantallas hay|
sistema|captura_pantalla|hazme una captura|
sistema|terminal_abrir|abre una terminal|
sistema|videos_listar|que peliculas tengo|
ficheros|buscar_fichero|busca el fichero README|README.md
ficheros|grep_recursivo|busca la palabra JARVIS|JARVIS
ficheros|tamano_carpeta|cuanto ocupa la carpeta config|'"$RAIZ"'/config
ficheros|descargas_listar|que hay en descargas|
oasis|oasis_corriendo|esta oasis funcionando|
oasis|oasis_conexiones|cuantos pubs hay conectados|
pentest|mis_puertos|que puertos tengo abiertos yo|
ventanas|ventanas_listar|que ventanas tengo abiertas|
ventanas|ventana_izquierda|pon la ventana a la izquierda|
ventanas|ventana_derecha|manda la ventana a la derecha|
ventanas|ventana_centrar|centra la ventana activa|
ventanas|ventana_maximizar|maximiza la ventana activa|
ventanas|ventana_restaurar|restaura la ventana activa|
ventanas|ventana_a_pantalla|manda la ventana a la pantalla uno|uno
'

grupo_actual=""
n=0
while IFS='|' read -r -u 3 grupo id frase argumento; do
  [ -z "${grupo:-}" ] && continue
  [ -n "$SOLO" ] && [ "$SOLO" != "$grupo" ] && continue

  if [ "$grupo" != "$grupo_actual" ]; then
    grupo_actual=$grupo
    printf '\n\n\033[1m  ══ grupo: %s ══\033[0m\n' "$grupo"
    dice "Grupo $grupo, señor."
    sleep 0.6
  fi

  comando=$(campo "$id" comando)
  [ -z "$comando" ] && { printf '  (%s no existe en el catalogo)\n' "$id"; continue; }
  acuse=$(campo "$id" acuse)
  plantilla=$(campo "$id" respuesta)

  n=$((n+1))
  printf '\n  %2d. tu: "%s"\n' "$n" "$frase"
  printf '      jarvis: %s\n' "$acuse"
  dice "$acuse"

  real=${comando//\{argumento\}/$(printf '%q' "${argumento:-}")}
  salida=$(timeout 40 bash -lc "$real" </dev/null 2>&1 | head -6)

  if [ -n "$salida" ]; then
    echo "$salida" | sed 's/^/          /' | cut -c1-104
  else
    printf '          (hecho, sin salida)\n'
  fi

  # decir la respuesta si la plantilla se puede resolver
  if [ -n "$plantilla" ] && [ -n "$salida" ]; then
    ultima=$(echo "$salida" | tail -1); primera=$(echo "$salida" | head -1)
    lineas=$(echo "$salida" | wc -l)
    h=${plantilla//\{ultima\}/$ultima}; h=${h//\{primera\}/$primera}
    h=${h//\{lineas\}/$lineas}; h=${h//\{salida\}/$salida}
    case "$h" in
      *"{"*) ;;
      *) [ ${#h} -lt 170 ] && { printf '      jarvis: %s\n' "$h"; dice "$h"; };;
    esac
  fi
  sleep 1.5
done 3<<< "$RECORRIDO"

printf '\n\n  ── %d acciones mostradas ──\n' "$n"
dice "Recorrido terminado, señor."
