#!/bin/bash

set -e

# 保存脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DOCKER_DIR="$SCRIPT_DIR/../../docker"

echo "=========================================="
echo "部署 Device"
echo "=========================================="

# 检查是否需要清理旧部署
echo ""
echo "检查现有 Device 部署..."
if kubectl get deployment device -n ruoyi &> /dev/null; then
    echo "⚠️  检测到已存在的 Device 部署，自动清理..."

    echo "删除旧的 Device Deployment..."
    kubectl delete deployment device -n ruoyi --ignore-not-found=true

    echo "删除旧的 Device Service..."
    kubectl delete service tuoheng-modules-device -n ruoyi --ignore-not-found=true

    echo "等待资源清理完成..."
    sleep 5

    echo "✓ 旧部署清理完成"
fi

echo ""
# 步骤 1: 打包 Device
echo "步骤 1: 打包 Device jar..."
cd "$SCRIPT_DIR/../../bin"
sh package.sh tuoheng-device
if [ $? -eq 0 ]; then
    echo "✓ Device 打包完成"
else
    echo "✗ Device 打包失败"
    exit 1
fi

# 步骤 2: 复制 jar 文件
echo ""
echo "步骤 2: 复制 Device jar 文件..."
cp "$SCRIPT_DIR/../../ruoyi-modules/tuoheng-device/target/tuoheng-device.jar" "$DOCKER_DIR/ruoyi/modules/device/jar/"
echo "✓ jar 文件复制完成"

# 步骤 3: 构建 Device 镜像
echo ""
echo "步骤 3: 构建 Device 镜像..."
cd "$DOCKER_DIR"
docker-compose build --no-cache tuoheng-modules-device
if [ $? -eq 0 ]; then
    echo "✓ Device 镜像构建完成"
else
    echo "✗ Device 镜像构建失败"
    exit 1
fi

# 步骤 3.5: 检测环境并导入镜像（仅 Minikube 需要）
echo ""
if command -v minikube &> /dev/null && minikube status &> /dev/null; then
    echo "检测到 Minikube 环境，导入镜像（可能需要 1-2 分钟）..."

    # 先导出镜像到临时文件
    TEMP_IMAGE="/tmp/tuoheng-modules-device-runtime-$$.tar"
    echo "导出镜像到临时文件..."
    docker save -o "$TEMP_IMAGE" tuoheng-modules-device-runtime

    # 导入到 Minikube
    echo "导入镜像到 Minikube..."
    minikube image load "$TEMP_IMAGE" &
    PID=$!

    # 显示进度，最多等待 5 分钟
    COUNT=0
    MAX_COUNT=150
    while kill -0 $PID 2>/dev/null; do
        echo -n "."
        sleep 2
        COUNT=$((COUNT + 1))
        if [ $COUNT -ge $MAX_COUNT ]; then
            kill $PID 2>/dev/null
            echo ""
            echo "✗ 镜像导入超时（超过 5 分钟）"
            exit 1
        fi
    done
    wait $PID
    EXIT_CODE=$?

    echo ""
    if [ $EXIT_CODE -eq 0 ]; then
        echo "✓ 镜像导入到 Minikube 完成"
    else
        echo "✗ 镜像导入失败"
        rm -f "$TEMP_IMAGE"
        exit 1
    fi

    # 清理临时文件
    rm -f "$TEMP_IMAGE"
else
    echo "检测到 k3s/k8s 环境，跳过镜像导入（使用本地 Docker 镜像）"
fi

# 步骤 4: 部署到 K8s
echo ""
echo "步骤 4: 部署到 Kubernetes..."
cd "$SCRIPT_DIR"
kubectl apply -f service.yaml
kubectl apply -f deployment.yaml

# 步骤 5: 等待 Pod 启动
echo ""
echo "步骤 5: 等待 Device Pod 启动..."
kubectl wait --for=condition=ready pod -l app=device -n ruoyi --timeout=300s

if [ $? -ne 0 ]; then
    echo "✗ Device Pod 启动超时"
    exit 1
fi

# 检查部署状态
echo ""
echo "=========================================="
echo "检查部署结果"
echo "=========================================="

# 检查 Pod 状态
echo "检查 Device Pod 状态..."
POD_STATUS=$(kubectl get pods -n ruoyi -l app=device -o jsonpath='{.items[0].status.phase}')
if [ "$POD_STATUS" == "Running" ]; then
    echo "✓ Device Pod 运行正常"
    kubectl get pods -n ruoyi -l app=device
else
    echo "✗ Device Pod 状态异常: $POD_STATUS"
    kubectl get pods -n ruoyi -l app=device
    exit 1
fi

echo ""
# 检查 Service 状态
echo "检查 Device Service 状态..."
if kubectl get svc tuoheng-modules-device -n ruoyi &> /dev/null; then
    echo "✓ Device Service 创建成功"
    kubectl get svc -n ruoyi tuoheng-modules-device
else
    echo "✗ Device Service 创建失败"
    exit 1
fi

echo ""
echo "=========================================="
echo "✓ Device 部署完成！"
echo "=========================================="
echo ""
echo "访问信息："
echo "  Service: tuoheng-modules-device.ruoyi.svc.cluster.local"
echo "  端口: 9202"
echo ""
exit 0

