#!/usr/bin/env bash
# One command on Ubuntu: fetch version from EAS Hub, download bundle, run native install.
#
#   curl -fsSL 'https://asceas.ru/eas-hub/install/install-eas-from-hub.sh' | sudo bash
#   curl -fsSL '…' | sudo EAS_LANG=en EAS_ACCEPT_EULA=1 bash -s -- --accept-eula
#
# Env:
#   EAS_HUB, EAS_NATIVE_TAR_URL, EAS_ACCEPT_EULA, EAS_LANG (ru|en|de|es|…)
#
set -euo pipefail

HUB="${EAS_HUB:-https://asceas.ru/eas-hub}"
HUB="${HUB%/}"

_eas_i18n_derive_ui_lang() {
  local _raw="${EAS_LANG:-${LANG:-ru}}"
  local _lang="${_raw%%.*}"
  _lang="${_lang%%_*}"
  case "${_raw}" in
    pt_BR*|pt-BR*) _lang="pt-BR" ;;
    zh_CN*|zh-Hans*|zh_Hans*) _lang="zh-Hans" ;;
    zh_TW*|zh-Hant*|zh_Hant*) _lang="zh-Hant" ;;
  esac
  case "$_lang" in
    ru|en|es|th|id|vi|ko|fr|ar|ja|de|it|ro|pl|tr) ;;
    pt) _lang="pt-BR" ;;
    zh) _lang="zh-Hans" ;;
    *) _lang="en" ;;
  esac
  printf '%s' "$_lang"
}

_eas_i18n_bootstrap() {
  local _eas_src="" here tmp _ui
  if [[ -v BASH_SOURCE[0] ]]; then
    _eas_src="${BASH_SOURCE[0]}"
  fi
  if [[ -n "$_eas_src" ]]; then
    here="$(cd "$(dirname "$_eas_src")" 2>/dev/null && pwd || true)"
  fi
  if [[ -n "$here" && -f "$here/i18n/eas-i18n.sh" ]]; then
    # shellcheck disable=SC1091
    source "$here/i18n/eas-i18n.sh"
    return 0
  fi
  tmp="$(mktemp -d)"
  mkdir -p "$tmp/messages"
  _ui="$(_eas_i18n_derive_ui_lang)"
  if curl -fsSL "$HUB/install/i18n/eas-i18n.sh" -o "$tmp/eas-i18n.sh" 2>/dev/null \
    && curl -fsSL "$HUB/install/i18n/messages/en.txt" -o "$tmp/messages/en.txt" 2>/dev/null; then
    curl -fsSL "$HUB/install/i18n/messages/${_ui}.txt" -o "$tmp/messages/${_ui}.txt" 2>/dev/null || true
    # shellcheck disable=SC1091
    source "$tmp/eas-i18n.sh"
    if [[ -n "${EAS_UI_LANG:-}" && ! -f "$tmp/messages/${EAS_UI_LANG}.txt" ]]; then
      if curl -fsSL "$HUB/install/i18n/messages/${EAS_UI_LANG}.txt" -o "$tmp/messages/${EAS_UI_LANG}.txt" 2>/dev/null; then
        _eas_load_msg_file "$tmp/messages/${EAS_UI_LANG}.txt" || true
      fi
    fi
    return 0
  fi
  eas_msg() { printf '%s' "$1"; }
  eas_echo() { echo "$*"; }
}

_eas_i18n_bootstrap

wait_for_apt_locks() {
  local timeout_sec="${1:-600}"
  local waited=0
  while sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 \
    || sudo fuser /var/lib/apt/lists/lock >/dev/null 2>&1 \
    || sudo fuser /var/cache/apt/archives/lock >/dev/null 2>&1; do
    if (( waited >= timeout_sec )); then
      printf '%s\n' "$(eas_msg "apt_lock_timeout" | sed "s/%s/${timeout_sec}/g")"
      return 1
    fi
    printf '%s\n' "$(eas_msg "apt_lock_wait" | sed "s/%s/${waited}/g")"
    sleep 5
    waited=$((waited + 5))
  done
}

