#!/usr/bin/env bash
# Utilidades compartidas por las pruebas del verde. No se ejecuta suelto.
#
# Misma forma que pruebas/comun.sh del naranja —comprueba, afirma, resumen— para
# que las dos suites se lean igual. Lo que cambia es a QUE se le pregunta: alli
# es gsettings dentro de un flatpak, aqui es un YAML, ollama y un binario.
#
# Ninguna prueba de esta carpeta abre el TUI ni habla por el altavoz.

RAIZ=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")/../.." && pwd)
VERDE=$RAIZ/verde
CONFIG=$HOME/.hermes/config.yaml
HERMES=$HOME/.hermes
OLLAMA=${OLLAMA_URL:-http://127.0.0.1:11434}
MODELO=qwen3.5:4b-verde
NARANJA=qwen3.5:4b-jarvis

TMP=${TMPDIR:-/tmp}/jarvis-verde-pruebas
mkdir -p "$TMP"

_ok=0
_fallo=0

verde()  { printf '\033[32m%s\033[0m' "$1"; }
rojo()   { printf '\033[31m%s\033[0m' "$1"; }
gris()   { printf '\033[90m%s\033[0m' "$1"; }

# comprueba <descripcion> <valor obtenido> <valor esperado>
comprueba() {
    local desc=$1 obtenido=$2 esperado=$3
    if [ "$obtenido" = "$esperado" ]; then
        printf '  %s %s\n' "$(verde OK)" "$desc"
        _ok=$((_ok + 1))
    else
        printf '  %s %s\n' "$(rojo FALLO)" "$desc"
        printf '        esperado: %s\n        obtenido: %s\n' "$esperado" "$obtenido"
        _fallo=$((_fallo + 1))
    fi
}

# afirma <descripcion> <comando...>  — pasa si el comando devuelve 0
afirma() {
    local desc=$1; shift
    if "$@" >/dev/null 2>&1; then
        printf '  %s %s\n' "$(verde OK)" "$desc"
        _ok=$((_ok + 1))
    else
        printf '  %s %s\n' "$(rojo FALLO)" "$desc"
        printf '        fallo: %s\n' "$*"
        _fallo=$((_fallo + 1))
    fi
}

# menor_que <descripcion> <valor> <tope>
menor_que() {
    local desc=$1 valor=$2 tope=$3
    if awk "BEGIN{exit !($valor < $tope)}"; then
        printf '  %s %s %s\n' "$(verde OK)" "$desc" "$(gris "($valor < $tope)")"
        _ok=$((_ok + 1))
    else
        printf '  %s %s %s\n' "$(rojo FALLO)" "$desc" "$(gris "($valor >= $tope)")"
        _fallo=$((_fallo + 1))
    fi
}

# mayor_que <descripcion> <valor> <suelo>
mayor_que() {
    local desc=$1 valor=$2 suelo=$3
    if awk "BEGIN{exit !($valor > $suelo)}"; then
        printf '  %s %s %s\n' "$(verde OK)" "$desc" "$(gris "($valor > $suelo)")"
        _ok=$((_ok + 1))
    else
        printf '  %s %s %s\n' "$(rojo FALLO)" "$desc" "$(gris "($valor <= $suelo)")"
        _fallo=$((_fallo + 1))
    fi
}

titulo() { printf '\n\033[1m%s\033[0m\n' "$1"; }

nota() { printf '  %s %s\n' "$(gris '·')" "$1"; }

resumen() {
    printf '\n  %s pasan · %s fallan\n' "$(verde $_ok)" \
        "$([ $_fallo -eq 0 ] && gris 0 || rojo $_fallo)"
    [ $_fallo -eq 0 ]
}

# Lo que ocupa la tarjeta ahora mismo, en MiB.
vram() { nvidia-smi --query-gpu=memory.used --format=csv,noheader 2>/dev/null | tr -d ' MiB'; }

# Un parametro del Modelfile tal y como lo tiene ollama guardado. Se pregunta a
# ollama y no al fichero del repo: el Modelfile del repo es la intencion, esto
# es lo que de verdad se va a cargar. arrancar.sh recrea el modelo al medir el
# techo de contexto, asi que los dos pueden diferir legitimamente.
parametro() {   # $1 = modelo   $2 = parametro
    ollama show --modelfile "$1" 2>/dev/null \
        | awk -v p="$2" '$1=="PARAMETER" && $2==p {print $3; exit}'
}

# El bloque model: del config.yaml, PARSEADO. Nunca leido con grep: el fichero
# declara provider y base_url dos veces dentro de model: y en YAML gana la
# ultima. Leyendolo parecia local y el trafico salia por OpenRouter.
config_model() {   # $1 = clave
    python3 -c "
import yaml, sys
try:
    print(yaml.safe_load(open('$CONFIG'))['model'].get('$1', ''))
except Exception as e:
    print('ERROR:', e)
" 2>/dev/null | tr -d '\n'
}
