#!/usr/bin/env bash
# Instala o Tson Player numa TV LG (webOS) pelo Modo Desenvolvedor.
# Para Linux, macOS, Git Bash e Termux (Android: pkg install openssh curl).
# Uso: ./instalar-tv.sh [IP] [PASSPHRASE]
set -u
APP_ID="com.tson.player"
HERE="$(cd "$(dirname "$0")" && pwd)"
IPK="$HERE/tson-player.ipk"

fail() { echo; echo "ERRO: $1"; exit 1; }
step() { echo "==> $1"; }

command -v ssh >/dev/null || fail "ssh não encontrado (no Termux: pkg install openssh)."
command -v curl >/dev/null || fail "curl não encontrado (no Termux: pkg install curl)."
[ -f "$IPK" ] || fail "Pacote não encontrado: $IPK"

echo
echo "Tson Player - instalador para TV LG"
echo "Na TV: abra o app 'Developer Mode', deixe Dev Mode Status ON e ligue o Key Server."
echo

IP="${1:-}"; PASS="${2:-}"
[ -n "$IP" ] || read -r -p "IP da TV (ex.: 192.168.0.10): " IP
[ -n "$PASS" ] || read -r -p "Passphrase mostrada no Developer Mode: " PASS
echo "$IP" | grep -Eq '^[0-9]{1,3}(\.[0-9]{1,3}){3}$' || fail "IP inválido: $IP"
[ -n "$PASS" ] || fail "Passphrase vazia."

WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT
KEY="$WORK/webos_key"

step "Baixando a chave da TV (Key Server, porta 9991)"
curl -fsS -m 10 -o "$KEY" "http://$IP:9991/webos_rsa" \
  || fail "Não consegui falar com a TV em $IP:9991. Confira o IP, a rede e se o Key Server está ligado."

step "Abrindo a chave com a passphrase"
chmod 600 "$KEY"
ssh-keygen -p -P "$PASS" -N "" -m PEM -f "$KEY" >/dev/null 2>&1 \
  || fail "Passphrase incorreta (ela muda quando o Key Server é religado). Confira na TV."

SSH() {
  ssh -i "$KEY" -p 9922 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR \
    -o PubkeyAcceptedKeyTypes=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa -o ConnectTimeout=15 -o ServerAliveInterval=10 -o ServerAliveCountMax=6 "$@"
}
TARGET="prisoner@$IP"

step "Testando a conexão SSH com a TV"
[ "$(SSH "$TARGET" 'echo ok' 2>&1 | tr -d '\r')" = "ok" ] || fail "A TV recusou a conexão SSH. Verifique o Developer Mode (ON) e se a sessão não expirou."

step "Enviando o pacote"
REMOTE="/media/developer/temp/tson-player.ipk"
SSH "$TARGET" "cat > $REMOTE" < "$IPK" || fail "Falha ao enviar o pacote."

step "Instalando (acompanhe os estados abaixo)"
REMOTE_SCRIPT=$(cat <<'EOS'
APP=com.tson.player
LOG=/tmp/tson-install.log
rm -f $LOG
echo "STATE:iniciando"
luna-send-pub -i -n 80 -w 120000 luna://com.webos.appInstallService/dev/install '{"id":"com.ares.defaultName","ipkUrl":"/media/developer/temp/tson-player.ipk","subscribe":true}' </dev/null >$LOG 2>&1 &
PID=$!
i=0
last=""
while [ $i -lt 120 ]; do
  st=$(grep -o '"state":"[^"]*"' $LOG 2>/dev/null | tail -1 | sed 's/"state":"//;s/"//')
  if [ -n "$st" ] && [ "$st" != "$last" ]; then echo "STATE:$st"; last="$st"; fi
  if [ "$st" = "installed" ]; then break; fi
  if grep -q '"returnValue":false' $LOG 2>/dev/null; then echo "FALHA"; break; fi
  sleep 1
  i=$((i+1))
done
kill $PID 2>/dev/null
if [ -f /media/developer/apps/usr/palm/applications/$APP/appinfo.json ]; then
  echo "INSTALADO"
  luna-send-pub -i -n 1 -w 8000 luna://com.webos.applicationManager/launch '{"id":"com.tson.player"}' </dev/null >/dev/null 2>&1
  echo "ABERTO"
else
  echo "NAO_INSTALOU"
  tail -c 600 $LOG 2>/dev/null
fi
EOS
)
OUT="$(printf '%s\n' "$REMOTE_SCRIPT" | SSH "$TARGET" sh 2>&1 | tee /dev/stderr | tr -d '\r')"
echo "$OUT" | grep -q '^INSTALADO' || fail "A TV não confirmou a instalação. Tente de novo; se repetir, desligue e ligue o Dev Mode Status e o Key Server na TV."

step "App aberto na TV"

echo
echo "Pronto! O Tson Player foi instalado e aberto na TV."
