#!/bin/bash
# kimi-index — Kimi CLI 代码索引一键管理脚本
# 项目地址: https://github.com/<GITHUB_USERNAME>/kimi-dev-workflow
# 用法: kimi-index [start|stop|status|search "query"|reset|reindex|logs|use <provider>|setup-onnx]

set -e

INDEX_DIR=".grepai"
GREPAI_BIN="${HOME}/.local/bin/grepai"
OLLAMA_HOST="http://localhost:11434"
ONNX_HOST="http://127.0.0.1:11435"

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

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_ok()   { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_err()  { echo -e "${RED}[ERR]${NC} $1"; }

check_grepai() {
    if ! command -v grepai &> /dev/null; then
        if [ -x "$GREPAI_BIN" ]; then
            export PATH="${HOME}/.local/bin:$PATH"
        else
            log_err "grepai 未安装"
            echo "  安装: curl -fsSL https://raw.githubusercontent.com/yoanbernabeu/grepai/main/install.sh | INSTALL_DIR=\$HOME/.local/bin sh"
            exit 1
        fi
    fi
}

get_endpoint() {
    local endpoint=""
    if [ -f "$INDEX_DIR/config.yaml" ]; then
        endpoint=$(grep -A1 "^    endpoint:" "$INDEX_DIR/config.yaml" 2>/dev/null | tail -1 | sed 's/^[[:space:]]*//' || echo "")
    fi
    if [ -z "$endpoint" ]; then
        endpoint="$OLLAMA_HOST"
    fi
    echo "$endpoint"
}

check_ollama() {
    if ! curl -s "$OLLAMA_HOST/api/tags" > /dev/null 2>&1; then
        log_warn "Ollama 未运行，尝试启动..."
        if command -v ollama &> /dev/null; then
            export OLLAMA_NUM_PARALLEL=4
            ollama serve > /tmp/ollama-serve.log 2>&1 &
            local pid=$!
            sleep 3
            if ! curl -s "$OLLAMA_HOST/api/tags" > /dev/null 2>&1; then
                log_err "Ollama 启动失败"
                exit 1
            fi
            log_ok "Ollama 已启动 (PID: $pid)"
        else
            log_err "Ollama 未安装"
            echo "  https://ollama.com/download"
            exit 1
        fi
    fi
}

check_model() {
    local model="${1:-all-minilm:l6-v2}"
    if ! curl -s "$OLLAMA_HOST/api/tags" | grep -q "$model"; then
        log_warn "模型 $model 未下载，正在拉取..."
        ollama pull "$model"
        log_ok "模型 $model 已就绪"
    fi
}

check_project() {
    if [ ! -d "$INDEX_DIR" ]; then
        log_warn "当前目录未初始化 grepai"
        echo "  运行: grepai init"
        exit 1
    fi
}

cleanup_locks() {
    if [ -d "$INDEX_DIR" ]; then
        local count=$(find "$INDEX_DIR" -name "*.lock" -type f 2>/dev/null | wc -l)
        if [ "$count" -gt 0 ]; then
            rm -f "$INDEX_DIR"/*.lock
            log_warn "已清理 $count 个残留锁文件"
        fi
    fi
}

cmd_start() {
    log_info "启动 Kimi 代码索引..."
    check_grepai
    check_project
    cleanup_locks
    
    local endpoint=$(get_endpoint)
    if [[ "$endpoint" == *"localhost:11434"* ]] || [[ "$endpoint" == *"127.0.0.1:11434"* ]]; then
        # Ollama mode
        check_ollama
        local model=$(grep -A1 "^    model:" "$INDEX_DIR/config.yaml" 2>/dev/null | tail -1 | sed 's/^[[:space:]]*//' || echo "nomic-embed-text")
        check_model "$model"
    else
        # Non-Ollama mode (ONNX, OpenAI, LMStudio, etc.)
        log_info "使用后端: $endpoint"
        if ! curl -s "$endpoint/api/tags" > /dev/null 2>&1; then
            log_warn "后端服务未响应: $endpoint"
            if [[ "$endpoint" == *":11435"* ]]; then
                echo "  ONNX 服务未运行，请先执行: kimi-dev index serve-onnx"
            fi
            exit 1
        fi
    fi
    
    export PATH="${HOME}/.local/bin:$PATH"
    export OLLAMA_NUM_PARALLEL=4
    nohup grepai watch > /tmp/grepai-watch.log 2>&1 &
    local pid=$!
    
    sleep 2
    if ps -p $pid > /dev/null 2>&1; then
        log_ok "索引守护进程已启动！PID: $pid"
        
        # Also start wiki auto-watch if available
        if command -v kimi-dev &> /dev/null; then
            log_info "正在启动 Wiki 自动监控..."
            if kimi-dev wiki watch start 2>/dev/null; then
                log_ok "Wiki 自动监控已启动"
            else
                log_warn "Wiki 自动监控启动失败（可手动运行: kimi-dev wiki watch start）"
            fi
        fi
        
        echo ""
        echo "  📊 查看进度: tail -f /tmp/grepai-watch.log"
        echo "  🔍 查看状态: kimi-index status"
        echo "  💡 开始开发: cd $(pwd) && kimi"
        echo ""
        sleep 3
        cmd_status
    else
        log_err "启动失败"
        echo "  tail -f /tmp/grepai-watch.log"
        exit 1
    fi
}

cmd_stop() {
    log_info "停止索引监听..."
    local found=0
    if pgrep -f "grepai watch" > /dev/null 2>&1; then
        pkill -f "grepai watch" 2>/dev/null || true
        log_ok "索引进程已停止"
        found=1
    fi
    
    # Also stop wiki auto-watch
    if command -v kimi-dev &> /dev/null; then
        if kimi-dev wiki watch stop 2>/dev/null; then
            log_ok "Wiki 自动监控已停止"
        fi
    fi
    
    cleanup_locks
    [ "$found" -eq 0 ] && log_warn "没有找到运行中的索引进程"
}

cmd_status() {
    if [ ! -d "$INDEX_DIR" ]; then
        log_warn "当前目录未初始化索引"
        return 1
    fi
    
    echo ""
    echo "┌─────────────────────────────────────────┐"
    echo "│         Kimi 代码索引状态               │"
    echo "├─────────────────────────────────────────┤"
    
    if pgrep -f "grepai watch" > /dev/null 2>&1; then
        echo "│ 🟢 守护进程    运行中                   │"
    else
        echo "│ 🔴 守护进程    未运行                   │"
    fi
    
    if grepai status 2>/dev/null | grep -q "indexed"; then
        grepai status 2>/dev/null | head -6 | sed 's/^/│ /'
    else
        echo "│ ⚪ 索引数据    未建立                     │"
    fi
    
    echo "│                                         │"
    echo "│ 项目: $(basename "${PWD}")"
    echo "└─────────────────────────────────────────┘"
    echo ""
}

cmd_search() {
    check_grepai; check_project
    [ $# -eq 0 ] && { log_err "用法: kimi-index search \"关键词\""; exit 1; }
    log_info "搜索: $*"
    echo ""
    grepai search "$*"
}

cmd_reset() {
    local force=0
    [ "$1" = "--force" ] || [ "$1" = "-f" ] && force=1
    
    if [ "$force" -eq 0 ]; then
        log_warn "即将删除所有索引数据！"
        echo "  当前目录: ${PWD}"
        echo "  输入 'yes' 确认:"
        read -r confirm
        [ "$confirm" != "yes" ] && { log_info "已取消"; return 0; }
    fi
    
    cmd_stop
    [ -d "$INDEX_DIR" ] && rm -f "$INDEX_DIR"/*.gob "$INDEX_DIR"/*.lock 2>/dev/null || true
    log_ok "索引数据已清除"
}

cmd_reindex() {
    log_info "重新索引..."
    cmd_stop
    [ -d "$INDEX_DIR" ] && rm -f "$INDEX_DIR"/*.gob "$INDEX_DIR"/*.lock 2>/dev/null || true
    cmd_start
}

cmd_logs() {
    if [ -f /tmp/grepai-watch.log ]; then
        log_info "索引日志:"
        tail -20 /tmp/grepai-watch.log
    else
        log_warn "暂无日志"
    fi
}

cmd_use() {
    [ $# -eq 0 ] && { log_err "用法: kimi-index use <provider>"; exit 1; }
    if command -v kimi-dev &> /dev/null; then
        kimi-dev index use "$1"
    else
        log_err "kimi-dev 未安装，无法切换 provider"
        exit 1
    fi
}

cmd_setup_onnx() {
    if command -v kimi-dev &> /dev/null; then
        kimi-dev index setup-onnx
    else
        log_err "kimi-dev 未安装"
        exit 1
    fi
}

cmd_help() {
    cat << 'EOF'

  kimi-index — Kimi CLI 代码索引管理

  用法:
    kimi-index start              启动索引监听（后台）
    kimi-index stop               停止索引监听
    kimi-index status             查看索引状态
    kimi-index search "xxx"       手动语义搜索
    kimi-index reset              重置索引数据
    kimi-index reset -f           强制重置（免确认）
    kimi-index reindex            重置并重新索引
    kimi-index logs               查看索引日志
    kimi-index use <provider>     切换 Embedding 引擎
    kimi-index setup-onnx         下载 ONNX 模型
    kimi-index help               帮助

  支持的 provider:
    ollama, onnx, openai, lmstudio, openrouter

EOF
}

main() {
    local cmd="${1:-help}"
    case "$cmd" in
        start)     cmd_start ;;
        stop)      cmd_stop ;;
        status)    cmd_status ;;
        search)    shift; cmd_search "$@" ;;
        reset)     shift; cmd_reset "$@" ;;
        reindex)   cmd_reindex ;;
        logs)      cmd_logs ;;
        use)       shift; cmd_use "$@" ;;
        setup-onnx) cmd_setup_onnx ;;
        help|--help|-h) cmd_help ;;
        *) log_err "未知命令: $cmd"; cmd_help; exit 1 ;;
    esac
}

main "$@"
