#!/bin/bash
# Launch KISS Sorcar in a Docker container (code-server in the browser).
#
# Usage:  ./sorcar-docker [PORT]
#
# Flow:
#   1. Build the Docker image (kiss-sorcar) from ./Dockerfile.
#   2. Transfer git credentials (GH_TOKEN) to the container.
#   3. Container clones https://github.com/ksenxx/kiss to /home/kiss.
#   4. Container runs /home/kiss/install.sh (Python env, Playwright, extension).
#   5. Container launches code-server on port 8080.
#   6. Host waits for code-server, then opens the browser.
#
# Environment:
#   GH_TOKEN             — GitHub token (auto-detected from `gh auth token`)
#   ANTHROPIC_API_KEY    — Anthropic API key (recommended)
#   OPENAI_API_KEY       — OpenAI API key (optional)
#   GEMINI_API_KEY       — Gemini API key (optional)
#   TOGETHER_API_KEY     — Together API key (optional)
#   OPENROUTER_API_KEY   — OpenRouter API key (optional)
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PORT="${1:-8080}"
IMAGE="kiss-sorcar"
CONTAINER="kiss-sorcar"
URL="http://localhost:${PORT}"
MAX_WAIT=600

# ---------------------------------------------------------------------------
# Logging helpers
# ---------------------------------------------------------------------------
info() { printf '\033[0;32m[INFO]\033[0m  %s\n' "$*"; }
step() { printf '\033[0;34m[STEP]\033[0m  %s\n' "$*"; }
warn() { printf '\033[1;33m[WARN]\033[0m  %s\n' "$*"; }
die()  { printf '\033[0;31m[ERR]\033[0m  %s\n' "$*" >&2; exit 1; }

# ---------------------------------------------------------------------------
# 1. Pre-flight
# ---------------------------------------------------------------------------
command -v docker &>/dev/null || die "Docker is not installed. Install Docker Desktop first."
docker info &>/dev/null 2>&1  || die "Docker daemon is not running. Start Docker and retry."

# ---------------------------------------------------------------------------
# 2. Git credentials — needed to clone the private repo inside the container
# ---------------------------------------------------------------------------
if [[ -z "${GH_TOKEN:-}" ]]; then
    if command -v gh &>/dev/null && gh auth status &>/dev/null 2>&1; then
        GH_TOKEN="$(gh auth token 2>/dev/null || true)"
    fi
fi
if [[ -z "${GH_TOKEN:-}" ]]; then
    die "No GitHub token found. Run 'gh auth login' or export GH_TOKEN."
fi
info "GitHub token acquired"

# ---------------------------------------------------------------------------
# 3. Build Docker image
# ---------------------------------------------------------------------------
step "Building Docker image '$IMAGE'..."
docker build -t "$IMAGE" "$SCRIPT_DIR" 2>&1

# ---------------------------------------------------------------------------
# 4. Remove old container
# ---------------------------------------------------------------------------
if docker ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
    step "Removing old container '$CONTAINER'..."
    docker rm -f "$CONTAINER" >/dev/null
fi

# ---------------------------------------------------------------------------
# 5. Collect environment variables (git credentials + API keys)
# ---------------------------------------------------------------------------
ENV_ARGS=(-e "GH_TOKEN=${GH_TOKEN}")
for key in ANTHROPIC_API_KEY OPENAI_API_KEY GEMINI_API_KEY TOGETHER_API_KEY OPENROUTER_API_KEY; do
    [[ -n "${!key:-}" ]] && ENV_ARGS+=(-e "${key}=${!key}")
done

# ---------------------------------------------------------------------------
# 6. Start container
# ---------------------------------------------------------------------------
step "Starting container '$CONTAINER' on port $PORT..."
docker run -d \
    --name "$CONTAINER" \
    -p "${PORT}:8080" \
    "${ENV_ARGS[@]}" \
    "$IMAGE" >/dev/null

info "Container started"
info "First start clones the repo and runs install.sh — this takes a few minutes."
info "Watch progress: docker logs -f $CONTAINER"

# ---------------------------------------------------------------------------
# 7. Wait for code-server to respond
# ---------------------------------------------------------------------------
for i in $(seq 1 "$MAX_WAIT"); do
    if curl -sf "$URL" -o /dev/null 2>/dev/null; then
        break
    fi
    if ! docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then
        echo ""
        die "Container exited unexpectedly. Run: docker logs $CONTAINER"
    fi
    if (( i % 30 == 0 )); then
        info "Still waiting... (${i}s elapsed)"
    fi
    sleep 1
done

if ! curl -sf "$URL" -o /dev/null 2>/dev/null; then
    die "Timed out after ${MAX_WAIT}s. Run: docker logs $CONTAINER"
fi

# ---------------------------------------------------------------------------
# 8. Open browser
# ---------------------------------------------------------------------------
info "KISS Sorcar is ready at $URL"
case "$(uname -s)" in
    Darwin) open "$URL" ;;
    Linux)  command -v xdg-open &>/dev/null && xdg-open "$URL" & ;;
esac

echo ""
echo "  ┌──────────────────────────────────────────────────┐"
echo "  │  KISS Sorcar: ${URL}"
echo "  │  Stop:   docker stop ${CONTAINER}"
echo "  │  Remove: docker rm   ${CONTAINER}"
echo "  │  Logs:   docker logs -f ${CONTAINER}"
echo "  └──────────────────────────────────────────────────┘"
