#!/bin/bash

# 爱维宠物医院管理平台 - 打包启动一条龙脚本
# 使用 IntelliJ IDEA 内置 JDK 和 Maven
# 支持 IDEA 和 IDEA CE 版本

# 查找 IDEA 安装路径
if [ -d "/Applications/IntelliJ IDEA.app" ]; then
    IDEA_HOME="/Applications/IntelliJ IDEA.app"
elif [ -d "/Applications/IntelliJ IDEA CE.app" ]; then
    IDEA_HOME="/Applications/IntelliJ IDEA CE.app"
else
    echo "❌ 错误: 未找到 IntelliJ IDEA 安装目录"
    echo "请确保 IDEA 安装在 /Applications 目录下"
    exit 1
fi

# 设置 IDEA 内置 JDK
export JAVA_HOME="$IDEA_HOME/Contents/jbr/Contents/Home"
export PATH="$JAVA_HOME/bin:$PATH"

# 设置 IDEA 内置 Maven
MAVEN_BIN="$IDEA_HOME/Contents/plugins/maven/lib/maven3/bin/mvn"

if [ ! -f "$MAVEN_BIN" ]; then
    echo "❌ 错误: 未找到 IDEA 内置 Maven"
    exit 1
fi

# 脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"

# 默认配置
JAR_NAME="pet-hospital-1.0.0.jar"
JAR_PATH="target/$JAR_NAME"
SERVER_PORT="8080"
ACTIVE_PROFILE="dev"
SKIP_TESTS="-DskipTests"
BACKGROUND=false
DEBUG_MODE=false
JVM_OPTS="-Xms512m -Xmx1g"

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

# 显示帮助信息
show_help() {
    echo "爱维宠物医院管理平台 - 打包启动脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -p, --port PORT       指定服务端口号 (默认: 8080)"
    echo "  -e, --env ENV         指定环境配置 (默认: dev, 可选: dev/prod)"
    echo "  -t, --test            运行测试 (默认跳过测试)"
    echo "  -b, --background      后台运行"
    echo "  -d, --debug           开启调试模式 (端口: 5005)"
    echo "  -c, --clean           仅清理，不打包"
    echo "  -s, --stop            停止正在运行的服务"
    echo "  -l, --logs            查看后台运行日志"
    echo "  -h, --help            显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0                    # 打包并启动"
    echo "  $0 -p 8081            # 使用端口 8081 启动"
    echo "  $0 -e prod            # 使用生产环境配置"
    echo "  $0 -b                 # 后台运行"
    echo "  $0 -d                 # 调试模式"
    echo "  $0 -s                 # 停止服务"
    echo "  $0 -l                 # 查看日志"
}

# 解析参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -p|--port)
            SERVER_PORT="$2"
            shift 2
            ;;
        -e|--env)
            ACTIVE_PROFILE="$2"
            shift 2
            ;;
        -t|--test)
            SKIP_TESTS=""
            shift
            ;;
        -b|--background)
            BACKGROUND=true
            shift
            ;;
        -d|--debug)
            DEBUG_MODE=true
            shift
            ;;
        -c|--clean)
            echo "🧹 清理项目..."
            "$MAVEN_BIN" clean
            echo "✅ 清理完成"
            exit 0
            ;;
        -s|--stop)
            echo "🛑 停止服务..."
            PID=$(lsof -ti:$SERVER_PORT 2>/dev/null || echo "")
            if [ -n "$PID" ]; then
                kill $PID 2>/dev/null
                sleep 2
                if ps -p $PID > /dev/null 2>&1; then
                    kill -9 $PID 2>/dev/null
                fi
                echo "✅ 服务已停止 (端口: $SERVER_PORT)"
            else
                # 尝试通过进程名查找
                PID=$(pgrep -f "$JAR_NAME" | head -1)
                if [ -n "$PID" ]; then
                    kill $PID 2>/dev/null
                    sleep 2
                    if ps -p $PID > /dev/null 2>&1; then
                        kill -9 $PID 2>/dev/null
                    fi
                    echo "✅ 服务已停止"
                else
                    echo "⚠️  未找到运行中的服务"
                fi
            fi
            exit 0
            ;;
        -l|--logs)
            if [ -f "$SCRIPT_DIR/app.log" ]; then
                echo "📋 查看日志 (按 Ctrl+C 退出)..."
                tail -f "$SCRIPT_DIR/app.log"
            else
                echo "❌ 未找到日志文件"
            fi
            exit 0
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo "❌ 未知选项: $1"
            show_help
            exit 1
            ;;
    esac
