#!/usr/bin/env bash
set -Eeuo pipefail

CONFIG_FILE="${SALSABIL_TV_CONFIG:-/etc/salsabil-tv/config}"
LOG_TAG="salsabil-tv"

log(){ printf '%s %s\n' "$(date --iso-8601=seconds)" "$*" | systemd-cat -t "$LOG_TAG" 2>/dev/null || printf '%s\n' "$*"; }
fail(){ log "ERREUR: $*"; exit 1; }

[[ -r "$CONFIG_FILE" ]] || fail "Configuration introuvable: $CONFIG_FILE"
# shellcheck disable=SC1090
source "$CONFIG_FILE"
: "${TV_URL:?TV_URL manquante}"

NETWORK_CHECK_URL="${NETWORK_CHECK_URL:-https://alqiyam.salsabil.cm/}"
NETWORK_RETRY_SECONDS="${NETWORK_RETRY_SECONDS:-5}"
CHROMIUM_RESTART_DELAY="${CHROMIUM_RESTART_DELAY:-3}"
STARTUP_GRACE_SECONDS="${STARTUP_GRACE_SECONDS:-8}"
ENABLE_SPLASH="${ENABLE_SPLASH:-1}"
PERSIST_CHROMIUM_PROFILE="${PERSIST_CHROMIUM_PROFILE:-1}"
EXTRA_CHROMIUM_ARGS="${EXTRA_CHROMIUM_ARGS:-}"
LOW_DATA_MODE="${LOW_DATA_MODE:-1}"
ENABLE_OFFLINE_PLAYER="${ENABLE_OFFLINE_PLAYER:-1}"

find_chromium(){
  command -v chromium 2>/dev/null || command -v chromium-browser 2>/dev/null || return 1
}
CHROMIUM_BIN="$(find_chromium)" || fail "Chromium n'est pas installé"

export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
if [[ -z "${WAYLAND_DISPLAY:-}" ]] && compgen -G "$XDG_RUNTIME_DIR/wayland-*" >/dev/null; then
  export WAYLAND_DISPLAY="$(basename "$(ls "$XDG_RUNTIME_DIR"/wayland-* | head -n1)")"
fi
if [[ -z "${DISPLAY:-}" ]] && [[ -S /tmp/.X11-unix/X0 ]]; then export DISPLAY=:0; fi

PROFILE_DIR="${HOME}/.local/share/salsabil-tv/chromium"
if [[ "$PERSIST_CHROMIUM_PROFILE" != "1" ]]; then PROFILE_DIR="/tmp/salsabil-tv-chromium-${UID}"; fi
mkdir -p "$PROFILE_DIR"

COMMON_ARGS=(
  --kiosk --start-maximized --noerrdialogs --disable-infobars --no-first-run
  --disable-session-crashed-bubble --disable-features=Translate,MediaRouter
  --disable-component-update --disable-default-apps --disable-prompt-on-repost
  --autoplay-policy=no-user-gesture-required --check-for-update-interval=31536000
  --password-store=basic --use-mock-keychain --hide-scrollbars
  --disk-cache-size=536870912 --media-cache-size=67108864
  --user-data-dir="$PROFILE_DIR"
)

if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then
  COMMON_ARGS+=(--ozone-platform-hint=auto)
fi

# Empêche la veille système pendant l'exécution du kiosque.
INHIBIT=(systemd-inhibit --what=idle:sleep:handle-lid-switch --who="Salsabil Screen" --why="Affichage TV actif" --mode=block)

apply_display_settings(){
  if [[ -n "${DISPLAY:-}" ]] && command -v xset >/dev/null 2>&1; then
    xset s off -dpms s noblank >/dev/null 2>&1 || true
  fi
}

network_ready(){
  curl -fsSIL --connect-timeout 4 --max-time 8 "$NETWORK_CHECK_URL" >/dev/null 2>&1
}

append_query_parameter(){
  local url="$1" key="$2" value="$3"
  if [[ "$url" == *"${key}="* ]]; then printf '%s' "$url"; return; fi
  if [[ "$url" == *"?"* ]]; then printf '%s&%s=%s' "$url" "$key" "$value"; else printf '%s?%s=%s' "$url" "$key" "$value"; fi
}

if [[ "$LOW_DATA_MODE" == "1" ]]; then
  TV_URL="$(append_query_parameter "$TV_URL" low_data 1)"
fi

launch_url(){
  local url="$1"
  # EXTRA_CHROMIUM_ARGS volontairement découpé en arguments shell simples.
  # shellcheck disable=SC2206
  local extra=( $EXTRA_CHROMIUM_ARGS )
  apply_display_settings
  log "Lancement Chromium: $url"
  "${INHIBIT[@]}" "$CHROMIUM_BIN" "${COMMON_ARGS[@]}" "${extra[@]}" "$url"
}

mkdir -p "${HOME}/.local/state/salsabil-tv"
log "Démarrage pour ${SCREEN_NAME:-écran Salsabil}"
sleep "$STARTUP_GRACE_SECONDS"

while true; do
  if ! network_ready; then
    if [[ "$ENABLE_OFFLINE_PLAYER" == "1" ]]; then
      log "Réseau indisponible : tentative du player mis en cache et du planning local."
    else
      log "Réseau indisponible, attente..."
      if [[ "$ENABLE_SPLASH" == "1" ]]; then
        launch_url "file:///opt/salsabil-tv/assets/splash.html" &
        splash_pid=$!
      else
        splash_pid=""
      fi
      until network_ready; do sleep "$NETWORK_RETRY_SECONDS"; done
      if [[ -n "${splash_pid:-}" ]]; then
        pkill -TERM -P "$splash_pid" >/dev/null 2>&1 || true
        kill "$splash_pid" >/dev/null 2>&1 || true
        wait "$splash_pid" 2>/dev/null || true
      fi
      sleep 1
    fi
  fi

  launch_url "$TV_URL" || exit_code=$?
  exit_code="${exit_code:-0}"
  log "Chromium terminé (code $exit_code), redémarrage dans ${CHROMIUM_RESTART_DELAY}s"
  unset exit_code
  sleep "$CHROMIUM_RESTART_DELAY"
done
