#!/bin/bash

# inkos 监控脚本
# 功能：监控 inkos 守护进程状态，每小时检查工作进度
# 如果进程停止，根据问题修复后重启

LOG_FILE="/tmp/inkos-monitor-$(date +%Y%m%d).log"
PROJECT_DIR="/root/.openclaw/workspace/tomato-novel"
DAEMON_PID_FILE="/tmp/inkos-daemon.pid"

# 记录日志
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 检查 inkos 守护进程是否运行
check_daemon() {
    if pgrep -f "inkos up" > /dev/null; then
        DAEMON_PID=$(pgrep -f "inkos up")
        log "✅ inkos 守护进程运行中 (PID: $DAEMON_PID)"
        echo "$DAEMON_PID" > "$DAEMON_PID_FILE"
        return 0
    else
        log "❌ inkos 守护进程已停止"
        return 1
    fi
}

# 检查工作进度
check_progress() {
    log "📊 检查 inkos 工作进度..."
    
    cd "$PROJECT_DIR" 2>/dev/null || {
        log "错误：无法进入项目目录"
        return 1
    }
    
    # 检查书籍状态
    BOOK_STATUS=$(inkos book list 2>/dev/null)
    if [ $? -eq 0 ]; then
        log "📚 书籍状态：$BOOK_STATUS"
    else
        log "⚠️  无法获取书籍列表"
    fi
    
    # 统计章节数量
    CHAPTER_COUNT=0
    if [ -d "books" ]; then
        for book_dir in books/*/; do
            if [ -d "${book_dir}chapters" ]; then
                COUNT=$(find "${book_dir}chapters" -name "*.md" -o -name "*.json" 2>/dev/null | wc -l)
                BOOK_NAME=$(basename "$book_dir")
                CHAPTER_COUNT=$((CHAPTER_COUNT + COUNT))
                log "  📖 书籍 '$BOOK_NAME': $COUNT 个章节"
                
                # 显示最新章节
                LATEST_CHAPTER=$(find "${book_dir}chapters" -name "*.md" 2>/dev/null | sort | tail -1)
                if [ -n "$LATEST_CHAPTER" ]; then
                    CHAPTER_NAME=$(basename "$LATEST_CHAPTER" .md)
                    log "    最新章节: $CHAPTER_NAME"
                    
                    # 显示章节字数
                    if [ -f "$LATEST_CHAPTER" ]; then
                        WORD_COUNT=$(wc -w < "$LATEST_CHAPTER" 2>/dev/null)
                        CHAR_COUNT=$(wc -m < "$LATEST_CHAPTER" 2>/dev/null)
                        log "    字数: ${WORD_COUNT}字 (${CHAR_COUNT}字符)"
                    fi
                fi
            fi
        done
    fi
    
    log "📈 总计章节: $CHAPTER_COUNT"
    
    # 检查守护进程日志
    if [ -f "/tmp/inkos-daemon.log" ]; then
        LOG_LINES=$(tail -5 "/tmp/inkos-daemon.log" 2>/dev/null)
        if [ -n "$LOG_LINES" ]; then
            log "📝 最近日志："
            echo "$LOG_LINES" | while IFS= read -r line; do
                log "  $line"
            done
        fi
    fi
    
    return 0
}

# 修复常见问题
fix_issues() {
    log "🔧 诊断并修复问题..."
    
    cd "$PROJECT_DIR" 2>/dev/null || {
        log "错误：无法进入项目目录"
        return 1
    }
    
    # 1. 检查 API 配置
    if [ ! -f ".env" ]; then
        log "⚠️  缺少 .env 配置文件，正在创建..."
        cat > .env << 'EOF'
# LLM Configuration
INKOS_LLM_PROVIDER=custom
INKOS_LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/coding/v3
INKOS_LLM_API_KEY=63589785-b399-47dd-8423-d2433938f169
INKOS_LLM_MODEL=deepseek-v3.2
EOF
        log "✅ .env 文件已创建"
    else
        log "✅ .env 配置文件存在"
    fi
    
    # 2. 检查书籍目录
    if [ ! -d "books" ]; then
        log "⚠️  缺少 books 目录，正在创建..."
        mkdir -p books
    fi
    
    # 3. 检查 inkos 配置
    if ! inkos status > /dev/null 2>&1; then
        log "⚠️  inkos 配置有问题，尝试修复..."
        # 重新初始化项目
        if [ -f "inkos.json" ]; then
            log "✅ inkos.json 存在，项目结构正常"
        else
            log "❌ inkos.json 不存在，可能需要重新初始化"
        fi
    fi
    
    # 4. 检查章节文件完整性
    for book_dir in books/*/; do
        if [ -d "$book_dir" ]; then
            CHAPTER_DIR="${book_dir}chapters"
            if [ ! -d "$CHAPTER_DIR" ]; then
                log "⚠️  书籍 $(basename "$book_dir") 缺少 chapters 目录，正在创建..."
                mkdir -p "$CHAPTER_DIR"
            fi
        fi
    done
    
    log "🔧 修复完成"
}

# 重启守护进程
restart_daemon() {
    log "🔄 重启 inkos 守护进程..."
    
    # 停止现有进程
    if pgrep -f "inkos up" > /dev/null; then
        log "停止现有 inkos 进程..."
        pkill -f "inkos up"
        sleep 2
    fi
    
    # 修复问题
    fix_issues
    
    # 启动新进程
    log "启动 inkos 守护进程..."
    cd "$PROJECT_DIR" && nohup inkos up > /tmp/inkos-daemon.log 2>&1 &
    
    # 等待启动
    sleep 5
    
    # 验证启动
    if check_daemon; then
        log "✅ inkos 守护进程重启成功"
        return 0
    else
        log "❌ inkos 守护进程启动失败"
        return 1
    fi
}

# 主监控函数
main_monitor() {
    log "="*60
    log "🦠 inkos 监控开始运行"
    
    # 检查守护进程
    if ! check_daemon; then
        log "⚠️  检测到 inkos 守护进程停止，正在尝试修复并重启..."
        if restart_daemon; then
            log "✅ 修复重启成功"
        else
            log "❌ 修复重启失败，可能需要人工干预"
        fi
    else
        log "✅ inkos 守护进程正常运行"
    fi
    
    # 检查工作进度
    check_progress
    
    log "🦠 inkos 监控运行完成"
    log "="*60
}

# 执行监控
main_monitor