import gradio as gr
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
import logging
import warnings
from typing import List, Tuple, Dict
import random

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
warnings.filterwarnings('ignore')

# Expandindo o banco de passagens bíblicas com mais contexto
BIBLICAL_PASSAGES = {
    "casamento": [
        {
            "passagem": "Efésios 5:22-33",
            "texto": """Vós, mulheres, sujeitai-vos a vossos maridos, como ao Senhor; Porque o marido é a cabeça da mulher, como também Cristo é a cabeça da igreja, sendo ele próprio o salvador do corpo. De sorte que, assim como a igreja está sujeita a Cristo, assim também as mulheres sejam em tudo sujeitas a seus maridos. Vós, maridos, amai vossas mulheres, como também Cristo amou a igreja, e a si mesmo se entregou por ela, Para a santificar, purificando-a com a lavagem da água, pela palavra, Para a apresentar a si mesmo igreja gloriosa, sem mácula, nem ruga, nem coisa semelhante, mas santa e irrepreensível. Assim devem os maridos amar as suas mulheres, como a seus próprios corpos. Quem ama a sua mulher, ama-se a si mesmo.""",
            "contexto": "Relacionamento conjugal e amor sacrificial",
            "aplicação": "Este texto apresenta o modelo divino para o casamento, onde o amor sacrificial e o respeito mútuo são fundamentais. O marido deve amar como Cristo amou a igreja, e a esposa deve respeitar como a igreja respeita a Cristo.",
            "princípios": ["Amor sacrificial", "Respeito mútuo", "Liderança servidora", "Unidade conjugal"]
        },
        {
            "passagem": "1 Coríntios 13:4-7",
            "texto": """O amor é paciente, o amor é bondoso. Não inveja, não se vangloria, não se orgulha. Não maltrata, não procura seus interesses, não se ira facilmente, não guarda rancor. O amor não se alegra com a injustiça, mas se alegra com a verdade. Tudo sofre, tudo crê, tudo espera, tudo suporta.""",
            "contexto": "Definição do amor verdadeiro",
            "aplicação": "Esta passagem define o amor verdadeiro e suas características práticas, essenciais para um casamento saudável.",
            "princípios": ["Paciência", "Bondade", "Humildade", "Perdão", "Perseverança"]
        }
    ],
    "criacao_filhos": [
        {
            "passagem": "Deuteronômio 6:6-9",
            "texto": """E estas palavras, que hoje te ordeno, estarão no teu coração; E as ensinarás a teus filhos, e delas falarás assentado em tua casa, e andando pelo caminho, e deitando-te e levantando-te. Também as atarás por sinal na tua mão, e te serão por frontais entre os teus olhos. E as escreverás nos umbrais de tua casa, e nas tuas portas.""",
            "contexto": "Instrução espiritual dos filhos",
            "aplicação": "Os pais têm a responsabilidade primária de ensinar os princípios divinos aos filhos em todos os momentos da vida cotidiana.",
            "princípios": ["Ensino contínuo", "Exemplo pessoal", "Imersão na Palavra", "Disciplina amorosa"]
        },
        {
            "passagem": "Provérbios 22:6",
            "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
            "contexto": "Educação e formação de caráter",
            "aplicação": "A formação espiritual e moral na infância tem impacto duradouro na vida adulta.",
            "princípios": ["Instrução precoce", "Constância no ensino", "Formação de caráter"]
        }
    ]
}

