#!/usr/bin/env python3
"""
Простая утилита для проверки WebSocket подключений
"""

import requests
import json
import sys
from datetime import datetime

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

# Тестовые данные для авторизации
TEST_EMAIL = "shadow85@list.ru"
TEST_PASSWORD = "R0sebud1985"


def get_auth_token():
    """Получить токен авторизации"""
    try:
        response = requests.post(
            f"{BASE_URL}:8000/api/v1/auth/login",
            json={"email": TEST_EMAIL, "password": TEST_PASSWORD}
        )
        
        if response.status_code == 200:
            token = response.json()["access_token"]
            print(f"✅ Авторизация успешна")
            return token
        else:
            print(f"❌ Ошибка авторизации: {response.status_code}")
            print(f"   Ответ: {response.text}")
            return None
            
    except Exception as e:
        print(f"❌ Ошибка подключения: {e}")
        return None


def check_websocket_connections(token):
    """Проверить WebSocket подключения"""
    print("\n" + "="*60)
    print("📊 СТАТИСТИКА WEBSOCKET ПОДКЛЮЧЕНИЙ")
    print("="*60)
    
    try:
        # Общая статистика
        stats_response = requests.get(
            f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/stats",
            headers={"Authorization": f"Bearer {token}"}
        )
        
        if stats_response.status_code == 200:
            stats = stats_response.json()
            print(f"🔢 Всего активных подключений: {stats.get('total_connections', 0)}")
            print(f"📨 Сообщений отправлено: {stats.get('total_messages_sent', 0)}")
            print(f"👥 Подключенные пользователи: {stats.get('connected_users', [])}")
            print(f"⏰ Время проверки: {stats.get('timestamp', 'N/A')}")
        else:
            print(f"❌ Ошибка получения статистики: {stats_response.status_code}")
            return
        
        # Детальная информация о подключениях
        connections_response = requests.get(
            f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/connections",
            headers={"Authorization": f"Bearer {token}"}
        )
        
        if connections_response.status_code == 200:
            connections = connections_response.json()
            
            if connections.get('connection_details'):
                print("\n" + "="*60)
                print("🔍 ДЕТАЛИ ПОДКЛЮЧЕНИЙ")
                print("="*60)
                
                for user_id, details in connections['connection_details'].items():
                    print(f"\n👤 Пользователь {user_id}:")
                    print(f"   🕐 Подключен: {details.get('connected_at', 'N/A')}")
                    print(f"   🌐 IP адрес: {details.get('client_host', 'N/A')}")
                    print(f"   🔌 Порт: {details.get('client_port', 'N/A')}")
                    print(f"   📤 Сообщений: {details.get('message_count', 0)}")
                    print(f"   ⏱️ Время онлайн: {details.get('duration_seconds', 0)} сек")
                    print(f"   💓 Последний пинг: {details.get('last_ping', 'N/A')}")
                    print(f"   ✅ Статус: {details.get('status', 'unknown')}")
            else:
                print("\n📭 Нет активных WebSocket подключений")
        else:
            print(f"❌ Ошибка получения деталей: {connections_response.status_code}")
            
    except Exception as e:
        print(f"❌ Ошибка проверки: {e}")


def ping_all_connections(token):
    """Пинг всех подключений"""
    print("\n" + "="*60)
    print("📡 ПРОВЕРКА ВСЕХ ПОДКЛЮЧЕНИЙ (PING)")
    print("="*60)
    
    try:
        response = requests.post(
            f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/ping",
            headers={"Authorization": f"Bearer {token}"}
        )
        
        if response.status_code == 200:
            result = response.json()
            print(f"✅ Пинг выполнен успешно")
            print(f"📊 Активных подключений: {result.get('active_connections', 0)}")
            print(f"❌ Отключенных пользователей: {result.get('disconnected_users', [])}")
            print(f"⏰ Время пинга: {result.get('ping_time', 'N/A')}")
            
            if result.get('disconnected_users'):
                print("⚠️ Обнаружены неактивные подключения:")
                for user_id in result['disconnected_users']:
                    print(f"   - Пользователь {user_id}")
        else:
            print(f"❌ Ошибка пинга: {response.status_code}")
            print(f"   Ответ: {response.text}")
            
    except Exception as e:
        print(f"❌ Ошибка пинга: {e}")


def send_test_broadcast(token):
    """Отправить тестовое сообщение"""
    print("\n" + "="*60)
    print("📢 ОТПРАВКА ТЕСТОВОГО СООБЩЕНИЯ")
    print("="*60)
    
    test_message = f"Тестовое сообщение от {datetime.now().strftime('%H:%M:%S')}"
    
    try:
        response = requests.post(
            f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/broadcast",
            params={"message": test_message},
            headers={"Authorization": f"Bearer {token}"}
        )
        
        if response.status_code == 200:
            result = response.json()
            print(f"✅ Сообщение отправлено: '{test_message}'")
            print(f"👥 Получатели: {result.get('recipients', [])}")
            print(f"📝 Данные сообщения: {json.dumps(result.get('data', {}), indent=2, ensure_ascii=False)}")
        else:
            print(f"❌ Ошибка отправки: {response.status_code}")
            print(f"   Ответ: {response.text}")
            
    except Exception as e:
        print(f"❌ Ошибка отправки: {e}")


def main():
    """Главная функция"""
    print("🚀 WebSocket Connection Monitor v1.0")
    print(f"🌐 Сервер: {BASE_URL}:{EMERGENCY_PORT}")
    print(f"👤 Тестовый пользователь: {TEST_EMAIL}")
    
    # Получаем токен
    token = get_auth_token()
    if not token:
        print("❌ Не удалось получить токен авторизации")
        sys.exit(1)
    
    # Выполняем проверки
    check_websocket_connections(token)
    ping_all_connections(token)
    send_test_broadcast(token)
    
    print("\n" + "="*60)
    print("✅ ПРОВЕРКА ЗАВЕРШЕНА")
    print("="*60)
    print("💡 Для постоянного мониторинга запускайте этот скрипт периодически")
    print("💡 Или используйте test_websocket_monitoring.py для полного тестирования")


if __name__ == "__main__":
    main()