#!/bin/sh
# netspeedtest appmarket-lite installer for iKuaiOS devices.
# Installs under /etc/log/apps only; does not require the official app market.
set -u

APP="netspeedtest"
VERSION="1.1.0"
ARCH_NAME="$(uname -m 2>/dev/null || echo unknown)"
case "$ARCH_NAME" in
  x86_64|amd64) ARCH_PKG="amd64" ;;
  aarch64|arm64) ARCH_PKG="arm64" ;;
  *)
    if grep -q '^ARCH=arm' /etc/release 2>/dev/null; then ARCH_PKG="arm64"; else ARCH_PKG="amd64"; fi
    ;;
esac
BASE_URL="https://dl.naixi.net/ikuai/apps"
PKG_URL="${BASE_URL}/${APP}-${ARCH_PKG}-${VERSION}.ipkg?t=$(date +%s)"
ROOT="/etc/log/apps"
APP_ROOT="$ROOT/$APP"
PKG_DIR="$APP_ROOT/.pkg"
TMP_DIR="/tmp/${APP}-lite.$$"
PORT="${APP_PORT_WEB:-8765}"
USER_NAME="${WEB_USER:-admin}"
USER_PASS="${WEB_PASSWORD:-ikuai8.com}"
WAN_THREADS_VALUE="${WAN_THREADS:-4}"
case "$WAN_THREADS_VALUE" in
  ''|*[!0-9]*) WAN_THREADS_VALUE=4 ;;
  *) [ "$WAN_THREADS_VALUE" -ge 1 ] 2>/dev/null && [ "$WAN_THREADS_VALUE" -le 64 ] 2>/dev/null || WAN_THREADS_VALUE=4 ;;
esac
WAN_INTERFACE_VALUE="${INTERFACES:-auto}"

log() { printf '[netspeedtest-lite] %s\n' "$*"; }
die() { log "ERROR: $*"; exit 1; }

fetch() {
  url="$1"
  out="$2"
  if command -v curl >/dev/null 2>&1; then
    curl -fL --connect-timeout 15 --max-time 120 -o "$out" "$url"
  elif command -v wget >/dev/null 2>&1; then
    wget -T 120 -t 2 -O "$out" "$url"
  else
    die "curl/wget not found"
  fi
}

kill_netspeedtest() {
  ps 2>/dev/null | awk '/netspeedtest/ && !/awk/ {print $1}' | while read pid; do
    case "$pid" in ''|*[!0-9]*) : ;; *) kill "$pid" >/dev/null 2>&1 || true ;; esac
  done
  sleep 1
  ps 2>/dev/null | awk '/netspeedtest/ && !/awk/ {print $1}' | while read pid; do
    case "$pid" in ''|*[!0-9]*) : ;; *) kill -9 "$pid" >/dev/null 2>&1 || true ;; esac
  done
}

get_lan_ip() {
  ip -4 addr show lan1 2>/dev/null | awk '/inet /{sub(/\/.*/,"",$2); print $2; exit}'
  return 0
}

LAN_IP="$(get_lan_ip)"
[ -n "$LAN_IP" ] || LAN_IP="$(ip -4 route get 223.5.5.5 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="src") {print $(i+1); exit}}')"
[ -n "$LAN_IP" ] || LAN_IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
[ -n "$LAN_IP" ] || LAN_IP="$(awk -F= '$1=="DEFAULT_IP"{print $2; exit}' /etc/release 2>/dev/null)"
[ -n "$LAN_IP" ] || LAN_IP="192.168.9.1"

log "target root: $ROOT"
log "detected arch: $ARCH_NAME -> package: $ARCH_PKG"
mkdir -p "$ROOT" || die "cannot create $ROOT"
[ -w "$ROOT" ] || die "$ROOT not writable"

rm -rf "$TMP_DIR"
mkdir -p "$TMP_DIR" || die "cannot create temp dir"
trap 'rm -rf "$TMP_DIR"' EXIT

log "download: $PKG_URL"
fetch "$PKG_URL" "$TMP_DIR/$APP.ipkg" || die "download failed"

log "extract package"
mkdir -p "$TMP_DIR/extract" || die "cannot create extract dir"
tar xzf "$TMP_DIR/$APP.ipkg" -C "$TMP_DIR/extract" || die "extract failed"
PKG_TOP="$(find "$TMP_DIR/extract" -mindepth 1 -maxdepth 1 -type d | head -1)"
[ -n "$PKG_TOP" ] || die "package top-level dir not found"
[ -d "$PKG_TOP/app" ] || die "package app dir not found: $PKG_TOP"

