#!/bin/sh
# node-arm_install.sh — One-liner installer/updater for AI-Network Proxy Node on RK3506 Buildroot
# Usage: wget -qO- https://download.zxiaoming.com/proxy-node-arm/node-arm_install.sh | sh
set -eu

echo "========================================="
echo " Installing AI-Network Proxy Node (RK3528A / ARM64 Buildroot)"
echo "========================================="

BASE_URL="https://download.zxiaoming.com/proxy-node-arm"

# Prefer /userdata if available (NAND-safe, preserves rootfs space)
if [ -d "/userdata" ] && [ -w "/userdata" ]; then
    INSTALL_DIR="/userdata/AI-Network-Node"
else
    INSTALL_DIR="$HOME/AI-Network-Node"
fi

# ── 0. Architecture check ───────────────────────────────────────────
ARCH="$(uname -m)"
case "$ARCH" in
    aarch64|arm64) ;;
    *)
        echo "   [error] This installer is for 64-bit ARM systems only."
        echo "   Detected architecture: $ARCH"
        exit 1
        ;;
esac

# ── 0.1. Tool check ────────────────────────────────────────────────
missing=""
for tool in wget tar killall sed md5sum nohup; do
    if ! command -v "$tool" > /dev/null 2>&1; then
        missing="$missing $tool"
    fi
done
if [ -n "$missing" ]; then
    echo "   [error] Missing required tools:$missing"
    exit 1
fi

# ── 1. Discover latest release ──────────────────────────────────────
echo ""
echo "1. Discovering latest release..."

dir_html="$(wget -qO- -T 15 "$BASE_URL/")" || {
    echo "   [error] Failed to reach the release server at $BASE_URL"
    exit 1
}

# Parse versions from links like node-arm.v0.1.0.tar.gz
versions="$(echo "$dir_html" | grep -o 'node-arm\.v[0-9]*\.[0-9]*\.[0-9]*\.tar\.gz' \
    | sed 's/node-arm\.//;s/\.tar\.gz//' \
    | sort -t. -k1,1n -k2,2n -k3,3n | uniq)"

if [ -z "$versions" ]; then
    echo "   [error] No release packages starting with node-arm.v were discovered on the server."
    exit 1
fi

version="$(echo "$versions" | tail -1)"
echo "   [ok] Dynamically resolved latest version: $version"

# ── Auto-updater check ──────────────────────────────────────────────
LOCAL_VERSION_FILE="$INSTALL_DIR/bin/version.txt"
if [ -f "$LOCAL_VERSION_FILE" ]; then
    current_version="$(cat "$LOCAL_VERSION_FILE" | tr -d '[:space:]')"

    if [ "$current_version" = "$version" ]; then
        echo "   [info] You are already running the latest version ($current_version)!"
        echo ""
        echo "========================================="
        echo " No update required. Aborting installation."
        echo "========================================="
        exit 0
    fi
    echo "   [info] Proceeding with UPDATE: $current_version -> $version"
fi

# ── 2. Download package ─────────────────────────────────────────────
TAR_URL="$BASE_URL/node-arm.$version.tar.gz"
TAR_PATH="/tmp/ai_network_arm_${version}.tar.gz"

echo "2. Downloading package..."
wget -q -T 120 -O "$TAR_PATH" "$TAR_URL" || {
    echo "   [error] Failed to download proxy package from $TAR_URL."
    exit 1
}
echo "   [ok] Download complete."

# ── 3. Prepare target directory ─────────────────────────────────────
echo "3. Preparing target directory ($INSTALL_DIR)..."

# Stop existing service first (systemd or init.d)
if command -v systemctl > /dev/null 2>&1 && systemctl is-active ainetwork.service > /dev/null 2>&1; then
    echo "   [info] Stopping running systemd service..."
    systemctl stop ainetwork.service 2>/dev/null || true
elif [ -x "/etc/init.d/S99ainetwork" ]; then
    echo "   [info] Stopping running init.d service..."
    /etc/init.d/S99ainetwork stop 2>/dev/null || true
fi

if [ -d "$INSTALL_DIR" ]; then
    echo "   [info] Existing folder found. Halting background processes..."
    killall proxy-node 2>/dev/null || true
    killall proxy-agent 2>/dev/null || true
    killall frpc 2>/dev/null || true
    killall gost 2>/dev/null || true

    sleep 2

    echo "   [info] Deleting existing directory..."
    if [ -f "$INSTALL_DIR/bin/proxy-agent.json" ]; then
        cp "$INSTALL_DIR/bin/proxy-agent.json" /tmp/proxy-agent-backup.json
    fi

    rm -rf "$INSTALL_DIR" || {
        echo "   [error] Failed to delete existing folder: $INSTALL_DIR"
        exit 1
    }
    echo "   [ok] Purged old installation."
fi
mkdir -p "$INSTALL_DIR"

if [ -f /tmp/proxy-agent-backup.json ]; then
    mkdir -p "$INSTALL_DIR/bin"
    mv /tmp/proxy-agent-backup.json "$INSTALL_DIR/bin/proxy-agent.json"
fi

# ── 4. Extract files ────────────────────────────────────────────────
echo "4. Extracting files to $INSTALL_DIR..."
# Handle BusyBox tar not supporting -z by using gzip and piping, or fallback to auto-detect
gzip -dc "$TAR_PATH" | tar -xf - -C "$INSTALL_DIR" || tar -xf "$TAR_PATH" -C "$INSTALL_DIR"
echo "   [ok] Extracted."

