#!/usr/bin/env bash
# ReqFlow 安装脚本
# 用法: ./install.sh [claude-code|codex|cursor|copilot|all]

set -euo pipefail

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

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

info() { echo -e "${GREEN}[信息]${NC} $*"; }
warn() { echo -e "${YELLOW}[警告]${NC} $*"; }
error() { echo -e "${RED}[错误]${NC} $*" >&2; }

setup_python_venv() {
    local python_dir="$1"
    local venv_python="$python_dir/.venv/bin/python3"

    if [ -f "$venv_python" ]; then
        return 0
    fi

    local python_cmd=""
    if command -v python3 &>/dev/null; then
        python_cmd="python3"
    elif command -v python &>/dev/null; then
        python_cmd="python"
    else
        warn "Python 3 未找到，跳过 Python 环境安装"
        warn "请手动安装 Python 3.10+ 后重新运行"
        return 1
    fi

    info "设置 Python 环境..."
    "$python_cmd" -m venv "$python_dir/.venv" || { warn "创建 venv 失败"; return 1; }
    "$python_dir/.venv/bin/pip" install --upgrade pip 2>/dev/null || true
    "$python_dir/.venv/bin/pip" install -e "$python_dir[mcp]" 2>/dev/null || {
        warn "pip install 失败，请手动运行: cd $python_dir && .venv/bin/pip install -e '.[mcp]'"
        return 1
    }
    info "Python 环境就绪"
}

install_claude_code() {
    local cache_target="$HOME/.claude/plugins/cache/local/reqflow/latest"
    local mp_target="$HOME/.claude/plugins/marketplaces/local/plugins/reqflow"
    info "安装到 Claude Code: $mp_target"

    # 清理旧安装
    rm -rf "$HOME/.claude/plugins/local/reqflow" 2>/dev/null || true

    # 拷贝到 cache 和 marketplace
    for target in "$cache_target" "$mp_target"; do
        mkdir -p "$target/.claude-plugin" "$target/skills" "$target/python" "$target/commands"
        cp -r "$REQFLOW_DIR/plugins/claude-code/.claude-plugin/"* "$target/.claude-plugin/"
        cp -r "$REQFLOW_DIR/skills/"* "$target/skills/"
        # 安装 slash commands（优先从顶层 commands/，回退到 python/reqflow/commands/）
        if [ -d "$REQFLOW_DIR/commands" ]; then
            cp -r "$REQFLOW_DIR/commands/"* "$target/commands/"
        elif [ -d "$REQFLOW_DIR/python/reqflow/commands" ]; then
            cp -r "$REQFLOW_DIR/python/reqflow/commands/"* "$target/commands/"
        fi
        # Claude Code 使用 .mcp.json（带点前缀），替换变量
        sed "s|\${CLAUDE_PLUGIN_ROOT}|$target|g; s|\${PLUGIN_DIR}|$target|g" "$REQFLOW_DIR/mcp.json" > "$target/.mcp.json"
        cp -r "$REQFLOW_DIR/python/"* "$target/python/"
        sed -i '' "s|\${PLUGIN_DIR}|$target|g" "$target/.claude-plugin/plugin.json" 2>/dev/null || true
    done

    # 在 cache 的 .claude-plugin/ 中创建 marketplace.json
    cat > "$cache_target/.claude-plugin/marketplace.json" <<MPEOF
{
  "name": "reqflow",
  "owner": { "name": "ReqFlow Maintainers" },
  "metadata": { "description": "从需求到交付的 AI Engineering Harness", "version": "3.1.0" },
  "plugins": [
    {
      "name": "reqflow",
      "description": "从需求到交付的 AI Engineering Harness：上下文管理、工具系统、执行编排、状态记忆、评估观测、约束恢复",
      "source": "./"
    }
  ]
}
MPEOF

    # 创建 marketplace root marketplace.json
    local mp_root="$HOME/.claude/plugins/marketplaces/local"
    mkdir -p "$mp_root/.claude-plugin"
    cat > "$mp_root/.claude-plugin/marketplace.json" <<MPEOF
{
  "name": "local",
  "owner": { "name": "Local" },
  "metadata": { "description": "Local plugins", "version": "1.0.0" },
  "plugins": [
    {
      "name": "reqflow",
      "description": "从需求到交付的 AI Engineering Harness：上下文管理、工具系统、执行编排、状态记忆、评估观测、约束恢复",
      "source": "./plugins/reqflow"
    }
  ]
}
MPEOF

    # 创建插件目录 marketplace.json
    mkdir -p "$mp_target/.claude-plugin"
    cat > "$mp_target/.claude-plugin/marketplace.json" <<MPEOF
{
  "name": "reqflow",
  "owner": { "name": "ReqFlow Maintainers" },
  "metadata": { "description": "从需求到交付的 AI Engineering Harness", "version": "3.1.0" },
  "plugins": [
    {
      "name": "reqflow",
      "description": "从需求到交付的 AI Engineering Harness：上下文管理、工具系统、执行编排、状态记忆、评估观测、约束恢复",
      "source": "./"
    }
  ]
}
MPEOF

    # 注册 marketplace
    local known="$HOME/.claude/plugins/known_marketplaces.json"
    if [ -f "$known" ] && ! grep -q '"local"' "$known" 2>/dev/null; then
        python3 -c "
import json
with open('$known') as f: d = json.load(f)
d['local'] = {'source': {'source': 'directory', 'path': '$mp_root'}, 'installLocation': '$mp_root', 'lastUpdated': '$(date -u +%Y-%m-%dT%H:%M:%SZ)'}
with open('$known', 'w') as f: json.dump(d, f, indent=2); f.write('\n')
" 2>/dev/null || true
        info "已注册 Claude Code marketplace"
    fi

    # 注册 plugin
    local installed="$HOME/.claude/plugins/installed_plugins.json"
    if [ -f "$installed" ]; then
        python3 -c "
import json
with open('$installed') as f: d = json.load(f)
if 'reqflow@local' not in d.get('plugins', {}):
    d['plugins']['reqflow@local'] = [{'scope': 'user', 'installPath': '$cache_target', 'version': '3.1.0', 'installedAt': '$(date -u +%Y-%m-%dT%H:%M:%SZ)', 'lastUpdated': '$(date -u +%Y-%m-%dT%H:%M:%SZ)'}]
    with open('$installed', 'w') as f: json.dump(d, f, indent=2); f.write('\n')
    print('已注册到 Claude Code 插件列表')
" 2>/dev/null || true
    fi

    setup_python_venv "$cache_target/python"

    info "Claude Code 安装完成"
}

