#!/usr/bin/env python3
"""
Script de diagnóstico completo do sistema
"""

import sys
import os
import requests
import time
from dotenv import load_dotenv

load_dotenv()

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

def test_database():
    """Testa conexão com o banco de dados"""
    print("=== TESTE DE BANCO DE DADOS ===")
    try:
        from src import create_app
        app = create_app()
        with app.app_context():
            from src.extensions import db
            from sqlalchemy import text
            
            start_time = time.time()
            result = db.session.execute(text('SELECT 1 as test'))
            end_time = time.time()
            
            print(f"✅ Conexão com banco: OK ({end_time - start_time:.2f}s)")
            
            from src.models import Agente
            count = db.session.query(Agente).count()
            print(f"✅ Total de agentes no banco: {count}")
            
    except Exception as e:
        print(f"❌ Erro no banco de dados: {str(e)}")
        return False
    return True

def test_ollama_servers():
    """Testa conexão com servidores Ollama"""
    print("\n=== TESTE DE SERVIDORES OLLAMA ===")
    
    servers = [
        os.getenv('ollama_url'),
        os.getenv('backup_url')
    ]
    
    working_servers = []
    
    for i, server in enumerate(servers):
        try:
            print(f"Testando servidor {i+1}: {server}")
            
            start_time = time.time()
            health_response = requests.get(f"{server}/api/health", timeout=10)
            health_time = time.time() - start_time
            
            if health_response.ok:
                print(f"  ✅ Health check: OK ({health_time:.2f}s)")
            else:
                print(f"  ⚠️ Health check: {health_response.status_code}")
            
            start_time = time.time()
            models_response = requests.get(f"{server}/api/tags", timeout=10)
            models_time = time.time() - start_time
            
            if models_response.ok:
                models = models_response.json().get('models', [])
                print(f"  ✅ Modelos disponíveis ({models_time:.2f}s): {len(models)}")
                for model in models:
                    print(f"    - {model['name']}")
                working_servers.append(server)
            else:
                print(f"  ❌ Erro ao listar modelos: {models_response.status_code}")
                
        except requests.Timeout:
            print(f"  ❌ Timeout ao conectar com {server}")
        except requests.ConnectionError:
            print(f"  ❌ Erro de conexão com {server}")
        except Exception as e:
            print(f"  ❌ Erro inesperado com {server}: {str(e)}")
    
    print(f"\n✅ Servidores funcionando: {len(working_servers)}/{len(servers)}")
    return working_servers

def test_chat_endpoint():
    """Testa um chat simples"""
    print("\n=== TESTE DE CHAT ENDPOINT ===")
    
    working_servers = test_ollama_servers()
    if not working_servers:
        print("❌ Nenhum servidor Ollama disponível")
        return False
    
    for server in working_servers:
        try:
            print(f"Testando chat em: {server}")
            
            payload = {
                'model': 'llama3:latest',
                'messages': [
                    {'role': 'system', 'content': 'Você é um assistente útil.'},
                    {'role': 'user', 'content': 'Diga apenas "teste ok"'}
                ],
                'stream': False,
                'temperature': 0.1,
                'num_predict': 50
            }
            
            start_time = time.time()
            response = requests.post(
                f"{server}/api/chat",
                json=payload,
                timeout=(10, 30)
            )
            end_time = time.time()
            
            if response.status_code == 200:
                data = response.json()
                content = data.get('message', {}).get('content', '')
                print(f"  ✅ Chat funcionando ({end_time - start_time:.2f}s)")
                print(f"  📝 Resposta: {content[:100]}...")
                return True
            else:
                print(f"  ❌ Erro no chat: {response.status_code} - {response.text}")
                
        except Exception as e:
            print(f"  ❌ Erro no teste de chat: {str(e)}")
    
    return False

def main():
    print("🔍 DIAGNÓSTICO COMPLETO DO SISTEMA\n")
    
    db_ok = test_database()
    
    servers_ok = test_ollama_servers()
    
    chat_ok = test_chat_endpoint()
    
    print("\n" + "="*50)
    print("📊 RESUMO DO DIAGNÓSTICO")
    print("="*50)
    print(f"Banco de dados: {'✅ OK' if db_ok else '❌ FALHA'}")
    print(f"Servidores Ollama: {'✅ OK' if servers_ok else '❌ FALHA'}")
    print(f"Endpoint de chat: {'✅ OK' if chat_ok else '❌ FALHA'}")
    
    if db_ok and servers_ok and chat_ok:
        print("\n🎉 Sistema funcionando corretamente!")
    else:
        print("\n⚠️ Sistema com problemas. Verifique os erros acima.")

if __name__ == '__main__':
    main()