apt_get_safe() {
  local retries="${APT_RETRIES:-3}"
  local delay="${APT_RETRY_DELAY_SEC:-5}"
  local i
  for ((i=1; i<=retries; i++)); do
    wait_for_apt_locks 900
    if apt-get "$@"; then
      return 0
    fi
    if (( i < retries )); then
      printf '%s\n' "$(eas_msg "apt_retry" | sed "s/%s/${i}/;s/%s/${retries}/;s/%s/${delay}/")"
      sleep "$delay"
    fi
  done
  printf '%s\n' "$(eas_msg "apt_failed" | sed "s/%s/${retries}/;s/%s/*/")"
  return 1
}

if [[ "$(id -u)" -ne 0 ]]; then
  exec sudo env \
    EAS_HUB="${EAS_HUB:-}" \
    EAS_NATIVE_TAR_URL="${EAS_NATIVE_TAR_URL:-}" \
    EAS_ACCEPT_EULA="${EAS_ACCEPT_EULA:-}" \
    EAS_LANG="${EAS_LANG:-}" \
    LANG="${LANG:-}" \
    bash "$0" "$@"
fi

printf '%s\n' "$(eas_msg "lang_hint" | sed "s/%s/${EAS_UI_LANG:-en}/")"
printf '%s\n' "$(eas_msg "install_start" | sed "s/%s/${EAS_UI_LANG:-en}/")"

_eas_load_accept_script() {
  local candidates=() _eas_src="" here
  if [[ -v BASH_SOURCE[0] ]]; then
    _eas_src="${BASH_SOURCE[0]}"
  fi
  if [[ -n "$_eas_src" ]]; then
    here="$(cd "$(dirname "$_eas_src")" 2>/dev/null && pwd || true)"
    if [[ -n "$here" ]]; then
      candidates+=("$here/../../../scripts/eas-accept-user-agreement.sh")
    fi
  fi
  local c tmp=""
  for c in "${candidates[@]}"; do
    if [[ -f "$c" ]]; then
      printf '%s' "$c"
      return 0
    fi
  done
  tmp="$(mktemp)"
  if curl -fsSL "$HUB/install/eas-accept-user-agreement.sh" -o "$tmp" 2>/dev/null; then
    printf '%s' "$tmp"
    return 0
  fi
  rm -f "$tmp"
  return 1
}

EAS_ACCEPT_SCRIPT="$(_eas_load_accept_script || true)"
if [[ -n "$EAS_ACCEPT_SCRIPT" && -f "$EAS_ACCEPT_SCRIPT" ]]; then
  # shellcheck disable=SC1090
  source "$EAS_ACCEPT_SCRIPT"
  for arg in "$@"; do
    if [[ "$arg" == "--accept-eula" || "$arg" == "--accept-user-agreement" ]]; then
      export EAS_ACCEPT_EULA=1
      break
    fi
  done
  eas_require_user_agreement ""
else
  echo "$(eas_msg "eula_need")"
  exit 1
fi

export DEBIAN_FRONTEND=noninteractive
apt_get_safe update -qq
apt_get_safe install -y --no-install-recommends ca-certificates curl python3

if [[ -n "${EAS_NATIVE_TAR_URL:-}" ]]; then
  TAR_URL="${EAS_NATIVE_TAR_URL}"
  printf '%s\n' "$(eas_msg "native_url_mode")"
  printf '%s\n' "$(eas_msg "archive_url" | sed "s|%s|${TAR_URL}|")"
else
  MANIFEST_URL="$HUB/manifest.json"
  printf '%s\n' "$(eas_msg "fetch_manifest" | sed "s|%s|${MANIFEST_URL}|")"
  VER="$(curl -fsSL "$MANIFEST_URL" | python3 -c "import json,sys; print(json.load(sys.stdin).get('latest_version') or '')")"
  VER="$(echo "$VER" | tr -d '\r\n')"
  if [[ -z "$VER" ]]; then
    echo "$(eas_msg "no_bundle")"
    exit 1
  fi
  TAR_URL="$HUB/releases/current/eas-native-${VER}.tar.gz"
  printf '%s\n' "$(eas_msg "hub_version" | sed "s|%s|${VER}|")"
  printf '%s\n' "$(eas_msg "archive_url" | sed "s|%s|${TAR_URL}|")"
fi

echo "=== $(eas_msg "download_bundle") ==="
if ! curl -fsSL -I -o /dev/null "$TAR_URL"; then
  printf '%s\n' "$(eas_msg "download_fail" | sed "s|%s|${TAR_URL}|")"
  exit 1
fi

BOOT_URL="$HUB/install/install-eas-from-url.sh"
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT

printf '%s\n' "$(eas_msg "boot_url" | sed "s|%s|${BOOT_URL}|")"
curl -fsSL "$BOOT_URL" -o "$TMP"

printf '%s\n' "$(eas_msg "running_install")"
exec env EAS_LANG="${EAS_LANG:-}" bash "$TMP" --url "$TAR_URL" "$@"
