import gradio as gr
from transformers import pipeline
import numpy as np
from typing import List, Dict

class SimpleTemperamentAnalyzer:
    def __init__(self):
        # Modelo para análise de sentimentos em português
        self.model = pipeline(
            "text-classification",
            model="neuralmind/bert-base-portuguese-cased",
            return_all_scores=True
        )
        
        self.temperamentos = {
            'SANGUÍNEO': ['Alegre', 'Extrovertido', 'Social', 'Otimista', 'Comunicativo'],
            'COLÉRICO': ['Líder', 'Determinado', 'Prático', 'Produtivo', 'Independente'],
            'MELANCÓLICO': ['Perfeccionista', 'Detalhista', 'Artístico', 'Sensível', 'Idealista'],
            'FLEUMÁTICO': ['Calmo', 'Pacífico', 'Objetivo', 'Diplomático', 'Organizado']
        }

        # Descrições para análise do modelo
        self.descricoes_temperamentos = {
            'SANGUÍNEO': 'pessoa extrovertida, social, otimista e comunicativa',
            'COLÉRICO': 'pessoa determinada, prática, líder e independente',
            'MELANCÓLICO': 'pessoa perfeccionista, sensível, detalhista e artística',
            'FLEUMÁTICO': 'pessoa calma, pacífica, objetiva e organizada'
        }

    def analisar_texto_caracteristicas(self, caracteristicas: List[str]) -> Dict[str, float]:
        """Usa o modelo NLP para analisar o texto das características selecionadas"""
        # Junta as características em um texto para análise
        texto_analise = " ".join(caracteristicas)
        
        # Análise para cada temperamento
        scores_temp = {}
        for temp, desc in self.descricoes_temperamentos.items():
            # Analisa a similaridade entre as características selecionadas e a descrição do temperamento
            resultado = self.model(f"Características: {texto_analise}. Descrição: {desc}")
            scores_temp[temp] = resultado[0][0]['score']  # Pega o score principal
            
        return scores_temp

    def analisar_respostas(self, respostas_marcadas: List[str]) -> Dict[str, float]:
        """Combina análise tradicional com NLP para gerar pontuações"""
        # Pontuações baseadas em contagem
        pontuacoes_contagem = {}
        for temp, caracteristicas in self.temperamentos.items():
            marcadas = sum(1 for c in caracteristicas if c in respostas_marcadas)
            pontuacoes_contagem[temp] = marcadas
        
        # Pontuações baseadas em NLP
        pontuacoes_nlp = self.analisar_texto_caracteristicas(respostas_marcadas)
        
        # Combina as pontuações (média ponderada)
        pontuacoes_finais = {}
        for temp in self.temperamentos:
            # Peso 0.6 para contagem e 0.4 para NLP
            pond_contagem = pontuacoes_contagem[temp] * 0.6
            pond_nlp = pontuacoes_nlp[temp] * 0.4
            pontuacoes_finais[temp] = pond_contagem + pond_nlp
        
        # Normaliza para 100%
        total = sum(pontuacoes_finais.values())
        if total > 0:
            for temp in pontuacoes_finais:
                pontuacoes_finais[temp] = (pontuacoes_finais[temp] / total) * 100
        
        return pontuacoes_finais

    def interpretar_combinacao(self, temp_ordenados: List[tuple]) -> str:
        """Usa o modelo para interpretar a combinação de temperamentos"""
        combinacao = f"{temp_ordenados[0][0]} com {temp_ordenados[1][0]}"
        interpretacao = self.model(
            f"Combinação de temperamentos: {combinacao}. "
            f"Características principais: {self.descricoes_temperamentos[temp_ordenados[0][0]]} "
            f"com aspectos de {self.descricoes_temperamentos[temp_ordenados[1][0]]}"
        )
        return interpretacao[0][0]['label']

    def gerar_analise(self, temperamento_dominante: str, pontuacoes: Dict[str, float]) -> Dict:
        """Gera uma análise detalhada usando o modelo NLP"""
        descricoes = {
            'SANGUÍNEO': {
                'positivo': ['sociabilidade', 'entusiasmo', 'carisma', 'energia positiva', 'facilidade de comunicação'],
                'desafios': ['tendência à dispersão', 'dificuldade com rotinas', 'pode ser superficial'],
                'profissional': 'Tende a se destacar em áreas que envolvem interação social, vendas, comunicação e trabalho em equipe.',
                'relacionamentos': 'Faz amizades facilmente e mantém um círculo social ativo. Precisa desenvolver maior profundidade nas relações.'
            },
            'COLÉRICO': {
                'positivo': ['liderança', 'determinação', 'praticidade', 'foco em resultados', 'iniciativa'],
                'desafios': ['impaciência', 'autoritarismo', 'dificuldade em demonstrar empatia'],
                'profissional': 'Excelente em posições de liderança, gestão de projetos e empreendedorismo.',
                'relacionamentos': 'Direto e objetivo nas relações, precisa desenvolver mais sensibilidade e paciência.'
            },
            'MELANCÓLICO': {
                'positivo': ['profundidade analítica', 'criatividade', 'atenção aos detalhes', 'sensibilidade', 'perfeccionismo'],
                'desafios': ['autocrítica excessiva', 'tendência à introspecção', 'dificuldade com mudanças'],
                'profissional': 'Se destaca em áreas que exigem análise detalhada, planejamento e criatividade.',
                'relacionamentos': 'Valoriza relações profundas e significativas, mas pode ter dificuldade em se abrir.'
            },
            'FLEUMÁTICO': {
                'positivo': ['equilíbrio emocional', 'diplomacia', 'organização', 'confiabilidade', 'paciência'],
                'desafios': ['passividade', 'resistência a mudanças', 'dificuldade em tomar iniciativa'],
                'profissional': 'Eficiente em funções que requerem mediação, organização e trabalho metódico.',
                'relacionamentos': 'Estável e confiável nas relações, mas pode parecer distante ou pouco expressivo.'
            }
        }

        temp_ordenados = sorted(pontuacoes.items(), key=lambda x: x[1], reverse=True)
        
        # Usa o modelo para interpretar a combinação
        interpretacao_combinacao = self.interpretar_combinacao(temp_ordenados)
        
        analise = {
            'perfil_principal': f"Seu perfil predominante é {temperamento_dominante} ({pontuacoes[temperamento_dominante]:.1f}%), ",
            'combinacao': f"com influências significativas de {' e '.join([f'{temp} ({pont:.1f}%)' for temp, pont in temp_ordenados[1:3]])}.",
            'interpretacao': interpretacao_combinacao,
            'caracteristicas': [],
            'areas_desenvolvimento': [],
            'perfil_profissional': "",
            'relacionamentos': ""
        }
        
        # Análise das características principais usando o modelo
        for temp, pont in temp_ordenados[:2]:
            if pont > 20:
                caract_temp = " ".join(descricoes[temp]['positivo'])
                analise_caract = self.model(f"Características principais: {caract_temp}")
                analise['caracteristicas'].extend(descricoes[temp]['positivo'][:3])
                analise['areas_desenvolvimento'].extend(descricoes[temp]['desafios'][:2])
                analise['perfil_profissional'] += descricoes[temp]['profissional'] + " "
                analise['relacionamentos'] += descricoes[temp]['relacionamentos'] + " "
        
        return analise

