#!/bin/sh
set -eu

VERSION="1.0.2"
BASE_URL="https://dl.naixi.net/ikuai/apps"
APP_ROOT="/etc/log/apps/portest"
PKG_ROOT="$APP_ROOT/.pkg"
TMP_ROOT="$APP_ROOT/.install.$$"

cleanup() { rm -rf "$TMP_ROOT"; }
trap cleanup EXIT INT TERM

arch=$(uname -m 2>/dev/null || echo unknown)
case "$arch" in
  x86_64|amd64) pkg_arch="amd64" ;;
  aarch64|arm64) pkg_arch="arm64" ;;
  *)
    if grep -q '^ARCH=arm' /etc/release 2>/dev/null; then
      pkg_arch="arm64"
    else
      echo "PorTest: unsupported architecture: $arch" >&2
      exit 1
    fi
    ;;
esac

pkg="portest-${pkg_arch}-${VERSION}.ipkg"
url="${BASE_URL}/${pkg}?t=$(date +%s)"
mkdir -p "$TMP_ROOT/extract" "$APP_ROOT"

echo "[PorTest] downloading $pkg from $BASE_URL"
download_ok=0
if command -v curl >/dev/null 2>&1; then
  if curl -fL --connect-timeout 15 --retry 2 -o "$TMP_ROOT/$pkg" "$url"; then
    download_ok=1
  else
    echo "[PorTest] curl failed, trying wget" >&2
    rm -f "$TMP_ROOT/$pkg"
  fi
fi
if [ "$download_ok" != "1" ] && command -v wget >/dev/null 2>&1; then
  if wget -O "$TMP_ROOT/$pkg" "$url"; then
    download_ok=1
  else
    echo "[PorTest] wget failed" >&2
    rm -f "$TMP_ROOT/$pkg"
  fi
fi
if [ "$download_ok" != "1" ]; then
  echo "PorTest: package download failed: $url" >&2
  exit 1
fi

[ -s "$TMP_ROOT/$pkg" ] || { echo "PorTest: downloaded package is empty" >&2; exit 1; }
echo "[PorTest] downloaded $(wc -c < "$TMP_ROOT/$pkg") bytes"

if ! tar xzf "$TMP_ROOT/$pkg" -C "$TMP_ROOT/extract"; then
  echo "PorTest: package extraction failed" >&2
  exit 1
fi
[ -f "$TMP_ROOT/extract/portest/manifest.json" ] || { echo "PorTest: invalid package" >&2; exit 1; }

if [ -x "$PKG_ROOT/scripts/stop.sh" ]; then
  "$PKG_ROOT/scripts/stop.sh" >/dev/null 2>&1 || true
fi
rm -rf "$PKG_ROOT"
mkdir -p "$PKG_ROOT" "$APP_ROOT/log"
cp -a "$TMP_ROOT/extract/portest/." "$PKG_ROOT/"
chmod 755 "$PKG_ROOT/scripts/start.sh" "$PKG_ROOT/scripts/stop.sh" "$PKG_ROOT/app/bin/"*

lan_ip=$(ip -4 addr show lan1 2>/dev/null | awk '/inet /{sub("/.*", "", $2); print $2; exit}')
[ -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="192.168.1.1"
cat > "$PKG_ROOT/app/environment" <<EOF
HOST_IP=$lan_ip
APP_PORT_WEB=8765
APP_WEB_LOGIN_URI=/
EOF

cat > "$APP_ROOT/portestctl" <<'EOF'
#!/bin/sh
APP_ROOT="/etc/log/apps/portest"
PKG_ROOT="$APP_ROOT/.pkg"
PIDFILE="$PKG_ROOT/app/cache/portest.pid"
case "${1:-status}" in
  start) "$PKG_ROOT/scripts/start.sh" ;;
  stop) "$PKG_ROOT/scripts/stop.sh" ;;
  restart) "$PKG_ROOT/scripts/stop.sh" || true; "$PKG_ROOT/scripts/start.sh" ;;
  status)
    pid=$(cat "$PIDFILE" 2>/dev/null || true)
    if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then echo "PorTest running, pid=$pid"; else echo "PorTest stopped"; exit 1; fi
    ;;
  url)
    . "$PKG_ROOT/app/environment"
    echo "http://${HOST_IP}:${APP_PORT_WEB}${APP_WEB_LOGIN_URI}"
    ;;
  log) tail -n 100 "$PKG_ROOT/log/run.log" 2>/dev/null || tail -n 100 "$APP_ROOT/log/run.log" 2>/dev/null ;;
  *) echo "usage: $0 {start|stop|restart|status|url|log}" >&2; exit 2 ;;
esac
EOF
chmod 755 "$APP_ROOT/portestctl"

"$PKG_ROOT/scripts/start.sh"
echo "[PorTest] installed: $pkg"
echo "[PorTest] URL: http://${lan_ip}:8765/"
echo "[PorTest] control: $APP_ROOT/portestctl"