log "stop old instance if present"
if [ -x "$PKG_DIR/scripts/stop.sh" ]; then
  sh "$PKG_DIR/scripts/stop.sh" >/dev/null 2>&1 || true
fi
if [ -f "$PKG_DIR/app/cache/netspeedtest.pid" ]; then
  oldpid="$(cat "$PKG_DIR/app/cache/netspeedtest.pid" 2>/dev/null || true)"
  case "$oldpid" in ''|*[!0-9]*) : ;; *) kill "$oldpid" >/dev/null 2>&1 || true ;; esac
fi
kill_netspeedtest

log "install to $PKG_DIR"
rm -rf "$PKG_DIR"
mkdir -p "$PKG_DIR" "$APP_ROOT/log" || die "cannot create app dir"
cp -a "$PKG_TOP/." "$PKG_DIR/" || die "copy package failed"

chmod +x "$PKG_DIR/scripts/start.sh" "$PKG_DIR/scripts/stop.sh" 2>/dev/null || true
chmod +x "$PKG_DIR/app/bin/"* 2>/dev/null || true
mkdir -p "$PKG_DIR/app/cache" "$PKG_DIR/app/data" "$APP_ROOT/log"

log "write runtime environment: HOST_IP=$LAN_IP PORT=$PORT"
{
  echo "HOST_IP=$LAN_IP"
  echo "APP_PORT_WEB=$PORT"
  echo "APP_WEB_LOGIN_URI=/"
  echo "WEB_USER=$USER_NAME"
  echo "WEB_PASSWORD=$USER_PASS"
  echo "WAN_THREADS=$WAN_THREADS_VALUE"
  echo "INTERFACES=$WAN_INTERFACE_VALUE"
} > "$PKG_DIR/app/environment"

{
  echo "APP_PORT_WEB=$PORT"
  echo "APP_WEB_LOGIN_URI=/"
  echo "WEB_USER=$USER_NAME"
  echo "WEB_PASSWORD=$USER_PASS"
  echo "WAN_THREADS=$WAN_THREADS_VALUE"
  echo "INTERFACES=$WAN_INTERFACE_VALUE"
} > "$PKG_DIR/app/.env"

cat > "$APP_ROOT/netspeedtestctl" <<'CTL'
#!/bin/sh
APP="netspeedtest"
APP_ROOT="/etc/log/apps/$APP"
PKG_DIR="$APP_ROOT/.pkg"
case "$1" in
  start) sh "$PKG_DIR/scripts/start.sh" ;;
  stop) sh "$PKG_DIR/scripts/stop.sh"; ps 2>/dev/null | awk '/netspeedtest/ && !/awk/ {print $1}' | while read p; do kill "$p" 2>/dev/null || true; done ;;
  restart) sh "$PKG_DIR/scripts/stop.sh"; ps 2>/dev/null | awk '/netspeedtest/ && !/awk/ {print $1}' | while read p; do kill "$p" 2>/dev/null || true; done; sh "$PKG_DIR/scripts/start.sh" ;;
  status)
    if [ -f "$PKG_DIR/app/cache/netspeedtest.pid" ]; then
      pid=$(cat "$PKG_DIR/app/cache/netspeedtest.pid")
      if kill -0 "$pid" 2>/dev/null; then echo "running pid=$pid"; exit 0; fi
    fi
    echo "stopped"; exit 1 ;;
  url)
    . "$PKG_DIR/app/environment" 2>/dev/null || true
    echo "http://${HOST_IP:-192.168.9.1}:${APP_PORT_WEB:-8765}${APP_WEB_LOGIN_URI:-/}" ;;
  log) tail -n 80 "$PKG_DIR/log/run.log" 2>/dev/null || tail -n 80 "$APP_ROOT/log/run.log" 2>/dev/null || true ;;
  *) echo "usage: $0 {start|stop|restart|status|url|log}"; exit 2 ;;
esac
CTL
chmod +x "$APP_ROOT/netspeedtestctl"

log "start service"
sh "$PKG_DIR/scripts/start.sh" || {
  log "start failed; recent log follows"
  tail -n 80 "$PKG_DIR/log/run.log" 2>/dev/null || true
  exit 1
}

sleep 1
if "$APP_ROOT/netspeedtestctl" status >/dev/null 2>&1; then
  log "installed and running"
else
  log "installed but not running; recent log follows"
  tail -n 80 "$PKG_DIR/log/run.log" 2>/dev/null || true
  exit 1
fi

URL="$($APP_ROOT/netspeedtestctl url)"
log "URL: $URL"
log "control: $APP_ROOT/netspeedtestctl {start|stop|restart|status|url|log}"
