#!/bin/bash
# Start Teams webhook server + Cloudflare quick tunnel with auto-endpoint update.
# The tunnel URL changes each restart, so we update the bot's messaging endpoint via Graph API.
set -euo pipefail

DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$DIR"

# Load env
if [ -f "$DIR/.env" ]; then
  set -a
  source "$DIR/.env"
  set +a
fi

export MSTEAMS_APP_ID="${MSTEAMS_APP_ID:-e6981a53-9d31-4502-a965-5ff7799d8d0c}"
export MSTEAMS_APP_PASSWORD="${MSTEAMS_APP_PASSWORD:-}"
export MSTEAMS_TENANT_ID="${MSTEAMS_TENANT_ID:-707a7153-af93-4b65-ae01-bfa6febbffdb}"
export MSTEAMS_WEBHOOK_PORT="${MSTEAMS_WEBHOOK_PORT:-3978}"

STATE_DIR="$HOME/.claude/channels/teams"
mkdir -p "$STATE_DIR"
TUNNEL_URL_FILE="$STATE_DIR/tunnel-url.txt"
TUNNEL_LOG="/tmp/exult-teams-tunnel/stderr.log"
mkdir -p /tmp/exult-teams-tunnel

cleanup() {
  echo "[$(date)] Shutting down..."
  [ -n "${TUNNEL_PID:-}" ] && kill "$TUNNEL_PID" 2>/dev/null
  [ -n "${SERVER_PID:-}" ] && kill "$SERVER_PID" 2>/dev/null
  pkill -P $$ 2>/dev/null
  rm -f /tmp/exult-teams-channel/stdin-pipe
  exit 0
}
trap cleanup SIGTERM SIGINT SIGHUP

# Start the webhook server
echo "[$(date)] Starting Teams webhook server on port $MSTEAMS_WEBHOOK_PORT..."
/Users/Work/.bun/bin/bun run "$DIR/server.ts" < /dev/null &
SERVER_PID=$!
sleep 2

if ! kill -0 "$SERVER_PID" 2>/dev/null; then
  echo "[$(date)] ERROR: Server failed to start"
  exit 1
fi

echo "[$(date)] Server running (PID: $SERVER_PID)"

# Start quick tunnel
echo "[$(date)] Starting Cloudflare quick tunnel..."
cloudflared tunnel --url "http://localhost:$MSTEAMS_WEBHOOK_PORT" 2>"$TUNNEL_LOG" &
TUNNEL_PID=$!
sleep 5

# Extract tunnel URL from log
TUNNEL_URL=""
for i in $(seq 1 10); do
  TUNNEL_URL=$(grep -oE 'https://[a-z0-9-]+\.trycloudflare\.com' "$TUNNEL_LOG" | head -1)
  if [ -n "$TUNNEL_URL" ]; then
    break
  fi
  sleep 2
done

if [ -z "$TUNNEL_URL" ]; then
  echo "[$(date)] ERROR: Could not extract tunnel URL from cloudflared output"
  echo "[$(date)] Tunnel log:"
  cat "$TUNNEL_LOG"
  exit 1
fi

echo "[$(date)] Tunnel URL: $TUNNEL_URL"
echo "$TUNNEL_URL" > "$TUNNEL_URL_FILE"

# Update Cloudflare Worker proxy to point to new tunnel URL
PROXY_SCRIPT="$DIR/../teams-proxy/update-tunnel.sh"
if [ -x "$PROXY_SCRIPT" ]; then
  echo "[$(date)] Updating Cloudflare Worker proxy..."
  bash "$PROXY_SCRIPT" "$TUNNEL_URL" || echo "[$(date)] WARNING: Worker update failed"
else
  echo "[$(date)] No proxy update script found — update manually if needed"
fi

echo "[$(date)] Teams channel ready!"
echo "[$(date)]   Server: http://localhost:$MSTEAMS_WEBHOOK_PORT"
echo "[$(date)]   Tunnel: $TUNNEL_URL"
echo "[$(date)]   Webhook: ${TUNNEL_URL}/api/messages"

# Wait for either process to exit (macOS bash 3.2 lacks wait -n)
while kill -0 "$SERVER_PID" 2>/dev/null && kill -0 "$TUNNEL_PID" 2>/dev/null; do
  sleep 5
done
echo "[$(date)] A process exited — shutting down"
cleanup
