#!/usr/bin/env bash
# =============================================================================
# Commerce Compass – Setup Script  v2
# =============================================================================
# Installs the Claude Code AI toolkit into an existing Adobe Commerce or
# App Builder project.  MCP-free, Claude-only.
#
#   Commerce:    asks for project path
#   App Builder: asks for project path + starter kit
#
# Usage (interactive):
#   ./setup.sh
#
# Usage (non-interactive):
#   ./setup.sh --platform commerce   --project /path/to/project
#   ./setup.sh --platform appbuilder --project /path/to/project --starter-kit integration
# =============================================================================

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_DIR="$HOME/.commerce-compass/packages"

# ── Toolkit repos ─────────────────────────────────────────────────────────────
COMMERCE_TOOLKIT_DIR="$PACKAGES_DIR/adobe-commerce-ai-toolkit"
COMMERCE_TOOLKIT_REPO="git@github.com:OneAdobe/adobe-commerce-ai-toolkit.git"
COMMERCE_TOOLKIT_BRANCH="feature/claude-support"

APPBUILDER_TOOLKIT_DIR="$PACKAGES_DIR/adobe-appbuilder-ai-toolkit"
APPBUILDER_TOOLKIT_REPO="git@github.com:OneAdobe/adobe-appbuilder-ai-toolkit.git"
APPBUILDER_TOOLKIT_BRANCH="feature/claude-support"

# ── Orchestrator toolkit (bundled — no clone needed) ──────────────────────────
ORCHESTRATOR_TOOLKIT_DIR="$SCRIPT_DIR/packages/adobe-program-orchestrator-toolkit"

# ── Starter kit repos ─────────────────────────────────────────────────────────
INTEGRATION_KIT_REPO="https://github.com/adobe/commerce-integration-starter-kit.git"
CHECKOUT_KIT_REPO="https://github.com/adobe/commerce-checkout-starter-kit.git"

# ── Colours ───────────────────────────────────────────────────────────────────
BOLD='\033[1m'
DIM='\033[2m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
RESET='\033[0m'

info()    { printf "  ${CYAN}>${RESET} %s\n" "$1"; }
success() { printf "  ${GREEN}✓${RESET} %s\n" "$1"; }
warn()    { printf "  ${YELLOW}!${RESET} %s\n" "$1"; }
err()     { printf "  ${RED}✗${RESET} %s\n" "$1" >&2; }
step()    { printf "\n${BOLD}${BLUE}── %s ${RESET}\n" "$1"; }
die()     { err "$1"; exit 1; }

# ── Banner ────────────────────────────────────────────────────────────────────
show_banner() {
  printf "\n"
  printf "${BOLD}${BLUE}   ██████╗ ██████╗ ███╗   ███╗██████╗  █████╗ ███████╗███████╗${RESET}\n"
  printf "${BOLD}${BLUE}  ██╔════╝██╔═══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██╔════╝${RESET}\n"
  printf "${BOLD}${BLUE}  ██║     ██║   ██║██╔████╔██║██████╔╝███████║███████╗███████╗${RESET}\n"
  printf "${BOLD}${BLUE}  ██║     ██║   ██║██║╚██╔╝██║██╔═══╝ ██╔══██║╚════██║╚════██║${RESET}\n"
  printf "${BOLD}${BLUE}  ╚██████╗╚██████╔╝██║ ╚═╝ ██║██║     ██║  ██║███████║███████║${RESET}\n"
  printf "${BOLD}${BLUE}   ╚═════╝ ╚═════╝ ╚═╝     ╚═╝╚═╝     ╚═╝  ╚═╝╚══════╝╚══════╝${RESET}\n"
  printf "\n${DIM}  AI-powered Adobe Commerce & App Builder development setup${RESET}\n\n"
}

# ── Prerequisites ─────────────────────────────────────────────────────────────
check_prereqs() {
  step "Checking prerequisites"
  local failed=0

  if ! command -v git &>/dev/null; then
    err "git not found — install git and retry"; failed=1
  else
    success "git $(git --version | awk '{print $3}')"
  fi

  if ! command -v node &>/dev/null; then
    err "node not found — install Node.js >= 18 and retry"; failed=1
  else
    local nv
    nv=$(node --version | sed 's/v//' | cut -d. -f1)
    if [[ "$nv" -lt 18 ]]; then
      err "node $(node --version) is too old — need >= 18"; failed=1
    else
      success "node $(node --version)"
    fi
  fi

  if ! command -v npm &>/dev/null; then
    err "npm not found — install npm and retry"; failed=1
  else
    success "npm $(npm --version)"
  fi

  if ! command -v claude &>/dev/null; then
    err "claude not found — install Claude Code and retry"; failed=1
  else
    success "claude $(claude --version | awk '{print $1}')"
  fi

  [[ $failed -eq 1 ]] && die "Fix the issues above and re-run setup."
}