# Ensure all scripts are executable
chmod +x "$INSTALL_DIR"/*.sh 2>/dev/null || true
chmod +x "$INSTALL_DIR"/bin/*.sh 2>/dev/null || true
chmod +x "$INSTALL_DIR"/bin/proxy-node 2>/dev/null || true
chmod +x "$INSTALL_DIR"/bin/frpc 2>/dev/null || true

# ── 5. Clean up ─────────────────────────────────────────────────────
echo "5. Cleaning up temporary files..."
rm -f "$TAR_PATH"

# ── 6. Install auto-start service ───────────────────────────────────
echo "6. Installing auto-start service..."

# Detect init system: systemd (Armbian/Debian) vs Buildroot sysvinit
if command -v systemctl > /dev/null 2>&1 && [ -d /etc/systemd/system ]; then
    # ── systemd (Armbian / Debian / Ubuntu) ──
    echo "   [info] Detected systemd (Armbian/Debian). Installing systemd service..."

    SYSTEMD_FILE="/etc/systemd/system/ainetwork.service"

    cat > "$SYSTEMD_FILE" <<SYSTEMDEOF
[Unit]
Description=AI-Network Proxy Node
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=$INSTALL_DIR/bin
ExecStart=/bin/sh $INSTALL_DIR/bin/start-node.sh
ExecStop=/bin/sh $INSTALL_DIR/bin/stop-node.sh

[Install]
WantedBy=multi-user.target
SYSTEMDEOF

    systemctl daemon-reload
    systemctl enable ainetwork.service 2>/dev/null || true
    echo "   [ok] systemd service installed and enabled (ainetwork.service)."

    # Also install the legacy init.d script for manual use
    SERVICE_FILE="/etc/init.d/S99ainetwork"
    cat > "$SERVICE_FILE" <<SERVICEEOF
#!/bin/sh
INSTALL_DIR="$INSTALL_DIR"
case "\$1" in
  start)   systemctl start ainetwork.service ;;
  stop)    systemctl stop ainetwork.service ;;
  restart) systemctl restart ainetwork.service ;;
  *)       echo "Usage: \$0 {start|stop|restart}"; exit 1 ;;
esac
exit 0
SERVICEEOF
    chmod +x "$SERVICE_FILE"

else
    # ── Buildroot sysvinit ──
    echo "   [info] Detected Buildroot sysvinit. Installing init.d service..."

    SERVICE_FILE="/etc/init.d/S99ainetwork"

    cat > "$SERVICE_FILE" <<SERVICEEOF
#!/bin/sh
#
# Start/Stop AI-Network Proxy Node
#

INSTALL_DIR="$INSTALL_DIR"

case "\$1" in
  start)
        printf "Starting AI-Network Proxy Node... "
        cd "\$INSTALL_DIR/bin"
        sh "\$INSTALL_DIR/bin/start-node.sh" > /dev/null 2>&1 &
        echo "done."
        ;;
  stop)
        printf "Stopping AI-Network Proxy Node... "
        cd "\$INSTALL_DIR"
        sh "\$INSTALL_DIR/stop-node.sh"
        echo "done."
        ;;
  restart)
        "\$0" stop
        sleep 2
        "\$0" start
        ;;
  *)
        echo "Usage: \$0 {start|stop|restart}"
        exit 1
esac

exit 0
SERVICEEOF

    chmod +x "$SERVICE_FILE"
    echo "   [ok] Service installed to /etc/init.d/S99ainetwork for auto-start on boot."
fi

# ── 7. Start node ──────────────────────────────────────────────────
echo "7. Starting node..."
if command -v systemctl > /dev/null 2>&1 && [ -f /etc/systemd/system/ainetwork.service ]; then
    systemctl start ainetwork.service
else
    /etc/init.d/S99ainetwork start
fi
echo "   [ok] Node is running!"

# ── 8. Shell aliases ───────────────────────────────────────────────
echo "8. Configuring shell aliases..."

SHELL_RC="$HOME/.profile"
if [ -f "$HOME/.bashrc" ]; then
    SHELL_RC="$HOME/.bashrc"
fi

if grep -q "# AI-Network Node aliases" "$SHELL_RC" 2>/dev/null; then
    sed -i '/# AI-Network Node aliases/,/^$/d' "$SHELL_RC"
fi

cat >> "$SHELL_RC" <<ALIASEOF

# AI-Network Node aliases
alias ai-node-start='cd $INSTALL_DIR && ./start-node.sh'
alias ai-node-stop='cd $INSTALL_DIR && ./stop-node.sh'
alias ai-node-monitor='cd $INSTALL_DIR && ./monitor-node.sh'

ALIASEOF
echo "   [ok] Shell aliases configured."

echo ""
echo "========================================="
printf " \033[32mInstallation Complete!\033[0m\n"
echo ""
echo " Your AI-Network node is installed and running at:"
printf " \033[33m%s\033[0m\n" "$INSTALL_DIR"
echo ""
printf " \033[36m* The node will auto-start on system boot.\033[0m\n"
echo ""
echo " Commands:"
echo "    cd $INSTALL_DIR && ./start-node.sh    # Start"
echo "    cd $INSTALL_DIR && ./monitor-node.sh  # Monitor"
echo "    cd $INSTALL_DIR && ./stop-node.sh     # Stop"
echo ""
echo " Or use aliases (reopen terminal):"
echo "    ai-node-start | ai-node-stop | ai-node-monitor"
echo "========================================="