def criar_interface():
    analisador = SimpleTemperamentAnalyzer()
    
    def validar_selecao(selecoes):
        if len(selecoes) > 5:
            # Retorna apenas as primeiras 5 seleções
            return selecoes[:5], "Por favor, selecione apenas 5 características."
        return selecoes, "" if selecoes else "Selecione até 5 características que mais combinam com você."
    
    def processar_selecao(selecoes):
        selecoes_validadas, mensagem = validar_selecao(selecoes)
        if mensagem and "apenas" in mensagem:  # Se excedeu o limite
            return f"⚠️ {mensagem}\n\nPor favor, desmarque algumas opções para continuar."
        
        if not selecoes_validadas:
            return "Selecione algumas características para realizar a análise."
            
        pontuacoes = analisador.analisar_respostas(selecoes_validadas)
        temperamento_dominante = max(pontuacoes.items(), key=lambda x: x[1])[0]
        analise = analisador.gerar_analise(temperamento_dominante, pontuacoes)
        
        resultado = "### Resultados da Análise de Temperamento\n\n"
        resultado += "**Características Selecionadas:**\n"
        for caract in selecoes_validadas:
            resultado += f"- {caract}\n"
            
        resultado += "\n**Pontuações:**\n"
        for temp, pont in pontuacoes.items():
            resultado += f"- {temp}: {pont:.1f}%\n"
        
        resultado += f"\n**Análise Detalhada:**\n"
        resultado += f"{analise['perfil_principal']}{analise['combinacao']}\n"
        resultado += f"**Interpretação:** {analise['interpretacao']}\n\n"
        
        resultado += "**Principais Características:**\n"
        for caract in analise['caracteristicas']:
            resultado += f"- {caract}\n"
            
        resultado += "\n**Áreas para Desenvolvimento:**\n"
        for area in analise['areas_desenvolvimento']:
            resultado += f"- {area}\n"
            
        resultado += f"\n**Perfil Profissional:**\n{analise['perfil_profissional']}\n\n"
        resultado += f"**Relacionamentos:**\n{analise['relacionamentos']}\n"
        
        return resultado

    with gr.Blocks(theme=gr.themes.Soft()) as interface:
        gr.Markdown("## Análise de Temperamento Simplificada")
        gr.Markdown("### Selecione exatamente 5 características que mais combinam com você")
        
        todas_caracteristicas = []
        for temp, caract in analisador.temperamentos.items():
            todas_caracteristicas.extend(caract)
        
        selecoes = gr.CheckboxGroup(
            choices=todas_caracteristicas,
            label="Escolha 5 características:",
            info="Limite: 5 características"
        )
        
        btn = gr.Button("Analisar")
        saida = gr.Markdown()
        
        # Atualiza em tempo real para validar seleções
        selecoes.change(
            fn=validar_selecao,
            inputs=selecoes,
            outputs=[selecoes, saida]
        )
        
        # Processa a análise quando o botão é clicado
        btn.click(
            fn=processar_selecao,
            inputs=selecoes,
            outputs=saida
        )
    
    return interface

if __name__ == "__main__":
    interface = criar_interface()
    interface.launch()