# ── Superpowers plugin ────────────────────────────────────────────────────────
ensure_superpowers() {
  step "Superpowers plugin"
  local settings="$HOME/.claude/settings.json"

  if [[ -f "$settings" ]] && \
     node -e "
       try {
         const s = JSON.parse(require('fs').readFileSync('$settings', 'utf8'));
         process.exit(s.enabledPlugins?.['superpowers@claude-plugins-official'] ? 0 : 1);
       } catch { process.exit(1); }
     " 2>/dev/null; then
    success "Superpowers plugin already installed"
    return 0
  fi

  info "Installing Superpowers plugin …"
  if claude plugins:install superpowers@claude-plugins-official 2>/dev/null; then
    success "Superpowers plugin installed"
  else
    warn "Superpowers plugin install failed — run 'claude plugins:install superpowers@claude-plugins-official' manually"
  fi
}

# ── Sparse clone helpers ───────────────────────────────────────────────────────
sparse_clone() {
  local dir="$1" repo="$2" branch="$3"
  shift 3
  local paths=("$@")

  info "Cloning $repo …"
  mkdir -p "$dir"
  git init -q "$dir"
  git -C "$dir" remote add origin "$repo"
  git -C "$dir" config core.sparseCheckout true
  printf '%s\n' "${paths[@]}" > "$dir/.git/info/sparse-checkout"
  git -C "$dir" fetch --depth=1 origin "$branch" -q
  git -C "$dir" checkout -q "origin/$branch" --detach
  success "Cloned $(basename "$dir")"
}

sparse_update() {
  local dir="$1" branch="$2"
  info "Updating $(basename "$dir") …"
  git -C "$dir" fetch --depth=1 origin "$branch" -q
  git -C "$dir" checkout -q "origin/$branch" --detach
  success "Updated $(basename "$dir")"
}

# ── Ensure Commerce toolkit ────────────────────────────────────────────────────
ensure_commerce_toolkit() {
  step "Commerce AI toolkit"
  local sibling
  sibling="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)/adobe-commerce-ai-toolkit"
  if [[ -d "$sibling/.git" && -f "$sibling/package.json" && -f "$sibling/scripts/setup-project.mjs" ]]; then
    COMMERCE_TOOLKIT_DIR="$sibling"
    success "Using local adobe-commerce-ai-toolkit"
  elif [[ -d "$COMMERCE_TOOLKIT_DIR/.git" ]]; then
    sparse_update "$COMMERCE_TOOLKIT_DIR" "$COMMERCE_TOOLKIT_BRANCH"
  else
    sparse_clone "$COMMERCE_TOOLKIT_DIR" "$COMMERCE_TOOLKIT_REPO" \
      "$COMMERCE_TOOLKIT_BRANCH" ".claude/" "scripts/" "docs/" "CLAUDE.md" "package.json"
  fi
  if [[ ! -d "$COMMERCE_TOOLKIT_DIR/node_modules" ]]; then
    info "Installing toolkit dependencies …"
    npm install --prefix "$COMMERCE_TOOLKIT_DIR" -q
  fi
}

# ── Ensure App Builder toolkit ─────────────────────────────────────────────────
ensure_appbuilder_toolkit() {
  step "App Builder AI toolkit"
  local sibling
  sibling="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)/adobe-appbuilder-ai-toolkit"
  if [[ -d "$sibling/.git" && -f "$sibling/package.json" && -f "$sibling/scripts/setup-project.mjs" ]]; then
    APPBUILDER_TOOLKIT_DIR="$sibling"
    success "Using local adobe-appbuilder-ai-toolkit"
  elif [[ -d "$APPBUILDER_TOOLKIT_DIR/.git" ]]; then
    sparse_update "$APPBUILDER_TOOLKIT_DIR" "$APPBUILDER_TOOLKIT_BRANCH"
  else
    sparse_clone "$APPBUILDER_TOOLKIT_DIR" "$APPBUILDER_TOOLKIT_REPO" \
      "$APPBUILDER_TOOLKIT_BRANCH" ".claude/" "scripts/" "docs/" "CLAUDE.md" "package.json"
  fi
  if [[ ! -d "$APPBUILDER_TOOLKIT_DIR/node_modules" ]]; then
    info "Installing toolkit dependencies …"
    npm install --prefix "$APPBUILDER_TOOLKIT_DIR" -q
  fi
}

