#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
🤖 ANALISADOR COM IA - Sistema Bitcoin Monitor
===============================================

📌 O que este módulo faz:
- Integra com LM Studio (qwen/qwen3-next-80b)
- Analisa tendências de Bitcoin com IA
- Gera insights e recomendações inteligentes
- Detecta padrões e anomalias
- Prevê movimentos futuros baseado em dados históricos

📌 Como usar:
    python3 bitcoin_ai_analyzer.py

📌 Requisitos:
- LM Studio rodando em 192.168.1.30:1234
- Modelo: qwen/qwen3-next-80b (ou similar)
- CORS habilitado no LM Studio

🎯 Objetivo: Transformar dados em insights acionáveis com IA

Criado com energia, clareza e propósito.
"""

import json
import requests
from datetime import datetime
from pathlib import Path


# ========================================
# 🔧 CONFIGURAÇÃO
# ========================================

# LM Studio API (Mac Studio M3 Ultra)
LM_STUDIO_API = "http://192.168.1.30:1234/v1/chat/completions"
LM_STUDIO_MODELS_API = "http://192.168.1.30:1234/v1/models"

# Fallback para localhost
LM_STUDIO_API_LOCAL = "http://localhost:1234/v1/chat/completions"

# Modelo recomendado
PREFERRED_MODEL = "qwen/qwen3-next-80b"

# Arquivos
HISTORY_FILE = "bitcoin_history.json"
AI_ANALYSIS_FILE = "bitcoin_ai_analysis.json"

# Timeout para requisições
REQUEST_TIMEOUT = 60  # segundos


# ========================================
# 🔌 FUNÇÕES DE CONEXÃO
# ========================================

def test_lm_studio_connection():
    """
    🔍 Testa conexão com LM Studio

    Returns:
        tuple: (sucesso, url_api, modelos_disponiveis)
    """
    print("🔍 Testando conexão com LM Studio...")

    # Tenta Mac Studio primeiro
    try:
        response = requests.get(
            LM_STUDIO_MODELS_API,
            timeout=5
        )

        if response.status_code == 200:
            models = response.json().get('data', [])
            model_ids = [m.get('id', 'unknown') for m in models]
            print(f"✅ Conectado ao Mac Studio (192.168.1.30:1234)")
            print(f"📊 Modelos disponíveis: {len(model_ids)}")
            for model_id in model_ids:
                print(f"   - {model_id}")
            return True, LM_STUDIO_API, model_ids

    except Exception as e:
        print(f"⚠️ Mac Studio indisponível: {e}")

    # Tenta localhost
    try:
        response = requests.get(
            LM_STUDIO_API_LOCAL.replace('/chat/completions', '/models'),
            timeout=5
        )

        if response.status_code == 200:
            models = response.json().get('data', [])
            model_ids = [m.get('id', 'unknown') for m in models]
            print(f"✅ Conectado ao localhost (localhost:1234)")
            print(f"📊 Modelos disponíveis: {len(model_ids)}")
            return True, LM_STUDIO_API_LOCAL, model_ids

    except Exception as e:
        print(f"❌ Localhost indisponível: {e}")

    print("\n❌ Nenhum servidor LM Studio disponível!")
    print("\n💡 Como resolver:")
    print("   1. Abra o LM Studio")
    print("   2. Vá em 'Local Server'")
    print("   3. Carregue um modelo (qwen/qwen3-next-80b recomendado)")
    print("   4. Clique em 'Start Server'")
    print("   5. Configure CORS: Settings → CORS Origins → Adicione '*'\n")

    return False, None, []


# ========================================
# 📊 FUNÇÕES DE DADOS
# ========================================

def load_history():
    """
    📂 Carrega histórico de monitoramentos

    Returns:
        dict: Dados históricos
    """
    if not Path(HISTORY_FILE).exists():
        print(f"⚠️ Arquivo {HISTORY_FILE} não encontrado")
        return {}

    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception as e:
        print(f"❌ Erro ao carregar histórico: {e}")
        return {}


def save_analysis(analysis):
    """
    💾 Salva análise da IA

    Args:
        analysis (dict): Resultado da análise
    """
    try:
        with open(AI_ANALYSIS_FILE, 'w', encoding='utf-8') as f:
            json.dump(analysis, f, indent=2, ensure_ascii=False)
        print(f"💾 Análise salva em {AI_ANALYSIS_FILE}")
    except Exception as e:
        print(f"❌ Erro ao salvar análise: {e}")


# ========================================
# 🤖 ANÁLISE COM IA
# ========================================

def analyze_with_ai(data, api_url, model=None):
    """
    🤖 Analisa dados de Bitcoin usando LM Studio

    Args:
        data (dict): Dados do monitoramento
        api_url (str): URL da API do LM Studio
        model (str): Modelo a usar (opcional)

    Returns:
        dict: Análise completa com insights
    """
    if not data:
        return {
            'error': 'Nenhum dado disponível para análise',
            'suggestion': 'Execute bitcoin_monitor.py primeiro'
        }

    print("\n🤖 Iniciando análise com IA...")
    print("━" * 60)

    # Prepara contexto para a IA
    context = "📊 DADOS DE MONITORAMENTO DE BITCOIN\n\n"

    total_volume = 0
    for keyword, volume in data.items():
        context += f"• {keyword}: {volume} resultados\n"
        total_volume += volume

    context += f"\n📈 Volume total: {total_volume} resultados\n"

    # Prompt para a IA
    prompt = f"""
{context}

Como especialista em análise de mercado de criptomoedas, analise estes dados e forneça:

1. 📊 ANÁLISE DE TENDÊNCIAS
   - Interprete o volume de buscas de cada termo
   - Identifique o sentimento geral do mercado (bullish/bearish/neutro)
   - Explique o que cada métrica indica

