#!/usr/bin/env python3
"""
Тестовый скрипт для проверки работы LogBoard клиента
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""

import asyncio
import aiohttp
import json
import os
from datetime import datetime

# Конфигурация теста
SERVER_URL = os.getenv('LOGBOARD_SERVER_URL', 'http://localhost:8000')
API_KEY = os.getenv('LOGBOARD_API_KEY', 'dev-key-123')
HOSTNAME = os.getenv('HOSTNAME', 'test-host')

async def test_remote_logs_endpoint():
    """Тестирование эндпоинта для удаленных логов"""
    print(f"Тестирование подключения к серверу: {SERVER_URL}")
    
    # Тестовые данные
    test_data = {
        "hostname": HOSTNAME,
        "container_name": "test-nginx",
        "logs": [
            f"{datetime.now().isoformat()} nginx: [info] Test log line 1",
            f"{datetime.now().isoformat()} nginx: [info] Test log line 2",
            f"{datetime.now().isoformat()} nginx: [error] Test error log",
            f"{datetime.now().isoformat()} nginx: [warn] Test warning log"
        ],
        "timestamp": datetime.now().isoformat()
    }
    
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json',
        'User-Agent': 'LogBoard-Client-Test/1.0'
    }
    
    try:
        async with aiohttp.ClientSession() as session:
            async with session.post(
                f"{SERVER_URL}/api/v1/logs/remote",
                json=test_data,
                headers=headers,
                timeout=aiohttp.ClientTimeout(total=30)
            ) as response:
                print(f"Статус ответа: {response.status}")
                
                if response.status == 200:
                    result = await response.json()
                    print("✅ Успешно отправлены логи:")
                    print(f"   - Хост: {result.get('hostname')}")
                    print(f"   - Контейнер: {result.get('container_name')}")
                    print(f"   - Количество строк: {result.get('message')}")
                    print(f"   - Файл логов: {result.get('log_file')}")
                    return True
                else:
                    error_text = await response.text()
                    print(f"❌ Ошибка отправки логов: {response.status}")
                    print(f"   Ответ сервера: {error_text}")
                    return False
                    
    except aiohttp.ClientError as e:
        print(f"❌ Ошибка подключения к серверу: {e}")
        return False
    except Exception as e:
        print(f"❌ Неожиданная ошибка: {e}")
        return False

async def test_server_health():
    """Тестирование доступности сервера"""
    print(f"Проверка доступности сервера: {SERVER_URL}")
    
    try:
        async with aiohttp.ClientSession() as session:
            async with session.get(
                f"{SERVER_URL}/",
                timeout=aiohttp.ClientTimeout(total=10)
            ) as response:
                if response.status == 200:
                    print("✅ Сервер доступен")
                    return True
                else:
                    print(f"❌ Сервер недоступен, статус: {response.status}")
                    return False
    except Exception as e:
        print(f"❌ Ошибка подключения к серверу: {e}")
        return False

async def main():
    """Основная функция тестирования"""
    print("=" * 60)
    print("LogBoard Client - Тестирование")
    print("=" * 60)
    print(f"Сервер: {SERVER_URL}")
    print(f"API ключ: {API_KEY[:10]}..." if len(API_KEY) > 10 else f"API ключ: {API_KEY}")
    print(f"Хост: {HOSTNAME}")
    print()
    
    # Тест 1: Проверка доступности сервера
    print("1. Проверка доступности сервера...")
    server_available = await test_server_health()
    print()
    
    if not server_available:
        print("❌ Сервер недоступен. Проверьте настройки и запустите сервер.")
        return
    
    # Тест 2: Отправка тестовых логов
    print("2. Отправка тестовых логов...")
    logs_sent = await test_remote_logs_endpoint()
    print()
    
    # Результаты тестирования
    print("=" * 60)
    print("РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ")
    print("=" * 60)
    
    if server_available and logs_sent:
        print("✅ Все тесты пройдены успешно!")
        print("   LogBoard клиент готов к работе.")
    elif server_available and not logs_sent:
        print("⚠️  Сервер доступен, но есть проблемы с отправкой логов.")
        print("   Проверьте настройки API ключа.")
    else:
        print("❌ Тесты не пройдены.")
        print("   Проверьте настройки подключения к серверу.")
    
    print()
    print("Для запуска клиента используйте: make up")
    print("Для просмотра логов: make logs")

if __name__ == "__main__":
    asyncio.run(main())