# ── Interactive prompts ────────────────────────────────────────────────────────
select_platform() {
  step "Platform"
  printf "  Select platform:\n\n"
  printf "    ${BOLD}1)${RESET} Adobe Commerce  – module development (Phase 1–4 SDLC)\n"
  printf "    ${BOLD}2)${RESET} App Builder     – serverless apps, UI extensions, migrations\n"
  printf "    ${BOLD}3)${RESET} Program         – full program setup (Commerce + App Builder + Orchestrator)\n\n"
  while true; do
    read -rp "  Choice [1-3]: " choice
    case "$choice" in
      1) PLATFORM="commerce";   break ;;
      2) PLATFORM="appbuilder"; break ;;
      3) PLATFORM="program";    break ;;
      *) warn "Enter 1, 2, or 3" ;;
    esac
  done
}

prompt_project_path() {
  local label="$1"
  step "$label"
  while true; do
    read -rp "  Project path (absolute): " raw_path
    local path="${raw_path/#\~/$HOME}"
    if [[ -z "$path" ]]; then
      warn "Path cannot be empty"
    elif [[ ! -d "$path" ]]; then
      warn "Directory not found: $path"
      read -rp "  Create it? [y/N]: " create
      if [[ "$create" =~ ^[Yy]$ ]]; then
        mkdir -p "$path" && PROJECT_PATH="$path" && break
      fi
    else
      PROJECT_PATH="$path"
      break
    fi
  done
}

select_starter_kit() {
  step "App Builder Starter Kit"
  printf "  Select starter kit (cloned into your project directory):\n\n"
  printf "    ${BOLD}1) Integration${RESET}      – Commerce integration starter kit\n"
  printf "    ${BOLD}2) Checkout${RESET}         – Commerce checkout starter kit\n"
  printf "    ${BOLD}3) Not applicable${RESET}   – Skip starter kit (existing or standalone app)\n\n"
  while true; do
    read -rp "  Choice [1-3]: " choice
    case "$choice" in
      1) STARTER_KIT="integration";     break ;;
      2) STARTER_KIT="checkout";        break ;;
      3) STARTER_KIT="not-applicable";  break ;;
      *) warn "Enter 1, 2, or 3" ;;
    esac
  done
}

# ── Clone starter kit ──────────────────────────────────────────────────────────
clone_starter_kit() {
  local kit="$1" project_dir="$2"
  local repo

  case "$kit" in
    integration) repo="$INTEGRATION_KIT_REPO" ;;
    checkout)    repo="$CHECKOUT_KIT_REPO"    ;;
    *)           return 0                       ;;
  esac

  step "Installing $kit starter kit into project"

  local tmp
  tmp="$(mktemp -d)"
  info "Cloning $repo …"
  git clone --depth=1 "$repo" "$tmp/kit" -q || die "Failed to clone $kit starter kit from $repo"

  # Copy contents (including dotfiles, excluding .git) into project root
  rsync -a --exclude='.git' "$tmp/kit/" "$project_dir/"
  rm -rf "$tmp"

  success "Starter kit installed into $project_dir"
  if [[ -f "$project_dir/package.json" ]]; then
    info "Installing starter kit dependencies …"
    npm install --prefix "$project_dir" -q
  fi
}

# ── Write .mcp.json with FluffyJaws MCP for all toolkits ──────────────────────
patch_mcp_config() {
  local dest="$1"
  local mcp_file="$dest/.mcp.json"

  if [[ -f "$mcp_file" ]]; then
    if ! grep -q '"fluffyjaws"' "$mcp_file"; then
      node -e "
        const fs = require('fs');
        const cfg = JSON.parse(fs.readFileSync('$mcp_file', 'utf8'));
        cfg.mcpServers = cfg.mcpServers || {};
        cfg.mcpServers.fluffyjaws = { command: 'fj-mcp', args: ['--api', 'https://api.fluffyjaws.adobe.com'] };
        fs.writeFileSync('$mcp_file', JSON.stringify(cfg, null, 2) + '\n');
      " && success "FluffyJaws MCP merged into existing .mcp.json" || warn "Could not merge FluffyJaws into .mcp.json"
    else
      success "FluffyJaws MCP already present in .mcp.json"
    fi
  else
    cat > "$mcp_file" <<'EOF'
{
  "mcpServers": {
    "fluffyjaws": {
      "command": "fj-mcp",
      "args": ["--api", "https://api.fluffyjaws.adobe.com"]
    }
  }
}
EOF
    success "Wrote .mcp.json with FluffyJaws MCP"
  fi

  # Enable the server in .claude/settings.json if one exists
  local settings_file="$dest/.claude/settings.json"
  if [[ -f "$settings_file" ]] && ! grep -q '"fluffyjaws"' "$settings_file"; then
    node -e "
      const fs = require('fs');
      const cfg = JSON.parse(fs.readFileSync('$settings_file', 'utf8'));
      cfg.enabledMcpjsonServers = [...(cfg.enabledMcpjsonServers || []), 'fluffyjaws'];
      fs.writeFileSync('$settings_file', JSON.stringify(cfg, null, 2) + '\n');
    " || warn "Could not update enabledMcpjsonServers in .claude/settings.json"
  fi
}

