#!/bin/bash
# inkos质量监控和服务脚本
# 在inkos启动前检查配置，启动后监控输出质量

set -e

INKOS_DIR="/root/.openclaw/workspace/tomato-novel"
BOOKS_DIR="$INKOS_DIR/books"
CONFIG_FILE="$INKOS_DIR/inkos_format_config.json"
MONITOR_SCRIPT="$INKOS_DIR/scripts/format_check_fix.py"
LOG_DIR="$INKOS_DIR/logs"

# 创建日志目录
mkdir -p "$LOG_DIR"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查inkos是否已安装
check_inkos_installation() {
    if command -v inkos &> /dev/null; then
        print_success "inkos已安装"
        inkos --version
        return 0
    else
        print_error "inkos未安装"
        exit 1
    fi
}

# 检查配置
check_configuration() {
    print_info "检查配置..."
    
    if [ -f "$CONFIG_FILE" ]; then
        print_success "格式配置文件存在: $CONFIG_FILE"
        
        # 验证配置文件格式
        if python3 -m json.tool "$CONFIG_FILE" > /dev/null 2>&1; then
            print_success "配置文件格式正确"
        else
            print_error "配置文件格式错误"
            exit 1
        fi
    else
        print_error "配置文件不存在: $CONFIG_FILE"
        exit 1
    fi
    
    if [ -f "$MONITOR_SCRIPT" ]; then
        print_success "监控脚本存在: $MONITOR_SCRIPT"
    else
        print_error "监控脚本不存在: $MONITOR_SCRIPT"
        exit 1
    fi
}

# 检查项目目录
check_project_directories() {
    print_info "检查项目目录..."
    
    if [ -d "$INKOS_DIR" ]; then
        print_success "inkos项目目录存在: $INKOS_DIR"
    else
        print_error "inkos项目目录不存在: $INKOS_DIR"
        exit 1
    fi
    
    if [ -d "$BOOKS_DIR" ]; then
        print_success "书籍目录存在: $BOOKS_DIR"
    else
        print_error "书籍目录不存在: $BOOKS_DIR"
        exit 1
    fi
}

# 修复现有章节
fix_existing_chapters() {
    print_info "修复现有章节格式..."
    
    # 为每个书籍目录执行修复
    for book_dir in "$BOOKS_DIR"/*; do
        if [ -d "$book_dir" ] && [ -d "$book_dir/chapters" ]; then
            book_name=$(basename "$book_dir")
            print_info "修复书籍: $book_name"
            
            # 检查当前书籍是否有第2-14章
            chapters_dir="$book_dir/chapters"
            if [ -d "$chapters_dir" ]; then
                python3 "$MONITOR_SCRIPT" fix --directory "$chapters_dir" 2>&1 | tee -a "$LOG_DIR/fix_${book_name}_$(date +%Y%m%d).log"
            fi
        fi
    done
    
    print_success "现有章节修复完成"
}

# 启动质量监控
start_quality_monitor() {
    print_info "启动质量监控服务..."
    
    # 启动监控进程
    python3 "$MONITOR_SCRIPT" monitor --directory "$BOOKS_DIR" > "$LOG_DIR/monitor_$(date +%Y%m%d_%H%M%S).log" 2>&1 &
    MONITOR_PID=$!
    
    echo $MONITOR_PID > "$LOG_DIR/quality_monitor.pid"
    print_success "质量监控服务已启动 (PID: $MONITOR_PID)"
    
    # 输出监控信息
    print_info "监控服务日志: $LOG_DIR/monitor_*.log"
    print_info "监控PID文件: $LOG_DIR/quality_monitor.pid"
}

# 启动inkos
start_inkos() {
    print_info "启动inkos..."
    
    # 切换到项目目录
    cd "$INKOS_DIR"
    
    # 启动inkos
    print_info "正在启动inkos守护进程..."
    inkos up 2>&1 | tee -a "$LOG_DIR/inkos_startup_$(date +%Y%m%d_%H%M%S).log" &
    INKOS_PID=$!
    
    echo $INKOS_PID > "$LOG_DIR/inkos.pid"
    print_success "inkos守护进程已启动 (PID: $INKOS_PID)"
    
    # 等待inkos启动完成
    sleep 10
    
    # 检查inkos状态
    inkos status
}

# 显示状态
show_status() {
    print_info "系统状态:"
    
    # 检查监控服务
    if [ -f "$LOG_DIR/quality_monitor.pid" ] && ps -p $(cat "$LOG_DIR/quality_monitor.pid") > /dev/null 2>&1; then
        print_success "质量监控服务运行中 (PID: $(cat $LOG_DIR/quality_monitor.pid))"
    else
        print_warning "质量监控服务未运行"
    fi
    
    # 检查inkos进程
    if [ -f "$LOG_DIR/inkos.pid" ] && ps -p $(cat "$LOG_DIR/inkos.pid") > /dev/null 2>&1; then
        print_success "inkos守护进程运行中 (PID: $(cat $LOG_DIR/inkos.pid）)"
        inkos status
    else
        print_warning "inkos守护进程未运行"
    fi
    
    # 显示最近日志
    print_info "最近日志文件："
    ls -la "$LOG_DIR"/*.log | head -5
}

# 停止服务
stop_services() {
    print_info "停止服务..."
    
    # 停止inkos
    if [ -f "$LOG_DIR/inkos.pid" ]; then
        pid=$(cat "$LOG_DIR/inkos.pid")
        if ps -p "$pid" > /dev/null 2>&1; then
            kill "$pid"
            print_success "inkos守护进程已停止（PID：$pid）"
        fi
        rm -f "$LOG_DIR/inkos.pid"
    fi
    
    # 停止质量监控
    if [ -f "$LOG_DIR/quality_monitor.pid" ]; then
        pid=$(cat "$LOG_DIR/quality_monitor.pid")
        if ps -p "$pid" > /dev/null 2>&1; then
            kill "$pid"
            print_success "质量监控服务已停止（PID：$pid）"
        fi
        rm -f "$LOG_DIR/quality_monitor.pid"
    fi
    
    print_success "所有服务已停止"
}

# 主函数
main() {
    print_info "inkos质量监控系统启动..."
    
    echo "=============================================="
    
    case "${1:-start}" in
        start)
            check_inkos_installation
            check_configuration
            check_project_directories
            fix_existing_chapters
            start_quality_monitor
            start_inkos
            print_success"系统启动完成"
            show_status
        ;;
        
        stop)
            stop_services
        ;;
        
        restart)
            stop_services
            sleep 2
            check_inkos_installation
            check_configuration
            check_project_directories
            start_quality_monitor
            start_inkos
            print_success"系统重启完成"
            show_status
        ;;
        
        status)
            show_status
        ;;
        
        fix)
            fix_existing_chapters
        ;;
        
        *)
            echo "用法：$0 {start|stop|restart|status|fix}"
            exit 1
        ;;
    esac
    
    echo"=============================================="
}

# 运行主函数
main"$@"