#!/bin/bash

# 检查是否安装jq工具
if ! command -v jq &> /dev/null; then
    echo "❌ 错误: 未找到jq工具，请先安装jq (JSON处理器)"
    echo "   Ubuntu/Debian: sudo apt-get install jq"
    echo "   CentOS/RHEL: sudo yum install jq"
    exit 1
fi

# 获取所有DCV会话信息（过滤警告）
echo "🔍 正在获取DCV会话列表..."
session_data=$(dcvsm describe-sessions 2>&1 | grep -v -E '^(WARNING|DEBUG)')

# 检查是否获取到有效数据
if [ -z "$session_data" ]; then
    echo "❌ 错误: 无法获取DCV会话数据，请检查dcvsm命令是否可用"
    exit 1
fi

# 统计会话类型
echo "📊 会话统计信息:"
virtual_count=$(echo "$session_data" | jq -r '.sessions[] | select(.type == "VIRTUAL") | .id' | wc -l)
console_count=$(echo "$session_data" | jq -r '.sessions[] | select(.type == "CONSOLE") | .id' | wc -l)
total_count=$(echo "$session_data" | jq -r '.sessions[] | .id' | wc -l)

echo "   总会话数: $total_count"
echo "   虚拟会话(VIRTUAL): $virtual_count"
echo "   控制台会话(CONSOLE): $console_count"

# 提取READY状态的会话信息（同时检查availability和state）
ready_sessions=$(echo "$session_data" | jq -r '
    .sessions[] 
    | select(.server.availability == "AVAILABLE" and .state == "READY")
    | "\(.id)|\(.server.ip)|\(.owner)|\(.type)|\(.creation_time)|\(.num_of_connections)|\(.last_disconnection_time)"
')

# 检查是否有READY状态的会话
if [ -z "$ready_sessions" ]; then
    echo "📭 未找到状态为READY且可用的DCV会话"
    exit 0
fi

echo "✅ 找到 $(echo "$ready_sessions" | wc -l) 个READY状态的可用会话，正在生成连接URL..."

# 获取当前时间戳（秒）
current_timestamp=$(date +%s 2>/dev/null || echo "0")

# 处理每个READY状态的会话
while IFS='|' read -r session_id ip owner session_type creation_time connections last_disconnection_time; do
    echo -e "\n🔄 处理会话: $session_id (用户: $owner, IP: $ip, 类型: $session_type)"
    
    # 计算会话已启动的时间
    if [ "$current_timestamp" != "0" ] && [ -n "$creation_time" ]; then
        # 将ISO时间转换为时间戳（需要GNU date）
        if command -v date &> /dev/null && date --version 2>&1 | grep -q "GNU"; then
            creation_timestamp=$(date -d "$creation_time" +%s 2>/dev/null || echo "0")
            if [ "$creation_timestamp" != "0" ]; then
                uptime_seconds=$((current_timestamp - creation_timestamp))
                
                # 转换为可读格式
                if [ $uptime_seconds -lt 60 ]; then
                    uptime_display="${uptime_seconds}秒"
                elif [ $uptime_seconds -lt 3600 ]; then
                    uptime_minutes=$((uptime_seconds / 60))
                    uptime_display="${uptime_minutes}分钟"
                elif [ $uptime_seconds -lt 86400 ]; then
                    uptime_hours=$((uptime_seconds / 3600))
                    uptime_display="${uptime_hours}小时"
                else
                    uptime_days=$((uptime_seconds / 86400))
                    uptime_hours=$(((uptime_seconds % 86400) / 3600))
                    uptime_display="${uptime_days}天${uptime_hours}小时"
                fi
                
                echo "   ⏱️  会话已启动: $uptime_display (创建于: $creation_time)"
            fi
        else
            echo "   ⏱️  创建时间: $creation_time (需要GNU date来计算运行时间)"
        fi
    else
        echo "   ⏱️  创建时间: $creation_time"
    fi
    
    # 显示连接数
    echo "   👥 当前连接数: $connections"
    
    # 显示最后连接时间
    if [ -n "$last_disconnection_time" ] && [ "$last_disconnection_time" != "null" ]; then
        echo "   📅 最后连接时间: $last_disconnection_time"
        
        # 如果可能，计算从最后连接到现在的时间
        if [ "$current_timestamp" != "0" ]; then
            if command -v date &> /dev/null && date --version 2>&1 | grep -q "GNU"; then
                last_disconnection_timestamp=$(date -d "$last_disconnection_time" +%s 2>/dev/null || echo "0")
                if [ "$last_disconnection_timestamp" != "0" ]; then
                    time_since_last=$((current_timestamp - last_disconnection_timestamp))
                    
                    # 转换为可读格式
                    if [ $time_since_last -lt 60 ]; then
                        time_since_display="${time_since_last}秒前"
                    elif [ $time_since_last -lt 3600 ]; then
                        time_since_minutes=$((time_since_last / 60))
                        time_since_display="${time_since_minutes}分钟前"
                    elif [ $time_since_last -lt 86400 ]; then
                        time_since_hours=$((time_since_last / 3600))
                        time_since_display="${time_since_hours}小时前"
                    else
                        time_since_days=$((time_since_last / 86400))
                        time_since_hours=$(((time_since_last % 86400) / 3600))
                        time_since_display="${time_since_days}天${time_since_hours}小时前"
                    fi
                    
                    echo "   ⏰ 最后连接: $time_since_display"
                fi
            fi
        fi
    else
        echo "   📅 最后连接时间: 无记录"
    fi
    
    # 获取连接令牌（使用更安全的过滤方式）
    connection_data=$(dcvsm get-session-connection-data --session-id "$session_id" --user "$owner" 2>&1 | grep -v -E '^(WARNING|DEBUG)')
    
    # 严格提取connection_token（避免特殊字符问题）
    connection_token=$(echo "$connection_data" | jq -r '.connection_token // empty')
    
    # 验证令牌有效性
    if [ -z "$connection_token" ]; then
        echo "❌ 错误: 无法获取connection_token（可能无权限或会话无效）"
        continue
    fi
    
    # 安全生成URL（使用printf避免特殊字符问题）
    url=$(printf "https://%s:8888/?authToken=%s#%s" "$ip" "$connection_token" "$session_id")
    
    # 显示结果
    echo ""
    echo "✨ 成功生成连接URL:"
    echo "   $url"
    echo ""
    echo "💡 提示: 请复制此URL在浏览器中打开"
    
    # 将URL添加到剪贴板（如果可用）
    if command -v xclip &> /dev/null; then
        echo "$url" | xclip -selection clipboard
        echo "📋 URL已自动复制到Linux剪贴板!"
    elif command -v pbcopy &> /dev/null; then
        echo "$url" | pbcopy
        echo "📋 URL已自动复制到macOS剪贴板!"
    else
        echo "⚠️  剪贴板工具未安装，需手动复制URL"
        echo "💡 安装提示:"
        echo "   - Linux (Ubuntu/Debian): sudo apt-get install xclip"
        echo "   - Linux (CentOS/RHEL): sudo yum install xclip"
        echo "   - macOS: pbcopy 已内置，无需安装"
    fi

done <<< "$ready_sessions"

echo -e "\n🎉 所有可用会话处理完成! 请使用生成的URL连接DCV会话"