# ── Write .commerce-compass config ─────────────────────────────────────────────
write_config() {
  local dest="$1" platform="$2" role="$3" starter_kit="${4:-}"
  local cfg="$dest/.commerce-compass"

  cat > "$cfg" <<EOF
# Commerce Compass – project configuration
# Generated: $(date -u +"%Y-%m-%dT%H:%M:%SZ")
PLATFORM=$platform
ROLE=$role
STARTER_KIT=${starter_kit}
EOF
  success "Wrote .commerce-compass"
}

# ── Commerce setup ─────────────────────────────────────────────────────────────
setup_commerce() {
  ensure_commerce_toolkit
  step "Installing Commerce AI toolkit"
  node "$COMMERCE_TOOLKIT_DIR/scripts/setup-project.mjs" \
    --project "$PROJECT_PATH" --role full \
    || die "setup-project.mjs failed"
  patch_mcp_config "$PROJECT_PATH"
  write_config "$PROJECT_PATH" "commerce" "full"
}

# ── Orchestrator setup ─────────────────────────────────────────────────────────
ensure_orchestrator_toolkit() {
  step "Program Orchestrator toolkit"
  if [[ ! -f "$ORCHESTRATOR_TOOLKIT_DIR/scripts/setup-project.mjs" ]]; then
    die "Orchestrator toolkit not found at $ORCHESTRATOR_TOOLKIT_DIR — is this a complete Commerce Compass install?"
  fi
  if [[ ! -d "$ORCHESTRATOR_TOOLKIT_DIR/node_modules" ]]; then
    info "Installing orchestrator toolkit dependencies …"
    npm install --prefix "$ORCHESTRATOR_TOOLKIT_DIR" -q
  fi
  success "Orchestrator toolkit ready"
}

# ── Program (3-project) setup ─────────────────────────────────────────────────
setup_program() {
  if [[ $non_interactive -eq 0 ]]; then
    step "Program name"
    read -rp "  Program name (e.g. bcc): " PROGRAM_NAME
    [[ -z "$PROGRAM_NAME" ]] && die "Program name cannot be empty"

    step "Commerce project"
    prompt_project_path "Commerce project path"
    COMMERCE_PATH="$PROJECT_PATH"

    step "App Builder project"
    prompt_project_path "App Builder project path"
    APPBUILDER_PATH="$PROJECT_PATH"
    select_starter_kit; AB_STARTER_KIT="$STARTER_KIT"

    step "Orchestrator directory"
    read -rp "  Orchestrator path (will be created if missing): " raw_orch
    ORCHESTRATOR_PATH="${raw_orch/#\~/$HOME}"
    [[ -z "$ORCHESTRATOR_PATH" ]] && die "Orchestrator path cannot be empty"
  else
    AB_STARTER_KIT="${STARTER_KIT:-not-applicable}"
  fi

  mkdir -p "$ORCHESTRATOR_PATH"

  # 1. Install Commerce toolkit
  ensure_commerce_toolkit
  step "Installing Commerce AI toolkit"
  node "$COMMERCE_TOOLKIT_DIR/scripts/setup-project.mjs" \
    --project "$COMMERCE_PATH" --role full \
    || die "Commerce setup-project.mjs failed"
  patch_mcp_config "$COMMERCE_PATH"
  write_config "$COMMERCE_PATH" "commerce" "full" ""

  # 2. Install App Builder toolkit
  ensure_appbuilder_toolkit
  step "Installing App Builder AI toolkit"
  node "$APPBUILDER_TOOLKIT_DIR/scripts/setup-project.mjs" \
    --project "$APPBUILDER_PATH" --role full --type greenfield \
    || die "App Builder setup-project.mjs failed"
  if [[ "$AB_STARTER_KIT" != "not-applicable" ]]; then
    clone_starter_kit "$AB_STARTER_KIT" "$APPBUILDER_PATH"
  fi
  patch_mcp_config "$APPBUILDER_PATH"
  write_config "$APPBUILDER_PATH" "appbuilder" "full" "$AB_STARTER_KIT"

  # 3. Install Orchestrator toolkit
  ensure_orchestrator_toolkit
  step "Installing Program Orchestrator toolkit"
  node "$ORCHESTRATOR_TOOLKIT_DIR/scripts/setup-project.mjs" \
    --project "$ORCHESTRATOR_PATH" \
    --program "$PROGRAM_NAME" \
    --commerce-path "$COMMERCE_PATH" \
    --appbuilder-path "$APPBUILDER_PATH" \
    || die "Orchestrator setup-project.mjs failed"
  patch_mcp_config "$ORCHESTRATOR_PATH"
}