class EnhancedBiblicalCounselor:
    def __init__(self):
        logger.info("Inicializando conselheiro bíblico aprimorado...")
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
        self.max_length = 512  # Máximo de tokens
        
        try:
            self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
            self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
            self.model.to(self.device)
            logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
        except Exception as e:
            logger.error(f"Erro ao carregar modelo: {str(e)}")
            raise

    def format_contextual_response(self, answer: str, passage: Dict, question: str) -> str:
        """Formata uma resposta contextualizada e detalhada"""
        
        response_template = f"""
🕊️ Resposta Pastoral:
Com base nas Sagradas Escrituras, especialmente em {passage['passagem']}, {answer}

📖 Contexto Bíblico:
{passage['contexto']}

✝️ Princípios Bíblicos Aplicáveis:
{' • '.join(passage['princípios'])}

🙏 Aplicação Prática:
{passage['aplicação']}

📚 Passagem Completa para Meditação:
"{passage['texto']}"

💭 Reflexão Final:
Medite nesta palavra e permita que o Espírito Santo a aplique em sua vida. Lembre-se que a Palavra de Deus é viva e eficaz para todas as áreas de nossa vida.
        """
        return response_template

    def get_comprehensive_answer(self, theme: str, question: str) -> Tuple[str, str]:
        try:
            if theme not in BIBLICAL_PASSAGES:
                return "Tema não encontrado em nossa base.", "Sem referências disponíveis."
            
            # Seleciona uma passagem relevante
            passage = BIBLICAL_PASSAGES[theme][0]  # Poderia ser randomizado entre as disponíveis
            context = passage["texto"]
            
            # Prepara o input com máximo de tokens
            inputs = self.tokenizer.encode_plus(
                question,
                context,
                return_tensors="pt",
                max_length=self.max_length,
                truncation=True,
                padding="max_length"
            ).to(self.device)

            # Gera a resposta
            with torch.no_grad():
                outputs = self.model(**inputs)
            
            answer_start = torch.argmax(outputs.start_logits)
            answer_end = torch.argmax(outputs.end_logits)
            
            tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
            answer = tokens[answer_start:answer_end + 1]
            answer = self.tokenizer.convert_tokens_to_string(answer)

            # Formata resposta contextualizada
            detailed_answer = self.format_contextual_response(answer, passage, question)
            
            # Prepara metadados
            metadata = f"""
📚 Referências Adicionais:
• Passagem Principal: {passage['passagem']}
• Tema: {theme.replace('_', ' ').title()}
• Contexto: {passage['contexto']}
            """

            return detailed_answer, metadata

        except Exception as e:
            logger.error(f"Erro ao processar pergunta: {str(e)}")
            return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"

def create_enhanced_interface():
    counselor = EnhancedBiblicalCounselor()
    
    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("""
        # 🕊️ Conselheiro Bíblico Aprofundado
        ### Orientação Bíblica Contextualizada e Detalhada
        """)

        with gr.Row():
            with gr.Column():
                theme = gr.Dropdown(
                    choices=list(BIBLICAL_PASSAGES.keys()),
                    label="Tema de Aconselhamento",
                    value="casamento"
                )
                question = gr.Textbox(
                    label="Sua Pergunta",
                    placeholder="Compartilhe sua dúvida para receber orientação bíblica...",
                    lines=3
                )
                submit_btn = gr.Button("🙏 Buscar Orientação Aprofundada")

            with gr.Column():
                answer_output = gr.Textbox(
                    label="Conselho Bíblico Detalhado",
                    lines=15
                )
                reference_output = gr.Textbox(
                    label="Referências e Contexto",
                    lines=5
                )

        submit_btn.click(
            fn=lambda t, q: counselor.get_comprehensive_answer(t, q),
            inputs=[theme, question],
            outputs=[answer_output, reference_output]
        )

        gr.Markdown("""
        ---
        💝 Desenvolvido para edificação profunda na Palavra | Baseado nas Sagradas Escrituras
        
        #### Como aproveitar ao máximo este recurso:
        1. Escolha o tema específico de sua dúvida
        2. Faça uma pergunta clara e específica
        3. Leia atentamente a resposta contextualizada
        4. Medite nas passagens bíblicas fornecidas
        5. Ore pedindo sabedoria para aplicar os princípios
        """)

    return demo

if __name__ == "__main__":
    try:
        logger.info("Iniciando aplicação de aconselhamento bíblico aprofundado...")
        demo = create_enhanced_interface()
        demo.launch(server_name="0.0.0.0", share=True, show_error=True)
    except Exception as e:
        logger.error(f"Erro ao iniciar aplicação: {str(e)}")
        raise