#!/bin/bash
# 统一服务器连接脚本模板 - 智能快速连接 + 完整环境配置
# 使用说明：复制此文件并修改配置信息后使用

SESSION_NAME="dev-session-template"
CONNECTION_TOOL="remote-tool"

# 跳板机配置（可选，如果为空则直接连接目标服务器）
JUMP_HOST="your_jump_host"                     # 跳板机地址，设为空字符串则跳过
JUMP_PASSWORD="your_password_here"             # 跳板机密码（自动输入）

# 目标服务器配置
SERVER_HOST="your_server_host"                 # 最终目标服务器
DOCKER_CONTAINER="your_container"               # Docker容器名称
DOCKER_IMAGE="your_docker_image"                # Docker镜像名称

# 环境配置选项
AUTO_SETUP_ENVIRONMENT=true                    # 是否自动配置环境（首次）
QUICK_CONNECT_MODE=true                         # 快速连接模式（跳过已配置的环境设置）

# BOS配置信息（仅首次环境配置时使用）
BOS_ACCESS_KEY="your_bos_access_key"
BOS_SECRET_KEY="your_bos_secret_key"
BOS_BUCKET="your_bos_bucket_path"

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

# 智能检查tmux输出函数
check_tmux_output() {
    local session_name=$1
    local expected_pattern=$2
    local timeout=${3:-10}
    local check_interval=1
    local elapsed=0
    
    while [ $elapsed -lt $timeout ]; do
        local output=$(tmux capture-pane -t $session_name -p | grep -v '^$' | tail -10)
        if [[ "$output" =~ $expected_pattern ]]; then
            return 0
        fi
        sleep $check_interval
        elapsed=$((elapsed + check_interval))
    done
    return 1
}