# ── App Builder setup ──────────────────────────────────────────────────────────
setup_appbuilder() {
  ensure_appbuilder_toolkit
  step "Installing App Builder AI toolkit"
  node "$APPBUILDER_TOOLKIT_DIR/scripts/setup-project.mjs" \
    --project "$PROJECT_PATH" --role full \
    || die "setup-project.mjs failed"
  if [[ "$STARTER_KIT" != "not-applicable" ]]; then
    clone_starter_kit "$STARTER_KIT" "$PROJECT_PATH"
  fi
  patch_mcp_config "$PROJECT_PATH"
  write_config "$PROJECT_PATH" "appbuilder" "full" "$STARTER_KIT"
}

# ── Write .context/ doc references into CLAUDE.md ─────────────────────────────
write_context_docs() {
  local project_dir="$1"
  local context_dir="$project_dir/.context"
  local claude_md="$project_dir/CLAUDE.md"

  [[ ! -d "$context_dir" ]] && return 0
  if [[ ! -f "$claude_md" ]]; then
    warn "CLAUDE.md not found in $project_dir — skipping document references"
    return 0
  fi

  local files
  files=$(find "$context_dir" -maxdepth 1 -type f | sort)
  [[ -z "$files" ]] && return 0

  # Idempotent — skip if section already written
  grep -q "## Project Documents" "$claude_md" 2>/dev/null && return 0

  step "Referencing project documents in CLAUDE.md"
  cat >> "$claude_md" << 'DOCS_EOF'

---

## Project Documents

The following reference documents were uploaded during setup.
Read them with the Read tool when they are relevant to the current task.

DOCS_EOF

  while IFS= read -r file; do
    printf -- '- `.context/%s`\n' "$(basename "$file")" >> "$claude_md"
  done <<< "$files"

  success "Project documents referenced in CLAUDE.md ($(echo "$files" | wc -l | tr -d ' ') files)"
}

# ── Summary ────────────────────────────────────────────────────────────────────
show_summary() {
  printf "\n"

  if [[ "$PLATFORM" == "program" ]]; then
    printf "${BOLD}${GREEN}  ✔ Program setup complete${RESET}\n\n"
    printf "  ${BOLD}Program:${RESET}      %s\n" "$PROGRAM_NAME"
    printf "  ${BOLD}Orchestrator:${RESET} %s\n" "$ORCHESTRATOR_PATH"
    printf "  ${BOLD}Commerce:${RESET}     %s\n" "$COMMERCE_PATH"
    printf "  ${BOLD}App Builder:${RESET}  %s\n" "$APPBUILDER_PATH"
    printf "\n  ${BOLD}Next steps:${RESET}\n"
    printf "    1. Architects:       open %s → ${CYAN}claude${RESET} → ${CYAN}/orchestrate-init${RESET}\n" "$ORCHESTRATOR_PATH"
    printf "    2. Commerce devs:    open %s → ${CYAN}claude${RESET} → ${CYAN}/commerce-init${RESET}\n" "$COMMERCE_PATH"
    printf "    3. App Builder devs: open %s → ${CYAN}claude${RESET} → ${CYAN}/appbuilder-init${RESET}\n" "$APPBUILDER_PATH"
    printf "\n"
    return
  fi

  printf "${BOLD}${GREEN}  ✔ Setup complete${RESET}\n\n"
  printf "  ${BOLD}Platform:${RESET} %s\n" "$PLATFORM"
  printf "  ${BOLD}Project:${RESET}  %s\n" "$PROJECT_PATH"
  [[ -n "${STARTER_KIT:-}" && "$STARTER_KIT" != "not-applicable" ]] && \
    printf "  ${BOLD}Starter kit:${RESET} %s\n" "$STARTER_KIT"

  printf "\n  ${BOLD}Next steps:${RESET}\n"
  printf "    1. Open %s in your terminal\n" "$PROJECT_PATH"
  printf "    2. Run: ${CYAN}claude${RESET}\n"

  if [[ "$PLATFORM" == "commerce" ]]; then
    printf "    3. Type: ${CYAN}/commerce-init${RESET}  — select or create a requirement\n"
    printf "    4. Type: ${CYAN}/new-requirement <name>${RESET}  — to start a new module\n"
  else
    printf "    3. Type: ${CYAN}/appbuilder-init${RESET}  — select or create a requirement\n"
    printf "    4. Type: ${CYAN}/new-requirement <name>${RESET}  — to start a new feature\n"
  fi

  printf "\n"
}