install_codex() {
    local cache_target="$HOME/.codex/plugins/cache/local/reqflow/latest"
    local mp_target="$HOME/.codex/plugins/marketplaces/local/plugins/reqflow"
    info "安装到 Codex: $mp_target"

    # 清理旧的直接安装
    rm -rf "$HOME/.codex/plugins/reqflow" 2>/dev/null || true

    # 拷贝到 cache 和 marketplace
    for target in "$cache_target" "$mp_target"; do
        mkdir -p "$target/.codex-plugin" "$target/skills" "$target/python"
        cp -r "$REQFLOW_DIR/plugins/codex/.codex-plugin/"* "$target/.codex-plugin/"
        cp -r "$REQFLOW_DIR/skills/"* "$target/skills/"
        cp "$REQFLOW_DIR/mcp.json" "$target/"
        cp -r "$REQFLOW_DIR/python/"* "$target/python/"
        sed -i '' "s|\${PLUGIN_DIR}|$target|g" "$target/.codex-plugin/plugin.json" 2>/dev/null || true
        # Codex 需要 .mcp.json（带点前缀，mcpServers 格式）
        cat > "$target/.mcp.json" <<MCPEOF
{
  "mcpServers": {
    "reqflow": {
      "command": "$target/python/.venv/bin/python3",
      "args": ["-m", "reqflow.runner.mcp_server"],
      "env": { "PYTHONPATH": "$target/python" }
    }
  }
}
MCPEOF
    done

    # 创建 marketplace.json
    local mp_root="$HOME/.codex/plugins/marketplaces/local"
    mkdir -p "$mp_root/.agents/plugins"
    cat > "$mp_root/.agents/plugins/marketplace.json" <<MPEOF
{
  "name": "local",
  "interface": { "displayName": "Local Plugins" },
  "plugins": [
    {
      "name": "reqflow",
      "source": { "source": "local", "path": "./plugins/reqflow" },
      "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
      "category": "Productivity"
    }
  ]
}
MPEOF

    # 注册到 config.toml
    local config="$HOME/.codex/config.toml"
    if [ ! -f "$config" ] || ! grep -q 'reqflow@local' "$config" 2>/dev/null; then
        local mp_root="$HOME/.codex/plugins/marketplaces/local"
        {
            echo ""
            echo "[marketplaces.local]"
            echo "last_updated = \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""
            echo "source = \"$mp_root\""
            echo "source_type = \"local\""
            echo ""
            echo '[plugins."reqflow@local"]'
            echo "enabled = true"
        } >> "$config"
        info "已注册到 Codex 配置"
    fi

    setup_python_venv "$cache_target/python"

    info "Codex 安装完成"
}

install_cursor() {
    local target="$HOME/.cursor/plugins/reqflow"
    info "安装到 Cursor: $target"

    mkdir -p "$target/.cursor-plugin" "$target/skills" "$target/python"
    cp -r "$REQFLOW_DIR/plugins/cursor/.cursor-plugin/"* "$target/.cursor-plugin/"
    cp -r "$REQFLOW_DIR/skills/"* "$target/skills/"
    cp "$REQFLOW_DIR/mcp.json" "$target/"
    cp -r "$REQFLOW_DIR/python/"* "$target/python/"
    sed -i '' "s|\${PLUGIN_DIR}|$target|g" "$target/.cursor-plugin/plugin.json" 2>/dev/null || true

    setup_python_venv "$target/python"

    info "Cursor 安装完成"
}

install_copilot() {
    info "生成 Copilot MCP 配置片段:"
    echo ""
    echo '  在 .vscode/settings.json 中添加:'
    echo '  {'
    echo '    "github.copilot.chat.mcp.servers": {'
    echo '      "reqflow": {'
    echo "        \"command\": \"python3\","
    echo "        \"args\": [\"-m\", \"reqflow.runner.mcp_server\"],"
    echo "        \"cwd\": \"$REQFLOW_DIR/python\""
    echo '      }'
    echo '    }'
    echo '  }'
    echo ""
}

install_all() {
    install_claude_code
    echo ""
    install_codex
    echo ""
    install_cursor
    echo ""
    install_copilot
}

if [ $# -eq 0 ]; then
    echo "用法: $0 [claude-code|codex|cursor|copilot|all]"
    echo ""
    echo "平台:"
    echo "  claude-code  安装到 Claude Code"
    echo "  codex        安装到 Codex"
    echo "  cursor       安装到 Cursor"
    echo "  copilot      生成 Copilot MCP 配置"
    echo "  all          安装到所有平台"
    exit 1
fi

case "$1" in
    claude-code) install_claude_code ;;
    codex)       install_codex ;;
    cursor)      install_cursor ;;
    copilot)     install_copilot ;;
    all)         install_all ;;
    *)
        error "未知平台: $1"
        echo "支持的平台: claude-code, codex, cursor, copilot, all"
        exit 1
        ;;
esac
