#!/usr/bin/env python3
"""
Скрипт для быстрой диагностики всех сервисов NIN Excel Parsers
"""

import requests
import subprocess
import sys
from pathlib import Path

def check_port(port, service_name):
    """Проверка доступности порта"""
    try:
        import socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex(('localhost', port))
        sock.close()
        
        if result == 0:
            print(f"✅ Порт {port} ({service_name}) - ОТКРЫТ")
            return True
        else:
            print(f"❌ Порт {port} ({service_name}) - ЗАКРЫТ")
            return False
    except Exception as e:
        print(f"❌ Ошибка проверки порта {port}: {e}")
        return False

def check_service(url, service_name):
    """Проверка доступности HTTP сервиса"""
    try:
        response = requests.get(url, timeout=3)
        if response.status_code == 200:
            print(f"✅ {service_name} ({url}) - ДОСТУПЕН")
            return True
        else:
            print(f"⚠️ {service_name} ({url}) - ОТВЕЧАЕТ, но статус {response.status_code}")
            return True
    except requests.exceptions.ConnectionError:
        print(f"❌ {service_name} ({url}) - НЕ ДОСТУПЕН (Connection Error)")
        return False
    except requests.exceptions.Timeout:
        print(f"⚠️ {service_name} ({url}) - ТАЙМАУТ")
        return False
    except Exception as e:
        print(f"❌ {service_name} ({url}) - ОШИБКА: {e}")
        return False

def check_docker():
    """Проверка Docker"""
    try:
        result = subprocess.run(["docker", "--version"], capture_output=True, text=True)
        if result.returncode == 0:
            print(f"✅ Docker: {result.stdout.strip()}")
            return True
        else:
            print("❌ Docker не работает")
            return False
    except FileNotFoundError:
        print("❌ Docker не установлен")
        return False
    except Exception as e:
        print(f"❌ Ошибка проверки Docker: {e}")
        return False

def check_docker_containers():
    """Проверка Docker контейнеров"""
    try:
        result = subprocess.run(["docker", "ps"], capture_output=True, text=True)
        if result.returncode == 0:
            if "minio" in result.stdout.lower():
                print("✅ MinIO контейнер запущен")
                return True
            else:
                print("⚠️ MinIO контейнер не найден")
                return False
        else:
            print("❌ Не удалось проверить Docker контейнеры")
            return False
    except Exception as e:
        print(f"❌ Ошибка проверки контейнеров: {e}")
        return False

def check_python_packages():
    """Проверка Python пакетов"""
    required_packages = ['fastapi', 'streamlit', 'pandas', 'minio', 'uvicorn']
    missing_packages = []
    
    print("\n🔍 Проверка Python пакетов:")
    for package in required_packages:
        try:
            __import__(package)
            print(f"✅ {package}")
        except ImportError:
            print(f"❌ {package}")
            missing_packages.append(package)
    
    if missing_packages:
        print(f"\n⚠️ Отсутствуют пакеты: {', '.join(missing_packages)}")
        print("Установите: pip install -r requirements.txt")
        return False
    
    return True

def main():
    """Основная функция диагностики"""
    print("🔍 ДИАГНОСТИКА NIN Excel Parsers API")
    print("=" * 50)
    
    # Проверка Python пакетов
    packages_ok = check_python_packages()
    
    print("\n🔍 Проверка Docker:")
    docker_ok = check_docker()
    if docker_ok:
        containers_ok = check_docker_containers()
    else:
        containers_ok = False
    
    print("\n🔍 Проверка портов:")
    port_8000_ok = check_port(8000, "FastAPI")
    port_8501_ok = check_port(8501, "Streamlit")
    port_9000_ok = check_port(9000, "MinIO API")
    port_9001_ok = check_port(9001, "MinIO Console")
    
    print("\n🔍 Проверка HTTP сервисов:")
    fastapi_ok = check_service("http://localhost:8000/", "FastAPI")
    streamlit_ok = check_service("http://localhost:8501/", "Streamlit")
    minio_console_ok = check_service("http://localhost:9001/", "MinIO Console")
    
    print("\n" + "=" * 50)
    print("📊 РЕЗУЛЬТАТЫ ДИАГНОСТИКИ:")
    print("=" * 50)
    
    # Подсчет результатов
    total_checks = 8
    passed_checks = sum([
        packages_ok,
        docker_ok,
        containers_ok,
        port_8000_ok,
        port_8501_ok,
        port_9000_ok,
        port_9001_ok,
        fastapi_ok
    ])
    
    print(f"✅ Пройдено: {passed_checks}/{total_checks}")
    
    if passed_checks == total_checks:
        print("\n🎉 Все сервисы работают корректно!")
        print("📍 Доступные URL:")
        print("   • Streamlit: http://localhost:8501")
        print("   • FastAPI: http://localhost:8000")
        print("   • API Docs: http://localhost:8000/docs")
        print("   • MinIO: http://localhost:9001")
    else:
        print(f"\n⚠️ Проблемы обнаружены в {total_checks - passed_checks} сервисах")
        
        if not packages_ok:
            print("\n🔧 РЕШЕНИЕ: Установите зависимости")
            print("pip install -r requirements.txt")
        
        if not docker_ok:
            print("\n🔧 РЕШЕНИЕ: Запустите Docker Desktop")
        
        if not containers_ok:
            print("\n🔧 РЕШЕНИЕ: Запустите MinIO")
            print("docker-compose up -d minio")
        
        if not port_8000_ok:
            print("\n🔧 РЕШЕНИЕ: Запустите FastAPI сервер")
            print("python run_dev.py")
        
        if not port_8501_ok:
            print("\n🔧 РЕШЕНИЕ: Запустите Streamlit")
            print("python run_streamlit.py")
        
        print("\n🚀 Для автоматического запуска используйте:")
        print("python start_demo.py")
        print("\n🔍 Для пошагового запуска используйте:")
        print("python run_manual.py")

if __name__ == "__main__":
    main() 