#!/bin/bash
# Deploy code-server + picoclaw locally (WSL / Linux)
# Usage: ./local-deploy.sh [project_name]
# Default project name: local-dev

set -e

PROJECT_NAME="${1:-local-dev}"
PICOCLAW_DIR="/opt/picoclaw/${PROJECT_NAME}"
HOME_DIR="/opt/picoclaw/${PROJECT_NAME}/data"

# Check dependencies
for cmd in docker jq openssl curl; do
  if ! command -v "$cmd" > /dev/null 2>&1; then
    echo "Error: Required command '$cmd' is not installed."
    exit 1
  fi
done

# Use current user's UID/GID
CONTAINER_UID=$(id -u)
CONTAINER_GID=$(id -g)
echo "Using UID=${CONTAINER_UID} GID=${CONTAINER_GID}"

# ── Create directories ─────────────────────────────────────────────────
echo "[1/4] Creating directories..."
mkdir -p "${PICOCLAW_DIR}"
mkdir -p "${HOME_DIR}/.picoclaw/workspace"
mkdir -p "${HOME_DIR}/workspace"
# Welcome message
cat > "${HOME_DIR}/workspace/HELLO.md" << 'WEOF'
# Welcome to Your AI Workspace

This is your local development environment with code-server + picoclaw AI agent.

## Quick Start
- `Ctrl+Shift+P` → command palette
- `Ctrl+I` → AI chat (opencode inline)

## Your AI Agent
Config at `.picoclaw/config.json`

## Files
- Workspace: `/config/workspace/`
- Agent data: `/config/.picoclaw/`
WEOF

# Symlink .picoclaw into workspace
ln -sf ../.picoclaw "${HOME_DIR}/workspace/.picoclaw" 2>/dev/null || true

cat > "${HOME_DIR}/workspace/.gitignore" << 'GITEOF'
.picoclaw/workspace/memory/
.picoclaw/workspace/state/
.picoclaw/workspace/sessions/
.picoclaw/workspace/cron/
.picoclaw/logs/
.picoclaw/.picoclaw.pid
data/
extensions/
.cache/
.local/
GITEOF

chown -R "${CONTAINER_UID}:${CONTAINER_GID}" "${HOME_DIR}"

# ── Write config files ─────────────────────────────────────────────────
echo "[2/4] Writing config files..."

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# config.json
if [ -f "${SCRIPT_DIR}/config.json" ]; then
  cp "${SCRIPT_DIR}/config.json" "${HOME_DIR}/.picoclaw/config.json"
  chmod 644 "${HOME_DIR}/.picoclaw/config.json"
  echo "  Copied config.json"
fi

# .security.yml
cat > "${HOME_DIR}/.picoclaw/.security.yml" << 'SECEOF'
model_list:
  opencode/deepseek-v4-flash-free:0:
    api_keys:
      - sk-local-dev
SECEOF
chmod 600 "${HOME_DIR}/.picoclaw/.security.yml"

# Resolve latest semver tag from GHCR
resolve_latest_tag() {
  local repo="bigt-ai-platform/agent"
  local registry="ghcr.io"
  local token_url="https://${registry}/token?service=${registry}&scope=repository:${repo}:pull"
  local tags_url="https://${registry}/v2/${repo}/tags/list"
  local token
  token=$(curl -sf "${token_url}" | jq -r '.token' 2>/dev/null) || return 1
  local tags_json
  tags_json=$(curl -sf -H "Authorization: Bearer ${token}" "${tags_url}" 2>/dev/null) || return 1
  local latest
  latest=$(echo "${tags_json}" | jq -r '.tags[] | select(test("^v[0-9]+\\.[0-9]+\\.[0-9]+$"))' 2>/dev/null \
    | sed 's/^v//' | sort -t. -k1,1n -k2,2n -k3,3n | sed 's/^/v/' \
    | tail -1)
  [ -n "$latest" ] && echo "$latest" || return 1
}