# 智能容器检查和处理函数（修复版 - 解决分支执行bug）
smart_container_setup() {
    local session_name=$1
    local container_name=$2
    local image_name=$3
    
    echo -e "${BLUE}🔍 智能检查Docker环境...${NC}"
    
    # 步骤1：精确检查容器是否存在
    echo -e "${BLUE}🔍 步骤1: 精确检查容器是否存在: $container_name${NC}"
    tmux send-keys -t $session_name "echo '=== CONTAINER_EXIST_CHECK_START ==='" Enter
    tmux send-keys -t $session_name "docker inspect $container_name >/dev/null 2>&1 && echo 'CONTAINER_EXISTS_YES' || echo 'CONTAINER_EXISTS_NO'" Enter
    sleep 3
    
    # 改进的输出捕获 - 只获取最后一行结果
    echo -e "${YELLOW}正在捕获检查结果...${NC}"
    tmux send-keys -t $session_name "echo '=== CAPTURE_POINT ==='" Enter
    sleep 1
    
    # 更精确的输出捕获 - 获取两个标记之间的内容
    local exist_output=$(tmux capture-pane -t $session_name -p | sed -n '/=== CONTAINER_EXIST_CHECK_START ===/,/=== CAPTURE_POINT ===/p' | grep -E "(CONTAINER_EXISTS_YES|CONTAINER_EXISTS_NO)" | tail -1)
    
    echo -e "${YELLOW}调试信息 - 容器存在性检查:${NC}"
    echo "检查结果: [$exist_output]"
    
    # 更严格的条件判断
    if [[ "$exist_output" == *"CONTAINER_EXISTS_YES"* ]]; then
        echo -e "${GREEN}✅ 容器已存在，进入快速连接模式...${NC}"
        handle_existing_container $session_name $container_name
        return $?
        
    elif [[ "$exist_output" == *"CONTAINER_EXISTS_NO"* ]]; then
        echo -e "${BLUE}🚀 容器不存在，进入创建模式...${NC}"
        handle_new_container $session_name $container_name $image_name
        return $?
        
    else
        echo -e "${RED}❌ 容器存在性检查结果异常${NC}"
        echo -e "${YELLOW}调试信息 - 原始输出:${NC}"
        tmux capture-pane -t $session_name -p | tail -10
        return 1
    fi
}
# 处理已存在容器的逻辑
handle_existing_container() {
    local session_name=$1
    local container_name=$2
    
    echo -e "${BLUE}🔍 步骤2: 检查容器运行状态...${NC}"
    tmux send-keys -t $session_name "echo '=== CONTAINER_STATUS_CHECK_START ==='" Enter
    tmux send-keys -t $session_name "docker inspect --format='{{.State.Running}}' $container_name" Enter
    sleep 2
    
    local status_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== CONTAINER_STATUS_CHECK_START ===" | tail -2)
    echo -e "${YELLOW}调试信息 - 容器运行状态:${NC}"
    echo "$status_output"
    
    if echo "$status_output" | grep -q "true"; then
        echo -e "${GREEN}✅ 容器正在运行${NC}"
    else
        echo -e "${YELLOW}⚠️  容器已停止，正在启动...${NC}"
        tmux send-keys -t $session_name "echo '=== CONTAINER_START_BEGIN ==='" Enter
        tmux send-keys -t $session_name "docker start $container_name" Enter
        sleep 5
        
        # 验证启动是否成功
        local start_result=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== CONTAINER_START_BEGIN ===" | tail -2)
        if echo "$start_result" | grep -q "$container_name"; then
            echo -e "${GREEN}✅ 容器启动成功${NC}"
        else
            echo -e "${RED}❌ 容器启动失败${NC}"
            echo -e "${YELLOW}错误信息: $start_result${NC}"
            return 1
        fi
    fi
    
    # 进入容器
    echo -e "${GREEN}🚪 步骤3: 进入现有容器...${NC}"
    tmux send-keys -t $session_name "docker exec -it $container_name zsh" Enter
    sleep 2
    
    # 检查是否成功进入zsh
    if ! check_tmux_output $session_name ".*@.*:.*#" 5; then
        echo -e "${YELLOW}⚠️  尝试启动zsh...${NC}"
        tmux send-keys -t $session_name "zsh" Enter
        sleep 2
    fi
    
    echo -e "${GREEN}✅ 快速连接完成！${NC}"
    return 0
}
# 处理新容器创建的逻辑
handle_new_container() {
    local session_name=$1
    local container_name=$2
    local image_name=$3
    
    echo -e "${BLUE}步骤1: 创建Docker容器 $container_name${NC}"
    tmux send-keys -t $session_name "echo '=== CONTAINER_CREATE_START ==='" Enter
    tmux send-keys -t $session_name "docker run --privileged --name=$container_name --ulimit core=-1 --security-opt seccomp=unconfined -dti --net=host --uts=host --ipc=host -v /home:/home -v /data1:/data1 -v /data2:/data2 -v /data3:/data3 -v /data4:/data4 --shm-size=256g --restart=always $image_name" Enter
    sleep 10
    
    # 验证容器创建
    echo -e "${BLUE}步骤2: 验证容器创建结果${NC}"
    tmux send-keys -t $session_name "echo '=== VERIFY_CREATE_START ==='" Enter
    tmux send-keys -t $session_name "docker inspect $container_name >/dev/null 2>&1 && echo 'CREATE_SUCCESS' || echo 'CREATE_FAILED'" Enter
    sleep 3
    
    local verify_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== VERIFY_CREATE_START ===" | tail -2)
    
    if echo "$verify_output" | grep -q "CREATE_SUCCESS"; then
        echo -e "${GREEN}✅ 容器创建成功${NC}"
    else
        echo -e "${RED}❌ 容器创建失败${NC}"
        echo -e "${YELLOW}调试信息: $verify_output${NC}"
        return 1
    fi
    
    # 进入新创建的容器
    echo -e "${GREEN}🚪 步骤3: 进入新创建的容器...${NC}"
    tmux send-keys -t $session_name "docker exec -it $container_name bash" Enter
    sleep 3
    
    if ! check_tmux_output $session_name "root@.*#" 5; then
        echo -e "${RED}❌ 进入容器失败${NC}"
        return 1
    fi
    
    # 如果启用自动环境配置，执行完整配置
    if [ "$AUTO_SETUP_ENVIRONMENT" = "true" ]; then
        setup_full_environment $session_name
    else
        echo -e "${YELLOW}💡 容器已创建，如需配置环境请手动执行相关命令${NC}"
    fi
    
    return 0
}
# 完整环境配置函数（改进版 - 直接检测实际使用结果）
setup_full_environment() {
    local session_name=$1
    
    echo -e "${BLUE}🛠️  开始完整环境配置...${NC}"
    
    # 检查BOS工具
    echo -e "${BLUE}步骤1: 检查BOS工具${NC}"
    tmux send-keys -t $session_name "which bcecmd" Enter
    sleep 2
    
    if check_tmux_output $session_name "/.*bcecmd" 5; then
        echo -e "${GREEN}✅ BOS工具可用${NC}"
        
        # 配置BOS
        echo -e "${BLUE}步骤2: 配置BOS工具${NC}"
        echo "启动bcecmd配置..."
        tmux send-keys -t $session_name "bcecmd -c" Enter
        sleep 3  # 给bcecmd更多启动时间

        echo "输入Access Key..."
        tmux send-keys -t $session_name "$BOS_ACCESS_KEY" Enter
        sleep 0.1  # 调整为0.1秒间隔

        echo "输入Secret Key..."
        tmux send-keys -t $session_name "$BOS_SECRET_KEY" Enter
        sleep 0.1  # 调整为0.1秒间隔

        echo "使用默认配置（连续回车）..."
        for i in {1..11}; do
            echo "  发送第${i}个回车..."
            tmux send-keys -t $session_name "" Enter
            sleep 0.1  # 调整为0.1秒间隔
        done
        
        # 等待配置完成
        echo "等待bcecmd配置完成..."
        sleep 5

        # 改进：直接测试实际使用，不检测配置信息
        echo -e "${BLUE}步骤3: 测试BOS连接并下载配置文件${NC}"
        
        # 尝试下载第一个配置文件
        echo "测试下载.p10k.zsh配置..."
        tmux send-keys -t $session_name "echo '=== BOS_DOWNLOAD_START ==='" Enter
        tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.p10k.zsh /root" Enter
        sleep 5
        
        # 检查下载是否成功
        tmux send-keys -t $session_name "echo '=== BOS_DOWNLOAD_CHECK ==='" Enter
        tmux send-keys -t $session_name "if [ -f /root/.p10k.zsh ]; then echo 'BOS_DOWNLOAD_SUCCESS'; else echo 'BOS_DOWNLOAD_FAILED'; fi" Enter
        sleep 2
        
        # 检查下载结果
        local download_output=$(tmux capture-pane -t $session_name -p | tail -10)
        
        if echo "$download_output" | grep -q "BOS_DOWNLOAD_SUCCESS"; then
            echo -e "${GREEN}✅ BOS配置和连接成功！${NC}"
            
            # 继续下载其他配置文件
            echo "下载.zshrc配置..."
            tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.zshrc /root" Enter
            sleep 5

            echo "下载.zsh_history配置..."
            tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.zsh_history /root" Enter
            sleep 5

            # 验证所有配置文件
            echo -e "${BLUE}步骤4: 验证配置文件${NC}"
            tmux send-keys -t $session_name "ls -la /root/.zshrc /root/.p10k.zsh /root/.zsh_history" Enter
            sleep 2

            # 检查配置文件是否下载成功
            if check_tmux_output $session_name "\.zshrc.*\.p10k\.zsh.*\.zsh_history" 5; then
                echo -e "${GREEN}✅ 所有配置文件下载成功${NC}"
            else
                echo -e "${YELLOW}⚠️  部分配置文件可能下载失败，但核心配置已成功${NC}"
            fi
            
        else
            echo -e "${RED}❌ BOS连接或下载失败！${NC}"
            echo -e "${YELLOW}🔍 BOS操作输出：${NC}"
            echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
            echo "$download_output"
            echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
            echo ""
            echo -e "${YELLOW}💡 可能的原因：${NC}"
            echo -e "${CYAN}  1. Access Key 或 Secret Key 不正确${NC}"
            echo -e "${CYAN}  2. 网络连接问题${NC}"
            echo -e "${CYAN}  3. BOS Bucket路径不存在：$BOS_BUCKET${NC}"
            echo -e "${CYAN}  4. 权限不足或文件不存在${NC}"
            echo ""
            echo -e "${RED}🛑 BOS下载失败，切换到本地配置${NC}"
            echo -e "${YELLOW}📋 调试建议（如需要）：${NC}"
            echo -e "${CYAN}  1. 进入tmux session: tmux attach -t $session_name${NC}"
            echo -e "${CYAN}  2. 手动测试: bcecmd bos ls $BOS_BUCKET${NC}"
            echo -e "${CYAN}  3. 检查网络: ping bce.example.com${NC}"
            echo -e "${CYAN}  4. 验证密钥和bucket路径${NC}"
            echo ""
            echo -e "${BLUE}🔄 自动切换到本地备用配置...${NC}"
            setup_local_config $session_name
        fi
    else
        echo -e "${YELLOW}⚠️  BOS工具不可用，使用本地备用配置${NC}"
        setup_local_config $session_name
    fi
    
    # 创建工作目录
    echo -e "${BLUE}步骤5: 创建工作目录${NC}"
    tmux send-keys -t $session_name "mkdir -p /home/xuyehua" Enter
    sleep 1
    
    # 生成SSH密钥
    echo -e "${BLUE}步骤6: 生成SSH密钥${NC}"
    echo "生成SSH密钥（使用默认设置）..."
    tmux send-keys -t $session_name "ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''" Enter
    sleep 3
    
    # 启动zsh环境
    echo -e "${BLUE}步骤7: 启动zsh环境${NC}"
    tmux send-keys -t $session_name "echo '=== 启动zsh ==='" Enter
    tmux send-keys -t $session_name "zsh" Enter
    sleep 3
    
    # 显示SSH公钥
    echo -e "${BLUE}步骤8: 显示SSH公钥${NC}"
    tmux send-keys -t $session_name "echo \"=== SSH_KEY_DISPLAY_START ===\"" Enter
    tmux send-keys -t $session_name "if [ -f /root/.ssh/id_rsa.pub ]; then cat /root/.ssh/id_rsa.pub; else echo \"SSH公钥文件不存在\"; fi" Enter
    sleep 2
    
    # 捕获并显示公钥内容
    local ssh_key_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== SSH_KEY_DISPLAY_START ===" | tail -2 | grep -v "^$" | head -1)
    if [ -n "$ssh_key_output" ] && ! echo "$ssh_key_output" | grep -q "不存在"; then
        echo -e "${GREEN}✅ SSH公钥已生成，内容如下：${NC}"
        echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "${YELLOW}$ssh_key_output${NC}"
        echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "${GREEN}💡 请复制上述公钥内容到目标服务器的authorized_keys文件${NC}"
    else
        echo -e "${YELLOW}⚠️  SSH公钥获取失败，请手动执行: cat /root/.ssh/id_rsa.pub${NC}"
    fi
    
    echo -e "${GREEN}✅ 完整环境配置完成！${NC}"
}
echo -e "${CYAN}=== 统一服务器连接脚本 ===${NC}"
echo "目标服务器: $SERVER_HOST"
echo "Docker容器: $DOCKER_CONTAINER"
echo "快速连接模式: $QUICK_CONNECT_MODE"
echo ""

