#!/bin/bash


set -e

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_ROOT"

echo "🚀 HelloTax AI 本地开发环境启动"
echo "================================"

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

mkdir -p apm/logs

echo -e "\n${YELLOW}[1/11]${NC} 启动 APM 监控服务..."
cd apm
docker-compose up -d
cd langfuse
docker-compose up -d
cd "$PROJECT_ROOT"
echo -e "${GREEN}✓${NC} APM 监控服务已启动（含 Langfuse）"

echo -e "\n${YELLOW}[2/11]${NC} 启动 base_platform 基础服务..."
cd base_platform
docker-compose up -d postgres redis neo4j milvus etcd minio
echo -e "${GREEN}✓${NC} base_platform 基础服务已启动"

echo "等待 PostgreSQL 就绪..."
for i in $(seq 1 30); do
    if docker exec base_platform_postgres pg_isready -U user &>/dev/null; then
        break
    fi
    sleep 1
done

echo -e "\n${YELLOW}[3/11]${NC} 启动 base_platform 后端..."
if [ ! -d "venv" ]; then
    echo "创建 Python 虚拟环境..."
    python3.11 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
else
    source venv/bin/activate
fi
pip install -e "$PROJECT_ROOT/shared/common_logging" -e "$PROJECT_ROOT/shared/common_metrics" -e "$PROJECT_ROOT/shared/common_langfuse" -q -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

if ! PGPASSWORD=pass psql -h localhost -U user -d base_platform -c '\dt' &>/dev/null; then
    echo "初始化数据库..."
    alembic upgrade head
    bash "$PROJECT_ROOT/scripts/base_platform/init/init_all.sh"
fi

BASE_PLATFORM_RELOAD="${BASE_PLATFORM_UVICORN_RELOAD:-false}"
BASE_PLATFORM_RELOAD_FLAG=""
if [ "$BASE_PLATFORM_RELOAD" = "true" ]; then
    BASE_PLATFORM_RELOAD_FLAG="--reload"
fi
APP_ENV=${APP_ENV:-development} SWITCH_MODE_SCRIPT="$PROJECT_ROOT/scripts/llm/switch_mode_mock.sh" nohup uvicorn app.main:app $BASE_PLATFORM_RELOAD_FLAG --host 0.0.0.0 --port 8000 > ../apm/logs/base_platform.log 2>&1 &
BASE_PLATFORM_PID=$!
echo -e "${GREEN}✓${NC} base_platform 后端已启动 (PID: $BASE_PLATFORM_PID, 端口: 8000, reload: $BASE_PLATFORM_RELOAD)"

cd "$PROJECT_ROOT"

mkdir -p apm/logs

echo -e "\n${YELLOW}[4/11]${NC} 启动 saas_portal 前端..."
cd saas_portal/frontend

if [ ! -d "node_modules" ]; then
    echo "安装前端依赖..."
    pnpm install
fi

lsof -ti:8888 | xargs kill -9 2>/dev/null || true
sleep 1

nohup pnpm dev --host 0.0.0.0 --port 8888 > ../../apm/logs/saas_portal_frontend.log 2>&1 &
SAAS_FRONTEND_PID=$!
echo -e "${GREEN}✓${NC} saas_portal 前端已启动 (PID: $SAAS_FRONTEND_PID, 端口: 8888)"

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[5/11]${NC} 启动训练中心 postgres 数据库..."
cd training_center
docker-compose up -d postgres
echo -e "${GREEN}✓${NC} 训练中心数据库已启动 (端口: 5434)"

sleep 2

echo -e "\n${YELLOW}[6/11]${NC} 启动训练中心后端..."
cd backend

if [ ! -d "venv" ]; then
    echo "创建 Python 虚拟环境..."
    python3.11 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
else
    source venv/bin/activate
fi
pip install -e "$PROJECT_ROOT/shared/common_logging" -e "$PROJECT_ROOT/shared/common_metrics" -e "$PROJECT_ROOT/shared/common_langfuse" -q -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

echo "同步训练中心数据库迁移..."
alembic upgrade head

TRAINING_CENTER_RELOAD="${TRAINING_CENTER_UVICORN_RELOAD:-false}"
TRAINING_CENTER_RELOAD_FLAG=""
if [ "$TRAINING_CENTER_RELOAD" = "true" ]; then
    TRAINING_CENTER_RELOAD_FLAG="--reload"
fi
APP_ENV=${APP_ENV:-development} nohup uvicorn app.main:app $TRAINING_CENTER_RELOAD_FLAG --host 0.0.0.0 --port 8001 > ../../apm/logs/training_center_backend.log 2>&1 &
TRAINING_BACKEND_PID=$!
echo -e "${GREEN}✓${NC} 训练中心后端已启动 (PID: $TRAINING_BACKEND_PID, 端口: 8001, reload: $TRAINING_CENTER_RELOAD)"

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[7/11]${NC} 启动训练中心前端..."
cd training_center/frontend

if [ ! -d "node_modules" ]; then
    echo "安装前端依赖..."
    pnpm install
fi

lsof -ti:8889 | xargs kill -9 2>/dev/null || true
sleep 1

nohup pnpm dev --host 0.0.0.0 --port 8889 > ../../apm/logs/training_center_frontend.log 2>&1 &
TRAINING_FRONTEND_PID=$!
echo -e "${GREEN}✓${NC} 训练中心前端已启动 (PID: $TRAINING_FRONTEND_PID, 端口: 8889)"

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[8/11]${NC} 启动数据中心 postgres 数据库..."
cd data_center
docker-compose up -d postgres
echo -e "${GREEN}✓${NC} 数据中心数据库已启动 (端口: 5435)"

sleep 2

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[9/11]${NC} 启动数据中心后端..."
cd data_center/backend