IMAGE_TAG=$(resolve_latest_tag) && IMAGE="ghcr.io/bigt-ai-platform/agent:${IMAGE_TAG}" || IMAGE="ghcr.io/bigt-ai-platform/agent:latest"
echo "Using image: ${IMAGE}"

# ── Write docker-compose.yml ──────────────────────────────────────────
echo "[3/4] Writing docker-compose.yml..."

cat > "${PICOCLAW_DIR}/docker-compose.code-server.yml" << COMPOSE_EOF
services:
  code-server:
    image: ${IMAGE}
    container_name: codeserver-${PROJECT_NAME}
    environment:
      - PUID=${CONTAINER_UID}
      - PGID=${CONTAINER_GID}
      - TZ=UTC
      - DEFAULT_WORKSPACE=/config/workspace
    volumes:
      - ${HOME_DIR}:/config
    ports:
      - "8080:8443"           # code-server (container listens on 8443)

    restart: unless-stopped

networks:
  default:
    driver: bridge
COMPOSE_EOF

echo "Compose file written to ${PICOCLAW_DIR}/docker-compose.code-server.yml"

# ── Deploy containers ─────────────────────────────────────────────────
echo "[4/4] Deploying containers..."
docker compose -f "${PICOCLAW_DIR}/docker-compose.code-server.yml" down 2>/dev/null || true
chown -R "${CONTAINER_UID}:${CONTAINER_GID}" "${HOME_DIR}"
docker compose -f "${PICOCLAW_DIR}/docker-compose.code-server.yml" pull
docker compose -f "${PICOCLAW_DIR}/docker-compose.code-server.yml" up -d --force-recreate

# No auxiliary service injection: the image supervises launcher/did-auth/xray
# via s6 and seeds config + /root/.picoclaw symlink in cont-init.d (10-picoclaw-init).

# ── Verify services ──────────────────────────────────────────────────
echo "[4a] Verifying services..."
CONTAINER=codeserver-${PROJECT_NAME}
for i in $(seq 1 30); do
  if [ "$(docker inspect -f '{{.State.Running}}' "${CONTAINER}" 2>/dev/null)" = "true" ]; then
    break
  fi
  sleep 1
done

check_endpoint() {
  local url="$1"
  docker exec "${CONTAINER}" sh -c "wget -q -O /dev/null --spider '${url}' 2>/dev/null" && return 0
  return 1
}

for i in $(seq 1 30); do
  if check_endpoint "http://localhost:18790/health" && check_endpoint "http://localhost:18800/"; then
    echo "  All services healthy (gateway + launcher)"
    SERVICES_OK=1
    break
  fi
  sleep 2
done
if [ "${SERVICES_OK:-0}" != "1" ]; then
  echo "ERROR: picoclaw gateway (18790) or launcher (18800) did not become healthy." >&2
  echo "  Inspect: docker exec ${CONTAINER} s6-svstat /run/s6-rc/servicedirs/picoclaw-launcher" >&2
  exit 1
fi

# ── Done ──────────────────────────────────────────────────────────────
LOCAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}')

echo ""
echo "============================================"
echo "  ✅ code-server + picoclaw is running!"
echo "  Project: ${PROJECT_NAME}"
echo "============================================"
echo ""
echo "  code-server:  http://localhost:8080"
echo ""
if [ -n "$LOCAL_IP" ]; then
  echo "  LAN access:   http://${LOCAL_IP}:8080"
  echo ""
fi
echo "  Password:     cat ${HOME_DIR}/.config/code-server/config.yaml"
echo "                (inside container or check compose logs)"
echo ""
echo "  Stop:   docker compose -f ${PICOCLAW_DIR}/docker-compose.code-server.yml down"
echo "  Logs:   docker compose -f ${PICOCLAW_DIR}/docker-compose.code-server.yml logs -f"
echo "  Start:  docker compose -f ${PICOCLAW_DIR}/docker-compose.code-server.yml up -d"
echo ""