2. 🎯 INSIGHTS PRINCIPAIS
   - Quais padrões são relevantes?
   - O que estes números revelam sobre o comportamento do mercado?
   - Há alguma anomalia ou comportamento atípico?

3. 💡 RECOMENDAÇÕES
   - Que ações um investidor deveria considerar?
   - Qual é o risco atual baseado nestes dados?
   - Sugestões de monitoramento futuro

4. 🔮 PREVISÃO
   - Baseado nestes dados, qual a tendência esperada?
   - Quais indicadores observar nos próximos dias?

Seja objetivo, claro e prático. Forneça insights acionáveis.
"""

    # Mensagens para o modelo
    messages = [
        {
            "role": "system",
            "content": "Você é um analista especializado em mercados de criptomoedas, com expertise em Bitcoin. Forneça análises claras, objetivas e acionáveis."
        },
        {
            "role": "user",
            "content": prompt
        }
    ]

    # Requisição para LM Studio
    try:
        print("📡 Enviando requisição para LM Studio...")
        print(f"🎯 Modelo: {model or 'padrão'}")
        print(f"🔗 API: {api_url}")

        payload = {
            "messages": messages,
            "temperature": 0.7,
            "max_tokens": 1500,
            "stream": False
        }

        if model:
            payload["model"] = model

        response = requests.post(
            api_url,
            headers={"Content-Type": "application/json"},
            json=payload,
            timeout=REQUEST_TIMEOUT
        )

        if response.status_code == 200:
            result = response.json()
            ai_response = result['choices'][0]['message']['content']

            print("✅ Análise concluída!\n")

            # Estrutura da resposta
            analysis = {
                'timestamp': datetime.now().isoformat(),
                'data_analyzed': data,
                'total_volume': total_volume,
                'ai_model': model or result.get('model', 'unknown'),
                'analysis': ai_response,
                'status': 'success'
            }

            return analysis

        else:
            print(f"❌ Erro na API: {response.status_code}")
            print(f"Resposta: {response.text}")
            return {
                'error': f"API retornou status {response.status_code}",
                'details': response.text,
                'status': 'error'
            }

    except requests.Timeout:
        print("⏱️ Timeout! O modelo pode estar processando uma requisição pesada.")
        return {
            'error': 'Timeout na requisição',
            'suggestion': 'Tente novamente ou use um modelo menor',
            'status': 'error'
        }

    except Exception as e:
        print(f"❌ Erro ao fazer requisição: {e}")
        return {
            'error': str(e),
            'status': 'error'
        }


# ========================================
# 📄 FORMATAÇÃO DE SAÍDA
# ========================================

def print_analysis(analysis):
    """
    📄 Exibe análise formatada no terminal

    Args:
        analysis (dict): Resultado da análise
    """
    if analysis.get('status') == 'error':
        print("\n❌ ERRO NA ANÁLISE:")
        print(f"   {analysis.get('error', 'Erro desconhecido')}")
        if 'suggestion' in analysis:
            print(f"\n💡 Sugestão: {analysis['suggestion']}")
        return

    print("\n" + "=" * 60)
    print("🤖 ANÁLISE COM IA - BITCOIN MONITOR")
    print("=" * 60)

    print(f"\n📅 Data/Hora: {analysis.get('timestamp', 'N/A')}")
    print(f"🤖 Modelo: {analysis.get('ai_model', 'N/A')}")
    print(f"📊 Volume Total: {analysis.get('total_volume', 0)} resultados")

    print("\n" + "━" * 60)
    print("📊 ANÁLISE DA IA:")
    print("━" * 60)
    print(analysis.get('analysis', 'Nenhuma análise disponível'))
    print("━" * 60)

    print(f"\n💾 Análise completa salva em: {AI_ANALYSIS_FILE}")
    print("=" * 60 + "\n")


# ========================================
# 🚀 FUNÇÃO PRINCIPAL
# ========================================

def main():
    """
    🚀 Executa análise completa com IA
    """
    print("\n" + "=" * 60)
    print("🤖 ANALISADOR COM IA - Sistema Bitcoin Monitor")
    print("=" * 60 + "\n")

    # Testa conexão com LM Studio
    connected, api_url, models = test_lm_studio_connection()

    if not connected:
        return

    # Escolhe modelo
    model_to_use = None
    if PREFERRED_MODEL in models:
        model_to_use = PREFERRED_MODEL
        print(f"\n✅ Usando modelo preferido: {PREFERRED_MODEL}")
    elif models:
        model_to_use = models[0]
        print(f"\n⚠️ Modelo preferido não encontrado. Usando: {model_to_use}")

    # Carrega dados
    print(f"\n📂 Carregando dados de {HISTORY_FILE}...")
    data = load_history()

    if not data:
        print("❌ Nenhum dado disponível!")
        print("\n💡 Execute primeiro:")
        print("   python3 bitcoin_monitor.py\n")
        return

    print(f"✅ {len(data)} métricas carregadas")

    # Executa análise
    analysis = analyze_with_ai(data, api_url, model_to_use)

    # Exibe resultado
    print_analysis(analysis)

    # Salva análise
    if analysis.get('status') == 'success':
        save_analysis(analysis)

    print("\n💡 Próximos passos:")
    print("   1. Integre esta análise ao relatório HTML")
    print("   2. Envie via Telegram Bot (/analyze)")
    print("   3. Automatize análises diárias")
    print("   4. Crie gráficos baseados nos insights\n")


# ========================================
# 🏁 EXECUÇÃO
# ========================================

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n⚠️ Análise interrompida pelo usuário")
    except Exception as e:
        print(f"\n❌ Erro fatal: {e}")
        import traceback
        traceback.print_exc()