done

# 检查端口是否被占用
check_port() {
    if lsof -Pi :$SERVER_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
        echo -e "${YELLOW}⚠️  警告: 端口 $SERVER_PORT 已被占用${NC}"
        echo ""
        echo "占用端口的进程:"
        lsof -Pi :$SERVER_PORT -sTCP:LISTEN
        echo ""
        read -p "是否停止现有进程并继续? (y/n): " -n 1 -r
        echo ""
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            PID=$(lsof -ti:$SERVER_PORT)
            kill $PID 2>/dev/null
            sleep 2
            echo -e "${GREEN}✅ 已释放端口 $SERVER_PORT${NC}"
        else
            echo -e "${RED}❌ 操作已取消${NC}"
            exit 1
        fi
    fi
}

# 显示环境信息
show_info() {
    echo -e "${BLUE}═══════════════════════════════════════${NC}"
    echo -e "${BLUE}  爱维宠物医院管理平台 - 打包启动脚本${NC}"
    echo -e "${BLUE}═══════════════════════════════════════${NC}"
    echo ""
    echo -e "${GREEN}📦 使用 IDEA 内置 JDK:${NC} $JAVA_HOME"
    echo -e "${GREEN}🔧 Java 版本:${NC}"
    java -version 2>&1 | head -1
    echo ""
    echo -e "${GREEN}🚀 运行配置:${NC}"
    echo "   端口: $SERVER_PORT"
    echo "   环境: $ACTIVE_PROFILE"
    echo "   调试: $([ "$DEBUG_MODE" = true ] && echo "开启 (端口: 5005)" || echo "关闭")"
    echo "   后台: $([ "$BACKGROUND" = true ] && echo "是" || echo "否")"
    echo ""
}

# 打包项目
build_project() {
    echo -e "${BLUE}📦 开始打包项目...${NC}"
    echo ""
    
    if ! "$MAVEN_BIN" clean package $SKIP_TESTS; then
        echo ""
        echo -e "${RED}❌ 打包失败!${NC}"
        exit 1
    fi
    
    echo ""
    echo -e "${GREEN}✅ 打包成功!${NC}"
    echo ""
}

# 启动应用
start_app() {
    if [ ! -f "$JAR_PATH" ]; then
        echo -e "${RED}❌ 错误: 未找到 jar 文件: $JAR_PATH${NC}"
        exit 1
    fi
    
    check_port
    
    # 构建启动命令
    JAVA_OPTS="$JVM_OPTS"
    
    if [ "$DEBUG_MODE" = true ]; then
        JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
        echo -e "${YELLOW}🐛 调试模式已开启，可在 IDEA 中配置远程调试 (端口: 5005)${NC}"
    fi
    
    echo -e "${BLUE}🚀 正在启动应用...${NC}"
    echo ""
    
    if [ "$BACKGROUND" = true ]; then
        # 后台运行
        nohup java $JAVA_OPTS -jar "$JAR_PATH" \
            --server.port=$SERVER_PORT \
            --spring.profiles.active=$ACTIVE_PROFILE \
            > "$SCRIPT_DIR/app.log" 2>&1 &
        
        APP_PID=$!
        echo $APP_PID > "$SCRIPT_DIR/app.pid"
        
        echo -e "${GREEN}✅ 应用已在后台启动${NC}"
        echo "   进程ID: $APP_PID"
        echo "   访问地址: http://localhost:$SERVER_PORT"
        echo "   日志文件: $SCRIPT_DIR/app.log"
        echo ""
        echo "查看日志: $0 --logs"
        echo "停止服务: $0 --stop"
    else
        # 前台运行
        echo -e "${GREEN}✅ 应用启动成功!${NC}"
        echo "   访问地址: http://localhost:$SERVER_PORT"
        echo "   API 文档: http://localhost:$SERVER_PORT/swagger-ui.html"
        echo ""
        echo -e "${YELLOW}按 Ctrl+C 停止服务${NC}"
        echo "═══════════════════════════════════════"
        echo ""
        
        java $JAVA_OPTS -jar "$JAR_PATH" \
            --server.port=$SERVER_PORT \
            --spring.profiles.active=$ACTIVE_PROFILE
    fi
}

# 主流程
main() {
    show_info
    build_project
    start_app
}

main
