#!/usr/bin/env bash
# tv-remote.sh – Fernbedienung per ADB: Tasten, Text, Lautstärke, HDMI-Eingang, Makros
#
#   ./tv-remote.sh key HOME                 # eine Taste (Name ohne/mit KEYCODE_ oder Zahl)
#   ./tv-remote.sh key DPAD_DOWN DPAD_DOWN DPAD_CENTER
#   ./tv-remote.sh long DPAD_CENTER         # lange drücken (--longpress)
#   ./tv-remote.sh text "Hallo Welt"        # Text in das fokussierte Eingabefeld
#   ./tv-remote.sh volume 10                # Medienlautstärke auf Index 10 setzen
#   ./tv-remote.sh volume                   # aktuelle Lautstärke ausgeben
#   ./tv-remote.sh hdmi 2                   # KEYCODE_TV_INPUT_HDMI_2 senden (geräteabhängig)
#   ./tv-remote.sh macro HOME wait:1 DPAD_RIGHT wait:0.5 DPAD_CENTER
#   ./tv-remote.sh keys                     # die wichtigsten Tastennamen auflisten
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=tv-lib.sh
. "$SCRIPT_DIR/tv-lib.sh"

usage() { sed -n '2,13p' "$0" | sed 's/^# \{0,1\}//'; exit "${1:-0}"; }

# Tastennamen vereinheitlichen: home → KEYCODE_HOME, 3 bleibt 3.
keyname() {
  local k
  k="$(printf '%s' "$1" | tr '[:lower:]' '[:upper:]')"
  case "$k" in
    ""|*[!A-Z0-9_]*) tv_die "Ungültige Taste: $1" ;;
    KEYCODE_*) printf '%s' "$k" ;;
    *[!0-9]*) printf 'KEYCODE_%s' "$k" ;;
    *) printf '%s' "$k" ;;
  esac
}

# Erst zuweisen, dann senden: so bricht eine ungültige Taste das Skript wirklich ab.
send_key() {
  local code
  code="$(keyname "$1")"
  tv_shell input keyevent "$code"
}

cmd="${1:-}"
[ -n "$cmd" ] || usage 1
shift

case "$cmd" in
  key)
    [ $# -ge 1 ] || usage 1
    tv_connect
    for k in "$@"; do send_key "$k"; done
    ;;
  long)
    [ $# -eq 1 ] || usage 1
    code="$(keyname "$1")"
    tv_connect
    tv_shell input keyevent --longpress "$code"
    ;;
  text)
    [ $# -eq 1 ] || usage 1
    tv_connect
    # „input text“ kennt kein Leerzeichen als Argument: %s steht für ein Leerzeichen.
    t=${1// /%s}
    tv_shell input text "$(tv_quote "$t")"
    ;;
  volume)
    tv_connect
    if [ $# -eq 0 ]; then
      tv_out media volume --stream 3 --get
    else
      case "$1" in *[!0-9]*|"") tv_die "Lautstärke als ganze Zahl angeben." ;; esac
      # Stream 3 = AudioManager.STREAM_MUSIC; der Höchstwert ist geräteabhängig.
      tv_shell media volume --show --stream 3 --set "$1"
    fi
    ;;
  hdmi)
    case "${1:-}" in
      1|2|3|4) tv_connect; send_key "TV_INPUT_HDMI_$1" ;;
      *) tv_die "HDMI-Eingang 1 bis 4 angeben." ;;
    esac
    ;;
  macro)
    [ $# -ge 1 ] || usage 1
    tv_connect
    for step in "$@"; do
      case "$step" in
        wait:*) sleep "${step#wait:}" ;;
        *) send_key "$step" ;;
      esac
    done
    ;;
  keys)
    cat <<'KEYS'
DPAD_UP DPAD_DOWN DPAD_LEFT DPAD_RIGHT DPAD_CENTER
HOME BACK MENU SETTINGS SEARCH
VOLUME_UP VOLUME_DOWN VOLUME_MUTE
POWER SLEEP WAKEUP
MEDIA_PLAY_PAUSE MEDIA_PLAY MEDIA_PAUSE MEDIA_STOP MEDIA_NEXT MEDIA_PREVIOUS
MEDIA_REWIND MEDIA_FAST_FORWARD
TV_INPUT TV_INPUT_HDMI_1 TV_INPUT_HDMI_2 TV_INPUT_HDMI_3 TV_INPUT_HDMI_4
CHANNEL_UP CHANNEL_DOWN GUIDE INFO
KEYS
    ;;
  -h|--help|help) usage 0 ;;
  *) usage 1 ;;
esac