if [ ! -d "venv" ]; then
    echo "创建 Python 虚拟环境..."
    python3.11 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
else
    source venv/bin/activate
fi
pip install -e "$PROJECT_ROOT/shared/common_logging" -e "$PROJECT_ROOT/shared/common_metrics" -e "$PROJECT_ROOT/shared/common_langfuse" -q -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

echo "同步数据中心数据库迁移..."
alembic upgrade head

APP_ENV=${APP_ENV:-development} nohup uvicorn app.main:app --host 0.0.0.0 --port 8002 > ../../apm/logs/data_center_backend.log 2>&1 &
DATA_CENTER_BACKEND_PID=$!
echo -e "${GREEN}✓${NC} 数据中心后端已启动 (PID: $DATA_CENTER_BACKEND_PID, 端口: 8002)"

nohup celery -A app.celery_app worker -Q data_center_queue -c 8 --loglevel=info > ../../apm/logs/data_center_celery.log 2>&1 &
DATA_CENTER_CELERY_PID=$!
echo -e "${GREEN}✓${NC} 数据中心 Celery Worker 已启动 (PID: $DATA_CENTER_CELERY_PID)"

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[10/11]${NC} 启动数据中心前端..."
cd data_center/frontend

if [ ! -d "node_modules" ]; then
    echo "安装前端依赖..."
    pnpm install
fi

lsof -ti:8890 | xargs kill -9 2>/dev/null || true
sleep 1

nohup pnpm dev --host 0.0.0.0 --port 8890 > ../../apm/logs/data_center_frontend.log 2>&1 &
DATA_CENTER_FRONTEND_PID=$!
echo -e "${GREEN}✓${NC} 数据中心前端已启动 (PID: $DATA_CENTER_FRONTEND_PID, 端口: 8890)"

cd "$PROJECT_ROOT"

echo -e "\n${YELLOW}[11/11]${NC} 启动 API 文档服务..."
python3 "$PROJECT_ROOT/scripts/generate-api-docs.py" "$PROJECT_ROOT/docs/api/index.html"
nohup python3 -m http.server 8500 --bind 127.0.0.1 --directory "$PROJECT_ROOT" > apm/logs/api_docs.log 2>&1 &
API_DOCS_PID=$!
echo -e "${GREEN}✓${NC} API 文档服务已启动 (PID: $API_DOCS_PID, 端口: 8500)"

cat > apm/logs/dev-pids.txt <<EOF
API_DOCS_PID=$API_DOCS_PID
BASE_PLATFORM_PID=$BASE_PLATFORM_PID
SAAS_FRONTEND_PID=$SAAS_FRONTEND_PID
TRAINING_BACKEND_PID=$TRAINING_BACKEND_PID
TRAINING_FRONTEND_PID=$TRAINING_FRONTEND_PID
DATA_CENTER_BACKEND_PID=$DATA_CENTER_BACKEND_PID
DATA_CENTER_CELERY_PID=$DATA_CENTER_CELERY_PID
DATA_CENTER_FRONTEND_PID=$DATA_CENTER_FRONTEND_PID
EOF

echo -e "\n${GREEN}================================${NC}"
echo -e "${GREEN}✓ 所有服务启动完成！${NC}"
echo -e "${GREEN}================================${NC}"
echo ""
echo "服务访问地址："
echo "  • Prometheus:          http://localhost:9090"
echo "  • Grafana:             http://localhost:3000"
echo "  • Langfuse:            http://localhost:3150"
echo "  • API 文档:            http://localhost:8500/docs/api/index.html"
echo "  • SaaS Portal 前端:    http://localhost:8888"
echo "  • Base Platform API:   http://localhost:8000"
echo "  • 训练中心前端:         http://localhost:8889"
echo "  • 训练中心 API:        http://localhost:8001"
echo "  • 数据中心前端:         http://localhost:8890"
echo "  • 数据中心 API:        http://localhost:8002"
echo ""
echo "Docker 服务："
echo "  • PostgreSQL (base):   localhost:5432"
echo "  • PostgreSQL (train):  localhost:5434"
echo "  • PostgreSQL (data):   localhost:5435"
echo "  • Redis:               localhost:6379"
echo "  • Neo4j:               localhost:7474 (HTTP) / 7687 (Bolt)"
echo "  • Milvus:              localhost:19530"
echo "  • MinIO:               localhost:9000 (API) / 9001 (Console)"
echo ""
echo "日志文件："
echo "  • API 文档:            apm/logs/api_docs.log"
echo "  • Base Platform:       apm/logs/base_platform.log"
echo "  • SaaS Portal:         apm/logs/saas_portal_frontend.log"
echo "  • 训练中心后端:         apm/logs/training_center_backend.log"
echo "  • 训练中心前端:         apm/logs/training_center_frontend.log"
echo "  • 数据中心后端:         apm/logs/data_center_backend.log"
echo "  • 数据中心 Celery:      apm/logs/data_center_celery.log"
echo "  • 数据中心前端:         apm/logs/data_center_frontend.log"
echo ""
echo "停止服务: ./scripts/services-stop.sh"
echo ""

NGINX_BIN="/lsinfo/tools/nginx/sbin/nginx"
if [ -x "$NGINX_BIN" ]; then
    echo -e "\n${YELLOW}[Nginx]${NC} 启动反向代理..."
    if "$NGINX_BIN" -t &>/dev/null; then
        if "$NGINX_BIN" -s reload 2>/dev/null; then
            echo -e "${GREEN}✓${NC} Nginx 已 reload"
        else
            "$NGINX_BIN"
            echo -e "${GREEN}✓${NC} Nginx 已启动"
        fi
    else
        echo -e "${RED}✗${NC} Nginx 配置检查失败，跳过启动"
        "$NGINX_BIN" -t
    fi
fi