# ── Main ───────────────────────────────────────────────────────────────────────
main() {
  local non_interactive=0
  PLATFORM=""
  PROJECT_PATH=""
  STARTER_KIT="not-applicable"

  while [[ $# -gt 0 ]]; do
    case "$1" in
      --ui)
        if ! command -v node &>/dev/null; then
          die "node is required to run the UI — install Node.js >= 18 and retry"
        fi
        exec node "$SCRIPT_DIR/setup-server.js"
        ;;
      --non-interactive)   non_interactive=1 ;;
      --platform)          PLATFORM="$2";           shift ;;
      --project)           PROJECT_PATH="$2";        shift ;;
      --starter-kit)       STARTER_KIT="$2";         shift ;;
      --program-name)      PROGRAM_NAME="$2";        shift ;;
      --commerce-path)     COMMERCE_PATH="$2";       shift ;;
      --appbuilder-path)   APPBUILDER_PATH="$2";     shift ;;
      --orchestrator-path) ORCHESTRATOR_PATH="$2";   shift ;;
      -h|--help)
        printf "Usage:\n"
        printf "  %s --ui\n" "$0"
        printf "  %s [--non-interactive] --platform commerce|appbuilder|program\n" "$0"
        printf "    Single platform:  --project PATH\n"
        printf "    Program:          --program-name NAME\n"
        printf "                      --commerce-path PATH\n"
        printf "                      --appbuilder-path PATH\n"
        printf "                      --orchestrator-path PATH [--starter-kit KIT]\n"
        exit 0
        ;;
      *) warn "Unknown flag: $1" ;;
    esac
    shift
  done

  show_banner
  check_prereqs
  ensure_superpowers

  if [[ $non_interactive -eq 0 ]]; then
    [[ -z "$PLATFORM" ]] && select_platform
    if [[ "$PLATFORM" == "program" ]]; then
      : # setup_program handles its own prompts
    else
      prompt_project_path "Project path"
      [[ "$PLATFORM" == "appbuilder" ]] && select_starter_kit
    fi
  else
    [[ -z "$PLATFORM" ]] && die "--platform is required in non-interactive mode"
    if [[ "$PLATFORM" == "program" ]]; then
      [[ -z "$PROGRAM_NAME"      ]] && die "--program-name is required for program platform"
      [[ -z "$COMMERCE_PATH"     ]] && die "--commerce-path is required for program platform"
      [[ -z "$APPBUILDER_PATH"   ]] && die "--appbuilder-path is required for program platform"
      [[ -z "$ORCHESTRATOR_PATH" ]] && die "--orchestrator-path is required for program platform"
    else
      [[ -z "$PROJECT_PATH" ]] && die "--project is required"
      [[ ! "$PLATFORM" =~ ^(commerce|appbuilder)$ ]] && die "--platform must be 'commerce', 'appbuilder', or 'program'"
    fi
  fi

  case "$PLATFORM" in
    commerce)
      setup_commerce
      write_context_docs "$PROJECT_PATH"
      ;;
    appbuilder)
      setup_appbuilder
      write_context_docs "$PROJECT_PATH"
      ;;
    program)
      setup_program
      write_context_docs "$COMMERCE_PATH"
      write_context_docs "$APPBUILDER_PATH"
      write_context_docs "$ORCHESTRATOR_PATH"
      ;;
    *) die "Unknown platform: $PLATFORM" ;;
  esac

  show_summary
}

main "$@"
