#!/bin/bash

# 📊 Мониторинг WebSocket подключений в реальном времени
# Использование: ./websocket_monitor.sh

set -e

# Конфигурация
BASE_URL="http://192.168.219.108"
EMERGENCY_PORT="8002"
GATEWAY_PORT="8000"
UPDATE_INTERVAL=10

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color

# Функция получения токена
get_jwt_token() {
    echo -e "${BLUE}🔐 Получение JWT токена...${NC}"
    
    TOKEN=$(curl -s -X POST "${BASE_URL}:${GATEWAY_PORT}/api/v1/auth/login" \
        -H "Content-Type: application/json" \
        -d '{"email":"shadow85@list.ru","password":"R0sebud1985"}' \
        | python3 -c "import sys, json; print(json.load(sys.stdin)['access_token'])" 2>/dev/null)
    
    if [ -n "$TOKEN" ]; then
        echo -e "${GREEN}✅ Токен получен: ${TOKEN:0:50}...${NC}"
        return 0
    else
        echo -e "${RED}❌ Ошибка получения токена${NC}"
        return 1
    fi
}

# Функция получения статистики
get_websocket_stats() {
    curl -s -H "Authorization: Bearer $TOKEN" \
        "${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/stats" 2>/dev/null || echo "{}"
}

# Функция получения подключений
get_websocket_connections() {
    curl -s -H "Authorization: Bearer $TOKEN" \
        "${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/connections" 2>/dev/null || echo "{}"
}

# Функция ping всех подключений
ping_connections() {
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
        "${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/ping" 2>/dev/null || echo "{}"
}

# Функция отправки тестового сообщения
send_broadcast() {
    local message="$1"
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
        "${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/broadcast?message=${message}" 2>/dev/null || echo "{}"
}

# Функция отображения статистики
display_stats() {
    local stats="$1"
    
    if command -v jq >/dev/null 2>&1; then
        # Используем jq если доступен
        local total=$(echo "$stats" | jq -r '.total_connections // 0')
        local users=$(echo "$stats" | jq -r '.connected_users // [] | join(", ")')
        local messages=$(echo "$stats" | jq -r '.total_messages_sent // 0')
        local timestamp=$(echo "$stats" | jq -r '.timestamp // "N/A"')
        
        echo -e "${WHITE}📊 СТАТИСТИКА WEBSOCKET ПОДКЛЮЧЕНИЙ${NC}"
        echo -e "${CYAN}   Активных подключений: ${WHITE}$total${NC}"
        echo -e "${CYAN}   Подключенные пользователи: ${WHITE}$users${NC}"
        echo -e "${CYAN}   Всего сообщений: ${WHITE}$messages${NC}"
        echo -e "${CYAN}   Время обновления: ${WHITE}$timestamp${NC}"
    else
        # Простой вывод без jq
        echo -e "${WHITE}📊 СТАТИСТИКА (raw JSON):${NC}"
        echo "$stats" | head -3
    fi
}

# Функция отображения подключений
display_connections() {
    local connections="$1"
    
    if command -v jq >/dev/null 2>&1; then
        echo -e "\n${WHITE}🔍 ДЕТАЛИ ПОДКЛЮЧЕНИЙ${NC}"
        
        # Получаем список пользователей
        local user_ids=$(echo "$connections" | jq -r '.connection_details // {} | keys[]' 2>/dev/null)
        
        if [ -n "$user_ids" ]; then
            for user_id in $user_ids; do
                local connected_at=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".connected_at")
                local client_host=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".client_host")
                local message_count=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".message_count")
                local duration=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".duration_seconds")
                
                echo -e "${YELLOW}   👤 Пользователь $user_id:${NC}"
                echo -e "${CYAN}      🕐 Подключен: $connected_at${NC}"
                echo -e "${CYAN}      🌐 IP: $client_host${NC}"
                echo -e "${CYAN}      📨 Сообщений: $message_count${NC}"
                echo -e "${CYAN}      ⏱️  Онлайн: ${duration}с${NC}"
            done
        else
            echo -e "${YELLOW}   📭 Нет активных подключений${NC}"
        fi
    fi
}

# Функция меню команд
show_menu() {
    echo -e "\n${PURPLE}🎛️  КОМАНДЫ МОНИТОРИНГА:${NC}"
    echo -e "${WHITE}   [Enter]${NC} - Обновить статистику"
    echo -e "${WHITE}   p${NC} - Ping всех подключений"
    echo -e "${WHITE}   b${NC} - Отправить broadcast сообщение"
    echo -e "${WHITE}   t${NC} - Переключить автообновление"
    echo -e "${WHITE}   q${NC} - Выход"
}

