#!/bin/zsh
set -e

APP_DIR="$(cd "$(dirname "$0")/../Resources/app" && pwd)"
LOG_DIR="$HOME/Library/Logs/Facebook AI Operator"
DATA_DIR="$HOME/Library/Application Support/Facebook AI Operator"
PUBLIC_DATA_DIR="$DATA_DIR/public"
mkdir -p "$LOG_DIR" "$DATA_DIR" "$PUBLIC_DATA_DIR/uploads" "$PUBLIC_DATA_DIR/executor-evidence"

NODE_BIN="$(command -v node || true)"
if [ -z "$NODE_BIN" ]; then
  osascript -e 'display dialog "未找到 Node.js。请先安装 Node.js 20+，再重新打开 Facebook AI Operator。" buttons {"OK"} default button "OK"'
  exit 1
fi

MAIN_PORT="${FACEBOOK_AUTO_PORT:-3000}"
TRY_PORT="$MAIN_PORT"
while lsof -nP -iTCP:"$TRY_PORT" -sTCP:LISTEN >/dev/null 2>&1; do
  TRY_PORT=$((TRY_PORT + 1))
  if [ "$TRY_PORT" -gt $((MAIN_PORT + 20)) ]; then
    osascript -e 'display dialog "3000-3020 端口都被占用，请关闭旧的 Facebook AI Operator 后重试。" buttons {"OK"} default button "OK"'
    exit 1
  fi
done
MAIN_PORT="$TRY_PORT"

cd "$APP_DIR"

if [ ! -f "$DATA_DIR/.env.local" ]; then
  cat > "$DATA_DIR/.env.local" <<EOF
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com
OPENAI_MODEL=gpt-4o-mini
OPENCLAW_SHARED_TOKEN=local-test-token
FACEBOOK_AUTO_LICENSE_SERVER_URL=
FACEBOOK_AUTO_REQUIRE_REMOTE_LICENSE=true
FACEBOOK_AUTO_REQUIRE_REMOTE_HEARTBEAT_SIGNATURE=false
FACEBOOK_AUTO_LICENSE_HEARTBEAT_TIMEOUT_MS=10000
FACEBOOK_AUTO_UPDATE_MANIFEST_URL=
FACEBOOK_AUTO_UPDATE_CHANNEL=stable
FACEBOOK_AUTO_UPDATE_REQUIRE_SIGNATURE=false
FACEBOOK_AUTO_UPDATE_PUBLIC_KEY_PATH=
EOF
fi

if [ ! -f "$DATA_DIR/db.json" ]; then
  cp "packaging/default-db.json" "$DATA_DIR/db.json"
fi

set -a
. "$DATA_DIR/.env.local"
set +a

NEXT_DIST_DIR=.next \
FACEBOOK_AUTO_DATA_DIR="$DATA_DIR" \
FACEBOOK_AUTO_PUBLIC_DATA_DIR="$PUBLIC_DATA_DIR" \
PORT="$MAIN_PORT" \
"$NODE_BIN" node_modules/next/dist/bin/next start > "$LOG_DIR/facebook-auto.log" 2>&1 &
MAIN_PID=$!

sleep 3
open "http://127.0.0.1:${MAIN_PORT}?tab=ops"

osascript -e 'display dialog "Facebook AI Operator 客户端已启动。\n\n主后台：http://127.0.0.1:'"$MAIN_PORT"'\n\n数据目录：'"$DATA_DIR"'\n\n远程授权请在商用工作台填写你的 Web 云端授权地址和 License Key。" buttons {"OK"} default button "OK"'

wait "$MAIN_PID"
