# diagnostico_lti.py - Script para diagnosticar problemas LTI

import os
import sys
import requests
from urllib.parse import urlparse

def check_server_connectivity(url):
    """Verifica se o servidor está acessível."""
    print(f"🔍 Verificando conectividade com {url}...")
    
    try:
        # Teste GET na raiz
        response = requests.get(url.replace('/launch', '/'), timeout=10)
        print(f"✅ Servidor acessível - Status: {response.status_code}")
        return True
    except requests.exceptions.ConnectionError:
        print("❌ Erro de conexão - Servidor não está acessível")
        return False
    except requests.exceptions.Timeout:
        print("❌ Timeout - Servidor demorou muito a responder")
        return False
    except Exception as e:
        print(f"❌ Erro inesperado: {e}")
        return False

def check_lti_endpoint(url):
    """Verifica se o endpoint LTI responde corretamente."""
    print(f"\n🔍 Verificando endpoint LTI {url}...")
    
    try:
        # Teste POST sem parâmetros LTI (deve retornar erro LTI, não 404)
        response = requests.post(url, data={}, timeout=10)
        
        if response.status_code == 404:
            print("❌ Endpoint LTI não encontrado (404)")
            return False
        elif response.status_code == 500:
            if "LTI" in response.text or "oauth" in response.text.lower():
                print("✅ Endpoint LTI encontrado (erro LTI esperado)")
                return True
            else:
                print("❌ Erro interno do servidor (500)")
                return False
        else:
            print(f"✅ Endpoint LTI responde - Status: {response.status_code}")
            return True
            
    except Exception as e:
        print(f"❌ Erro ao testar endpoint LTI: {e}")
        return False

def validate_lti_config():
    """Valida a configuração LTI."""
    print("\n🔍 Verificando configuração LTI...")
    
    # Verificar variáveis de ambiente
    consumer_key = os.environ.get('LTI_CONSUMER_KEY')
    shared_secret = os.environ.get('LTI_SHARED_SECRET')
    secret_key = os.environ.get('SECRET_KEY')
    
    issues = []
    
    if not consumer_key:
        issues.append("❌ LTI_CONSUMER_KEY não definida")
    else:
        print(f"✅ LTI_CONSUMER_KEY: {consumer_key}")
    
    if not shared_secret:
        issues.append("❌ LTI_SHARED_SECRET não definida")
    else:
        print(f"✅ LTI_SHARED_SECRET: {'*' * len(shared_secret)}")
    
    if not secret_key:
        issues.append("❌ SECRET_KEY não definida")
    else:
        print(f"✅ SECRET_KEY: {'*' * len(secret_key)}")
    
    # Verificar se as chaves são seguras
    if consumer_key and len(consumer_key) < 8:
        issues.append("⚠️ LTI_CONSUMER_KEY muito curta (mínimo 8 caracteres)")
    
    if shared_secret and len(shared_secret) < 16:
        issues.append("⚠️ LTI_SHARED_SECRET muito curta (mínimo 16 caracteres)")
    
    if secret_key and len(secret_key) < 32:
        issues.append("⚠️ SECRET_KEY muito curta (mínimo 32 caracteres)")
    
    if issues:
        print("\n🚨 Problemas encontrados:")
        for issue in issues:
            print(f"  {issue}")
        return False
    else:
        print("\n✅ Configuração LTI parece estar correta")
        return True

def check_dependencies():
    """Verifica se as dependências estão instaladas."""
    print("\n🔍 Verificando dependências Python...")
    
    required_packages = [
        'flask',
        'pylti',
        'requests'
    ]
    
    missing = []
    
    for package in required_packages:
        try:
            __import__(package)
            print(f"✅ {package}")
        except ImportError:
            print(f"❌ {package}")
            missing.append(package)
    
    if missing:
        print(f"\n🚨 Dependências em falta: {', '.join(missing)}")
        print("💡 Para instalar: pip install " + " ".join(missing))
        return False
    
    return True

def check_app_structure():
    """Verifica se a estrutura da aplicação está correta."""
    print("\n🔍 Verificando estrutura da aplicação...")
    
    required_files = [
        'app.py',
        'src/data_ingestion.py',
        'src/question_generation.py',
        'src/grading.py'
    ]
    
    missing = []
    
    for file_path in required_files:
        if os.path.exists(file_path):
            print(f"✅ {file_path}")
        else:
            print(f"❌ {file_path}")
            missing.append(file_path)
    
    if missing:
        print(f"\n🚨 Ficheiros em falta: {', '.join(missing)}")
        return False
    
    return True

def generate_test_urls():
    """Gera URLs de teste baseadas na configuração."""
    print("\n🔧 URLs de Teste Sugeridas:")
    
    # Tentar detectar o IP local
    import socket
    try:
        # Conectar a um endereço externo para descobrir o IP local
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            s.connect(("8.8.8.8", 80))
            local_ip = s.getsockname()[0]
    except:
        local_ip = "SEU_IP_AQUI"
    
    print(f"  URL de Lançamento: http://{local_ip}:5000/launch")
    print(f"  URL Base: http://{local_ip}:5000/")
    print(f"  URL de Teste: curl -X POST http://{local_ip}:5000/launch")

def main():
    """Função principal de diagnóstico."""
    print("🩺 Diagnóstico LTI - Sistema de Auto-Avaliação")
    print("=" * 50)
    
    # Verificar se estamos no diretório correto
    if not os.path.exists('app.py'):
        print("❌ Execute este script no diretório da aplicação (onde está o app.py)")
        sys.exit(1)
    
    # Executar verificações
    checks = [
        ("Estrutura da Aplicação", check_app_structure),
        ("Dependências", check_dependencies),
        ("Configuração LTI", validate_lti_config),
    ]
    
    all_passed = True
    
    for check_name, check_func in checks:
        result = check_func()
        if not result:
            all_passed = False
    
    # URLs de teste
    generate_test_urls()
    
    # Teste de conectividade (opcional)
    print("\n❓ Deseja testar a conectividade? (requer aplicação a correr)")
    response = input("Digite 'y' para sim, qualquer outra tecla para não: ")
    
    if response.lower() == 'y':
        url = input("Digite a URL da aplicação (ex: http://127.0.0.1:5000): ")
        if url:
            check_server_connectivity(url)
            check_lti_endpoint(f"{url}/launch")
    
    # Resumo final
    print("\n" + "=" * 50)
    if all_passed:
        print("✅ Diagnóstico concluído - Configuração parece estar correta")
        print("💡 Se ainda tiver problemas, verifique:")
        print("   - As credenciais LTI no Moodle coincidem exatamente")
        print("   - A aplicação Flask está a correr")
        print("   - O firewall permite acesso à porta 5000")
    else:
        print("❌ Problemas encontrados - Corrija os erros acima")
        print("💡 Consulte o guia de configuração para mais detalhes")

if __name__ == "__main__":
    main()