# Главный мониторинг
monitor_websockets() {
    local auto_refresh=true
    
    # Очищаем экран
    clear
    
    echo -e "${GREEN}🚀 WebSocket Monitor v1.0${NC}"
    echo -e "${CYAN}🌐 Сервер: ${BASE_URL}:${EMERGENCY_PORT}${NC}"
    echo -e "${CYAN}⏱️  Интервал обновления: ${UPDATE_INTERVAL}с${NC}"
    
    show_menu
    
    while true; do
        # Отображаем текущее время
        echo -e "\n${WHITE}⏰ $(date '+%Y-%m-%d %H:%M:%S')${NC}"
        echo "═══════════════════════════════════════════════════════════"
        
        # Получаем и отображаем статистику
        local stats=$(get_websocket_stats)
        display_stats "$stats"
        
        # Получаем и отображаем подключения
        local connections=$(get_websocket_connections)
        display_connections "$connections"
        
        echo "═══════════════════════════════════════════════════════════"
        
        if [ "$auto_refresh" = true ]; then
            echo -e "${YELLOW}⏳ Автообновление через ${UPDATE_INTERVAL}с (нажмите любую клавишу для команд)${NC}"
            
            # Ждем input с таймаутом
            if read -t $UPDATE_INTERVAL -n 1 input; then
                case $input in
                    'p')
                        echo -e "\n${BLUE}📡 Выполняем ping всех подключений...${NC}"
                        ping_result=$(ping_connections)
                        echo "$ping_result" | head -3
                        ;;
                    'b')
                        echo -e "\n${BLUE}📢 Введите сообщение для broadcast:${NC}"
                        read -r broadcast_msg
                        if [ -n "$broadcast_msg" ]; then
                            echo -e "${BLUE}Отправляем: $broadcast_msg${NC}"
                            broadcast_result=$(send_broadcast "$broadcast_msg")
                            echo "$broadcast_result" | head -3
                        fi
                        ;;
                    't')
                        auto_refresh=false
                        echo -e "\n${YELLOW}⏸️  Автообновление отключено${NC}"
                        ;;
                    'q')
                        echo -e "\n${GREEN}👋 До свидания!${NC}"
                        exit 0
                        ;;
                esac
            fi
        else
            echo -e "${YELLOW}⏸️  Автообновление отключено. Команды:${NC}"
            show_menu
            
            read -n 1 input
            case $input in
                'p')
                    echo -e "\n${BLUE}📡 Выполняем ping...${NC}"
                    ping_result=$(ping_connections)
                    echo "$ping_result" | head -3
                    ;;
                'b')
                    echo -e "\n${BLUE}📢 Введите сообщение:${NC}"
                    read -r broadcast_msg
                    if [ -n "$broadcast_msg" ]; then
                        broadcast_result=$(send_broadcast "$broadcast_msg")
                        echo "$broadcast_result" | head -3
                    fi
                    ;;
                't')
                    auto_refresh=true
                    echo -e "\n${GREEN}▶️  Автообновление включено${NC}"
                    ;;
                'q')
                    echo -e "\n${GREEN}👋 До свидания!${NC}"
                    exit 0
                    ;;
            esac
        fi
        
        # Очищаем экран для следующего обновления
        clear
        echo -e "${GREEN}🚀 WebSocket Monitor v1.0${NC} ${YELLOW}(обновлено: $(date '+%H:%M:%S'))${NC}"
        echo -e "${CYAN}🌐 Сервер: ${BASE_URL}:${EMERGENCY_PORT}${NC}"
    done
}

# Проверка зависимостей
check_dependencies() {
    if ! command -v curl >/dev/null 2>&1; then
        echo -e "${RED}❌ curl не установлен${NC}"
        exit 1
    fi
    
    if ! command -v python3 >/dev/null 2>&1; then
        echo -e "${RED}❌ python3 не установлен${NC}"
        exit 1
    fi
    
    if ! command -v jq >/dev/null 2>&1; then
        echo -e "${YELLOW}⚠️  jq не установлен - будет простой вывод${NC}"
        echo -e "${YELLOW}   Установите: sudo apt install jq${NC}"
        sleep 2
    fi
}

# Главная функция
main() {
    echo -e "${GREEN}🚀 Запуск WebSocket Monitor...${NC}"
    
    # Проверяем зависимости
    check_dependencies
    
    # Получаем токен
    if ! get_jwt_token; then
        exit 1
    fi
    
    # Запускаем мониторинг
    monitor_websockets
}

# Обработка сигналов
trap 'echo -e "\n${GREEN}👋 Monitor остановлен${NC}"; exit 0' INT TERM

# Запуск
main "$@"