# 检查session是否已存在
if tmux has-session -t $SESSION_NAME 2>/dev/null; then
    echo -e "${GREEN}✅ Session '$SESSION_NAME' 已存在${NC}"
    
    # 智能检查当前状态
    echo -e "${BLUE}🔍 检查当前环境状态...${NC}"
    current_output=$(tmux capture-pane -t $SESSION_NAME -p | tail -3)
    
    if echo "$current_output" | grep -q "root@.*:.*#\|.*@.*-.*:.*\$"; then
        echo -e "${GREEN}✅ 当前已在Docker容器内${NC}"
        echo -e "${YELLOW}使用: tmux attach -t $SESSION_NAME${NC}"
    else
        echo -e "${YELLOW}⚠️  当前不在Docker容器内${NC}"
        echo -e "${BLUE}🚀 尝试自动进入Docker容器...${NC}"
        smart_container_setup "$SESSION_NAME" "$DOCKER_CONTAINER" "$DOCKER_IMAGE"
    fi
    exit 0
fi

echo -e "${BLUE}🚀 创建新的tmux session: $SESSION_NAME${NC}"
tmux new-session -d -s $SESSION_NAME

echo -e "${BLUE}📡 步骤1: 启动连接工具 ($CONNECTION_TOOL)${NC}"
tmux send-keys -t $SESSION_NAME "$CONNECTION_TOOL" Enter

