#!/usr/bin/env bash
# ZION TERMINAL - Menu de servidores SSH (com favoritos)
# Cyberdeck criado por Pablo Murad em 2026
export LC_ALL=C
. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null
CFG="$HOME/.ssh/config"
FAV="/opt/zion-terminal/config/ssh-favoritos.conf"

[ "$1" = "--help" ] && { cat <<H
Uso: zion ssh                    menu de servidores (favoritos primeiro)
     zion ssh --testar           testa latencia de todos sem conectar
     zion ssh --favoritos        lista so os favoritos
     zion ssh --favoritar <a>    marca alias como favorito
     zion ssh --desfavoritar <a> remove dos favoritos
Fonte dos hosts: ~/.ssh/config
H
exit 0; }

mapfile -t hosts < <(awk 'tolower($1)=="host" && $2!~/[*?]/{for(i=2;i<=NF;i++)print $i}' "$CFG" 2>/dev/null)
existe() { local a; for a in "${hosts[@]}"; do [ "$a" = "$1" ] && return 0; done; return 1; }
is_fav() { [ -r "$FAV" ] && grep -qxF "$1" "$FAV"; }

case "${1:-}" in
  --favoritar)
    [ -n "$2" ] || { echo "Informe o alias."; exit 2; }
    existe "$2" || { ui_err "alias '$2' nao existe em ~/.ssh/config"; exit 1; }
    is_fav "$2" && { ui_info "'$2' ja e favorito"; exit 0; }
    echo "$2" >> "$FAV" 2>/dev/null || { ui_err "sem permissao para escrever em $FAV"; exit 1; }
    ui_ok "'$2' adicionado aos favoritos"; exit 0 ;;
  --desfavoritar)
    [ -n "$2" ] || { echo "Informe o alias."; exit 2; }
    [ -w "$FAV" ] && { grep -vxF "$2" "$FAV" > "$FAV.tmp" 2>/dev/null && mv "$FAV.tmp" "$FAV"; }
    ui_ok "'$2' removido dos favoritos"; exit 0 ;;
esac

if [ ${#hosts[@]} -eq 0 ]; then
  ui_header "SERVIDORES SSH"
  ui_info "Nenhum servidor em ~/.ssh/config."
  printf '  Exemplo:\n    %bHost meuserv\n      HostName 100.x.y.z\n      User pablo%b\n' "$ZGRY" "$ZR"; exit 0
fi

# ordena: favoritos primeiro
ordenados=(); for h in "${hosts[@]}"; do is_fav "$h" && ordenados+=("$h"); done
for h in "${hosts[@]}"; do is_fav "$h" || ordenados+=("$h"); done

testar() {
  local h hn lat
  for h in "$@"; do
    hn=$(ssh -G "$h" 2>/dev/null | awk '/^hostname /{print $2}')
    lat=$(ping -c1 -W1 "$hn" 2>/dev/null | grep -o 'time=[0-9.]*' | cut -d= -f2)
    printf '  %s%b%-16s%b %-22s %b\n' "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR" || printf '  ')" "$ZWHT" "$h" "$ZR" "$hn" "$([ -n "$lat" ] && printf '%b%sms%b' "$ZOK" "$lat" "$ZR" || ui_state off)"
  done
}

[ "$1" = "--testar" ]    && { ui_header "SERVIDORES (teste)"; testar "${ordenados[@]}"; exit 0; }
[ "$1" = "--favoritos" ] && { ui_header "FAVORITOS"; f=0; for h in "${ordenados[@]}"; do is_fav "$h" && { printf '  %b★ %s%b\n' "$ZWARN" "$h" "$ZR"; f=1; }; done; [ "$f" = 0 ] && ui_info "Nenhum favorito ainda."; exit 0; }

ui_header "SERVIDORES SSH"
i=0; for h in "${ordenados[@]}"; do i=$((i+1)); printf '  %b%2d)%b %s%s\n' "$ZA" "$i" "$ZR" "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR")" "$h"; done
printf '  %b 0)%b voltar\n' "$ZA" "$ZR"
read -r -p "  Conectar em qual? " o
[ "$o" = 0 ] && exit 0
[ "$o" -ge 1 ] 2>/dev/null && [ "$o" -le ${#ordenados[@]} ] || { echo "Opcao invalida."; exit 2; }
alvo="${ordenados[$((o-1))]}"
printf '  %bConectando em %s…%b\n' "$ZP" "$alvo" "$ZR"; exec ssh "$alvo"
