#!/usr/bin/env bash
# Starts the CreditFair Slack <-> opencode bridge stack:
#   1. opencode serve (headless) — run from the project root
#   2. node slack-bridge server (Socket Mode — no ngrok needed)
set -euo pipefail

cd "$(dirname "$0")"
PROJECT_DIR="$(cd .. && pwd)"
BRIDGE_DIR="$PWD"
PORT="$(grep -E '^PORT=' .env | cut -d= -f2- || echo 3000)"
OPENCODE_PORT="$(grep -E '^OPENCODE_SERVER_URL=' .env | sed -E 's#.*:([0-9]+)/?$#\1#' || echo 4096)"

if grep -qE '^(SLACK_APP_TOKEN|xapp-)=' .env && grep -qE '^SLACK_BOT_TOKEN=xoxb' .env; then
  :
else
  echo "Fill in SLACK_APP_TOKEN (xapp-...) and SLACK_BOT_TOKEN (xoxb-...) in $BRIDGE_DIR/.env first." >&2
  exit 1
fi

if ! curl -sf "http://localhost:${OPENCODE_PORT}/global/health" >/dev/null 2>&1; then
  echo "Starting opencode serve on :${OPENCODE_PORT} (project: $PROJECT_DIR)"
  (cd "$PROJECT_DIR" && nohup opencode serve --port "$OPENCODE_PORT" --print-logs > "$BRIDGE_DIR/opencode-serve.log" 2>&1 &)
  echo "Waiting for opencode serve..." >&2
  for i in $(seq 1 30); do
    curl -sf "http://localhost:${OPENCODE_PORT}/global/health" >/dev/null 2>&1 && break
    sleep 1
  done
fi
curl -sf "http://localhost:${OPENCODE_PORT}/global/health" >/dev/null || { echo "opencode serve failed to start — see $BRIDGE_DIR/opencode-serve.log" >&2; exit 1; }
echo "opencode serve: ok (http://localhost:${OPENCODE_PORT})"

if ! curl -sf "http://localhost:${PORT}/slack/events" >/dev/null 2>&1 && pgrep -f "node server.js" >/dev/null 2>&1; then
  true
fi

if ! pgrep -f "$BRIDGE_DIR.*(server\.js|node)" >/dev/null 2>&1; then
  echo "Starting slack-bridge on :${PORT}"
  (cd "$BRIDGE_DIR" && nohup npm start > "$BRIDGE_DIR/bridge.log" 2>&1 &)
  sleep 2
  pgrep -f "node server.js" >/dev/null || { echo "slack-bridge failed to start — see $BRIDGE_DIR/bridge.log" >&2; exit 1; }
fi
echo "slack-bridge: ok (connected via Socket Mode — no Request URL needed)"

echo ""
echo "To stop:  pkill -f 'node server.js'; pkill -f 'opencode serve'"