#!/usr/bin/env bash
set -euo pipefail
umask 077
payload="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"
config="$HOME/.config/agent-workbench-native"
data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
mkdir -p "$config"
chmod 700 "$config" 2>/dev/null || true

command -v python3 >/dev/null 2>&1 || {
    echo "Agent Workbench requires Python 3.10 or newer." >&2
    exit 1
}
python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)' || {
    echo "Agent Workbench requires Python 3.10 or newer." >&2
    exit 1
}

bridge_port="${AWBENCH_PORT:-8765}"
case "$bridge_port" in
    ''|*[!0-9]*)
        echo "AWBENCH_PORT must be a number from 1024 through 65535." >&2
        exit 1
        ;;
esac
if [ "$bridge_port" -lt 1024 ] || [ "$bridge_port" -gt 65535 ]; then
    echo "AWBENCH_PORT must be a number from 1024 through 65535." >&2
    exit 1
fi
export AWBENCH_PORT="$bridge_port"
bridge_url="http://127.0.0.1:$bridge_port/health"

version_file="$payload/data/flutter_assets/version.json"
payload_version="$(python3 -c \
    'import json,sys; print(json.load(open(sys.argv[1], encoding="utf-8"))["version"])' \
    "$version_file" 2>/dev/null || true)"
case "$payload_version" in
    ''|*[!0-9A-Za-z._-]*)
        echo "Agent Workbench package version metadata is invalid." >&2
        exit 1
        ;;
esac

# AppImages are mounted only for the life of their UI process. Copy the Python
# bridge and its helper tools to an immutable, versioned per-user directory so
# background turns remain valid after that mount disappears.
runtime_parent="$data_home/agent-workbench-native/bridge-runtimes"
runtime_dir="$runtime_parent/$payload_version"
runtime_complete="$runtime_dir/.complete"
mkdir -p "$runtime_parent"
chmod 700 "$runtime_parent" 2>/dev/null || true
if [ -d "$runtime_dir" ] && [ ! -f "$runtime_complete" ]; then
    rm -rf -- "$runtime_dir"
fi
if [ ! -f "$runtime_complete" ]; then
    runtime_tmp="$(mktemp -d "$runtime_parent/.${payload_version}.XXXXXX")"
    mkdir -p "$runtime_tmp/bridge/tools" "$runtime_tmp/data/flutter_assets"
    cp "$payload/bridge/awbench_server.py" "$payload/bridge/commands.py" \
        "$runtime_tmp/bridge/"
    cp "$payload/bridge/tools/awbn_batch_server.py" \
        "$payload/bridge/tools/qwen_mcp_bridge.mjs" \
        "$runtime_tmp/bridge/tools/"
    cp "$version_file" "$runtime_tmp/data/flutter_assets/version.json"
    printf '%s\n' "$payload_version" > "$runtime_tmp/VERSION"
    : > "$runtime_tmp/.complete"
    if ! mv -T -- "$runtime_tmp" "$runtime_dir" 2>/dev/null; then
        rm -rf -- "$runtime_tmp"
    fi
fi
for runtime_file in \
    "$runtime_dir/bridge/awbench_server.py" \
    "$runtime_dir/bridge/commands.py" \
    "$runtime_dir/bridge/tools/awbn_batch_server.py" \
    "$runtime_dir/bridge/tools/qwen_mcp_bridge.mjs" \
    "$runtime_dir/data/flutter_assets/version.json"; do
    [ -f "$runtime_file" ] || {
        echo "Agent Workbench could not install its local bridge runtime." >&2
        exit 1
    }
done

bridge_version_file="$config/bridge-$bridge_port.version"
bridge_pid_file="$config/bridge-$bridge_port.pid"
bridge_log="$config/bridge-$bridge_port.log"

bridge_ready() {
    if command -v curl >/dev/null 2>&1; then
        curl -fsS --max-time 1 "$bridge_url" 2>/dev/null |
            grep -q '"app": "agent-workbench-native"'
    else
        python3 -c 'import json,sys,urllib.request; p=json.load(urllib.request.urlopen(sys.argv[1],timeout=1)); raise SystemExit(0 if p.get("app")=="agent-workbench-native" else 1)' "$bridge_url" >/dev/null 2>&1
    fi
}

bridge_version() {
    python3 -c 'import json,sys,urllib.request; p=json.load(urllib.request.urlopen(sys.argv[1],timeout=1)); print(p.get("version") or "")' "$bridge_url" 2>/dev/null || true
}

if bridge_ready; then
    running_version="$(bridge_version)"
    if [ "$running_version" != "$payload_version" ]; then
        echo "A different Agent Workbench bridge is already using port $bridge_port." >&2
        echo "Close running Agent Workbench work, stop the old bridge, and reopen the app." >&2
        exit 1
    fi
else
    nohup env AWBENCH_PORT="$bridge_port" \
        python3 "$runtime_dir/bridge/awbench_server.py" \
        >>"$bridge_log" 2>&1 </dev/null &
    bridge_pid=$!
    for _attempt in $(seq 1 50); do
        if bridge_ready && [ -s "$config/bridge-token" ]; then break; fi
        kill -0 "$bridge_pid" 2>/dev/null || break
        sleep 0.1
    done
    if bridge_ready && [ "$(bridge_version)" = "$payload_version" ] && \
       [ -s "$config/bridge-token" ]; then
        printf '%s\n' "$payload_version" > "$bridge_version_file.tmp.$$"
        mv -f -- "$bridge_version_file.tmp.$$" "$bridge_version_file"
        printf '%s\n' "$bridge_pid" > "$bridge_pid_file.tmp.$$"
        mv -f -- "$bridge_pid_file.tmp.$$" "$bridge_pid_file"
    fi
fi

if ! bridge_ready || [ "$(bridge_version)" != "$payload_version" ] || \
   [ ! -s "$config/bridge-token" ]; then
    echo "Agent Workbench could not start its local bridge. See $bridge_log" >&2
    exit 1
fi
exec "$payload/agent-workbench-native-ui" "$@"