echo -e "${YELLOW}✋ 请完成指纹认证...${NC}"
sleep 2

# 连接流程
if [ -n "$JUMP_HOST" ] && [ "$JUMP_HOST" != "" ]; then
    echo -e "${BLUE}🔗 步骤2: 连接到跳板机 ($JUMP_HOST)${NC}"
    tmux send-keys -t $SESSION_NAME "ssh $JUMP_HOST" Enter
    
    echo -e "${BLUE}🔑 自动输入跳板机密码...${NC}"
    sleep 3
    tmux send-keys -t $SESSION_NAME "$JUMP_PASSWORD" Enter
    
    echo -e "${BLUE}🎯 步骤3: 从跳板机连接到目标服务器 ($SERVER_HOST)${NC}"
    sleep 2
    tmux send-keys -t $SESSION_NAME "ssh $SERVER_HOST" Enter
else
    echo -e "${BLUE}🎯 步骤2: 直接连接到目标服务器 ($SERVER_HOST)${NC}"
    tmux send-keys -t $SESSION_NAME "ssh $SERVER_HOST" Enter
fi

echo -e "${YELLOW}等待服务器连接建立...${NC}"
sleep 3

# 智能Docker环境设置
echo -e "${BLUE}🐳 步骤4: 智能Docker环境设置${NC}"
smart_container_setup "$SESSION_NAME" "$DOCKER_CONTAINER" "$DOCKER_IMAGE"

echo -e "${GREEN}✅ 连接流程完成${NC}"
echo -e "${YELLOW}使用: tmux attach -t $SESSION_NAME${NC}"

echo ""
echo -e "${CYAN}💡 功能说明：${NC}"
if [ -n "$JUMP_HOST" ] && [ "$JUMP_HOST" != "" ]; then
    echo -e "${CYAN}  🔗 连接流程: $CONNECTION_TOOL → $JUMP_HOST → $SERVER_HOST → Docker容器${NC}"
else
    echo -e "${CYAN}  🎯 连接流程: $CONNECTION_TOOL → $SERVER_HOST → Docker容器${NC}"
fi
echo -e "${CYAN}  🚀 智能模式: 自动检测容器状态，快速进入或完整配置${NC}"
echo -e "${CYAN}  ⚡ 快速连接: 现有容器直接进入，无需重复配置${NC}"
echo -e "${CYAN}  🛠️  完整配置: 新容器自动配置BOS、SSH密钥、zsh环境${NC}"
echo -e "${CYAN}  📱 使用方式: tmux attach -t $SESSION_NAME${NC}" 