#!/usr/bin/env bash
# tv-language.sh – Systemsprache und App-Sprachen lesen und setzen
#
#   ./tv-language.sh get                    # aktuelle Systemsprache anzeigen
#   ./tv-language.sh set de-DE              # Systemsprache setzen (über die Hilfs-App, siehe unten)
#   ./tv-language.sh app <paket> de-DE      # Sprache EINER App setzen (ab Android 13 / API 33)
#   ./tv-language.sh app <paket>            # Sprache einer App anzeigen
#   ./tv-language.sh app <paket> reset      # App folgt wieder der Systemsprache
#   ./tv-language.sh settings               # Sprach-Einstellungen am Fernseher öffnen
#
# Warum eine Hilfs-App? „setprop persist.sys.locale“ ist der Shell ohne Root nicht erlaubt.
# Eine App mit der Berechtigung CHANGE_CONFIGURATION darf die Sprache dagegen umstellen.
# Verwendet wird „Appium Settings“ (Paket io.appium.settings, quelloffen); die APK muss vorher
# selbst installiert werden:  adb -s $TV_HOST install settings_apk-debug.apk
# Nach Gebrauch am besten wieder entfernen: adb -s $TV_HOST uninstall io.appium.settings
# Ab Android 14 (API 34) kann die Umstellung an gesperrten Schnittstellen scheitern – dann bleibt das Menü.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=tv-lib.sh
. "$SCRIPT_DIR/tv-lib.sh"

HELPER="io.appium.settings"

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

# BCP-47-Tag zerlegen: Sprache[-Schrift][-Region], z. B. de-DE, zh-Hans-CN, en.
LANG_PART=""; SCRIPT_PART=""; REGION_PART=""
parse_tag() {
  local tag=${1//_/-} rest part
  LANG_PART=""; SCRIPT_PART=""; REGION_PART=""
  LANG_PART="$(printf '%s' "${tag%%-*}" | tr '[:upper:]' '[:lower:]')"
  case "$LANG_PART" in
    [a-z][a-z]|[a-z][a-z][a-z]) ;;
    *) tv_die "Ungültiges Sprach-Tag: $1 (erwartet z. B. de-DE)" ;;
  esac
  [ "$tag" != "${tag#*-}" ] || return 0
  rest=${tag#*-}
  while [ -n "$rest" ]; do
    part=${rest%%-*}
    case "$part" in
      [A-Za-z][A-Za-z][A-Za-z][A-Za-z]) SCRIPT_PART="$part" ;;
      [A-Za-z][A-Za-z]) REGION_PART="$(printf '%s' "$part" | tr '[:lower:]' '[:upper:]')" ;;
      [0-9][0-9][0-9]) REGION_PART="$part" ;;
      *) tv_die "Ungültiges Sprach-Tag: $1 (erwartet z. B. de-DE)" ;;
    esac
    [ "$rest" != "${rest#*-}" ] || break
    rest=${rest#*-}
  done
}

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

case "$cmd" in
  get)
    tv_connect
    printf 'persist.sys.locale : %s\n' "$(tv_out getprop persist.sys.locale)"
    printf 'system_locales     : %s\n' "$(tv_out settings get system system_locales)"
    printf 'ro.product.locale  : %s\n' "$(tv_out getprop ro.product.locale)"
    ;;
  set)
    [ $# -eq 1 ] || usage 1
    parse_tag "$1"
    [ -n "$REGION_PART" ] || tv_die "Für die Systemsprache Sprache UND Region angeben, z. B. de-DE."
    tv_connect
    tv_load_packages
    [ "$(tv_pkg_state "$HELPER")" = "aktiv" ] \
      || tv_die "Hilfs-App $HELPER ist nicht installiert (siehe Kopf dieses Skripts)."
    tv_shell pm grant "$HELPER" android.permission.CHANGE_CONFIGURATION
    if [ -n "$SCRIPT_PART" ]; then
      tv_shell am broadcast -a io.appium.settings.locale \
        -n io.appium.settings/.receivers.LocaleSettingReceiver \
        --es lang "$LANG_PART" --es country "$REGION_PART" --es script "$SCRIPT_PART"
    else
      tv_shell am broadcast -a io.appium.settings.locale \
        -n io.appium.settings/.receivers.LocaleSettingReceiver \
        --es lang "$LANG_PART" --es country "$REGION_PART"
    fi
    sleep 2
    printf 'persist.sys.locale : %s\n' "$(tv_out getprop persist.sys.locale)"
    ;;
  app)
    [ $# -ge 1 ] || usage 1
    pkg=$1
    tv_valid_package "$pkg" || tv_die "Ungültiger Paketname: $pkg"
    tv_connect
    sdk="$(tv_sdk)"
    [ "${sdk:-0}" -ge 33 ] || tv_die "App-Sprachen gibt es erst ab Android 13 (API 33); dieses Gerät meldet API $sdk."
    tv_load_packages
    [ "$(tv_pkg_state "$pkg")" = "aktiv" ] || tv_die "Paket $pkg ist auf dem Gerät nicht aktiv."
    case "${2:-}" in
      "") tv_out cmd locale get-app-locales "$pkg" --user "$TV_USER" ;;
      reset) tv_shell cmd locale set-app-locales "$pkg" --user "$TV_USER" ;;
      *)
        parse_tag "$2"
        tv_shell cmd locale set-app-locales "$pkg" --user "$TV_USER" --locales "${2//_/-}"
        tv_out cmd locale get-app-locales "$pkg" --user "$TV_USER" ;;
    esac
    ;;
  settings)
    tv_connect
    # Öffnet die Sprachauswahl; kennt die Oberfläche die Aktion nicht, die allgemeinen Einstellungen.
    tv_shell am start -a android.settings.LOCALE_SETTINGS \
      || tv_shell am start -a android.settings.SETTINGS
    ;;
  -h|--help|help) usage 0 ;;
  *) usage 1 ;;
esac
