File size: 16,225 Bytes
be139a9
a6d3af7
3d3112d
f26a057
 
 
a6d3af7
f26a057
a25294a
 
 
8ad5fda
b2fd8db
a25294a
 
 
 
 
 
 
931beba
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f26a057
a6d3af7
a25294a
 
a6d3af7
 
 
 
 
 
 
 
 
 
 
a25294a
a6d3af7
 
 
a25294a
a6d3af7
 
 
 
 
 
 
 
 
 
 
 
f26a057
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4889af
a6d3af7
148625d
a25294a
8328a9f
148625d
 
a25294a
 
 
41c1961
 
 
148625d
a6d3af7
 
a25294a
a6d3af7
 
148625d
a25294a
a6d3af7
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6d3af7
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d3112d
a25294a
 
 
 
 
 
3d3112d
a25294a
a4889af
a25294a
 
 
 
 
 
 
 
 
a4889af
a25294a
 
f26a057
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f26a057
a25294a
f26a057
a25294a
a6d3af7
a25294a
 
 
 
 
 
 
 
 
 
f26a057
a25294a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49db22a
 
f26a057
a25294a
 
 
f26a057
 
 
a6d3af7
a25294a
 
 
f26a057
 
 
a6d3af7
a25294a
a6d3af7
a25294a
a6d3af7
a25294a
f26a057
a6d3af7
a25294a
 
f26a057
a25294a
 
 
 
 
 
 
 
a6d3af7
 
a25294a
 
a6d3af7
a25294a
a4889af
a25294a
 
a6d3af7
a25294a
f26a057
 
3d3112d
a25294a
 
 
 
a6d3af7
a25294a
a6d3af7
a25294a
 
 
 
 
 
 
 
 
 
 
a4889af
a25294a
 
 
49db22a
a25294a
 
 
a4889af
a25294a
 
 
 
a4889af
a25294a
 
 
a4889af
a25294a
 
 
a4889af
a25294a
 
 
a4889af
a25294a
a4889af
3d3112d
a25294a
a6d3af7
3d3112d
a6d3af7
 
f26a057
 
 
 
 
 
 
 
3d3112d
 
 
 
 
 
 
 
a6d3af7
 
 
a25294a
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
import gradio as gr
from transformers import pipeline
import json
import sqlite3
from datetime import datetime, timedelta
import pandas as pd
import random
from typing import Dict, List, Optional
from performance_system import PerformanceAnalyzer
from simulado_system import SimuladoSystem, CasoClinicoSystem
import json
from database.db_manager import DatabaseManager
from database.db_operations import adicionar_lote_questoes
from study_generators import StudyMaterialGenerator, StudyPlanGenerator
from performance_analyzer import PerformanceAnalyzer
import json

class CRMJABot:
    def __init__(self):
        self.db = DatabaseManager()
        self.material_generator = StudyMaterialGenerator(self.db.get_connection())
        self.planner = StudyPlanGenerator(self.db)
        self.performance = PerformanceAnalyzer(self.db.get_connection())  # Corrigido aqui
        
        try:
            with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
                questoes = json.load(f)
            
            sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
            
            if sucesso:
                print("Questões adicionadas com sucesso!")
            else:
                print(f"Erro: {mensagem}")
                
        except Exception as e:
            print(f"Erro na inicialização: {str(e)}")

def create_interface():
    return CRMJABot()

if __name__ == "__main__":
    interface = create_interface()
def buscar_questoes_para_simulado(db: DatabaseManager, usuario_id: str, 
                                 num_questoes: int = 10, 
                                 areas: list = None,
                                 dificuldade: str = None):
    """Busca questões para gerar simulado personalizado"""
    try:
        conn = db.get_connection()
        cursor = conn.cursor()
        
        # Busca áreas fracas do usuário
        user_profile = db.get_user_profile(usuario_id)
        weak_areas = user_profile.get('weak_areas', [])
        
        # Monta a query
        query = '''
        SELECT * FROM previous_questions 
        WHERE 1=1
        '''
        params = []
        
        if areas:
            query += ' AND area IN ({})'.format(','.join(['?']*len(areas)))
            params.extend(areas)
            
        if dificuldade:
            query += ' AND difficulty = ?'
            params.append(dificuldade)
            
        # Prioriza áreas fracas
        if weak_areas:
            query += f''' 
            ORDER BY 
            CASE 
                WHEN area IN ({','.join(['?']*len(weak_areas))}) THEN 1 
                ELSE 2 
            END, 
            RANDOM()
            '''
            params.extend(weak_areas)
        else:
            query += ' ORDER BY RANDOM()'
            
        query += ' LIMIT ?'
        params.append(num_questoes)
        
        cursor.execute(query, params)
        questoes = cursor.fetchall()
        
        return [dict(q) for q in questoes]
        
    except Exception as e:
        logger.error(f"Erro ao buscar questões: {e}")
        return []
from performance_system import PerformanceAnalyzer, StudyMaterialGenerator, ProgressTracker

class MotivationalCoach:
    """Classe para gerenciar mensagens e estratégias motivacionais"""
    
    def __init__(self):
        self.frases_motivacionais = [
            "🌟 Cada hora de estudo te aproxima mais do seu objetivo!",
            "💪 Você está construindo seu futuro a cada dia!",
            "🎯 Mantenha o foco! O Revalida é só uma etapa da sua jornada de sucesso!",
            "⭐ Sua dedicação é inspiradora! Continue assim!",
            "🌈 Acredite no seu potencial! Você está no caminho certo!",
            "📚 Conhecimento é poder, e você está ficando mais forte a cada dia!",
            "🌅 Um novo dia, uma nova oportunidade de aprender!",
            "🎓 Sua aprovação no Revalida está cada vez mais próxima!"
        ]
        
        self.dicas_estudo = [
            "📌 Faça pequenas pausas a cada 45 minutos de estudo",
            "💡 Revise o conteúdo do dia antes de dormir",
            "🎯 Estabeleça metas diárias pequenas e alcançáveis",
            "📊 Alterne entre diferentes tópicos para manter o interesse",
            "🌟 Pratique questões antigas do Revalida regularmente",
            "💪 Mantenha uma rotina regular de estudos",
            "🧠 Use mapas mentais para conectar conceitos",
            "📝 Faça resumos ativos do conteúdo estudado"
        ]

    def get_motivational_message(self) -> str:
        return random.choice(self.frases_motivacionais)

    def get_study_tip(self) -> str:
        return random.choice(self.dicas_estudo)

class StudyAnalytics:
    """Classe para análise avançada do progresso do estudante"""
    
    def __init__(self, db_connection):
        self.conn = db_connection

    def calculate_study_metrics(self, user_id: str) -> Dict:
        """Calcula métricas avançadas de estudo"""
        cursor = self.conn.cursor()
        
        # Horas totais de estudo
        cursor.execute('''
            SELECT SUM(horas_estudadas) FROM study_progress 
            WHERE user_id = ?
        ''', (user_id,))
        total_horas = cursor.fetchone()[0] or 0
        
        # Desempenho por área
        cursor.execute('''
            SELECT topic, AVG(performance_score) 
            FROM study_progress 
            WHERE user_id = ? 
            GROUP BY topic
        ''', (user_id,))
        desempenho_por_area = dict(cursor.fetchall())
        
        # Consistência de estudos (dias consecutivos)
        cursor.execute('''
            SELECT date FROM study_progress 
            WHERE user_id = ? 
            ORDER BY date DESC
        ''', (user_id,))
        datas = [row[0] for row in cursor.fetchall()]
        dias_consecutivos = self.calculate_streak(datas)
        
        return {
            "total_horas": total_horas,
            "desempenho_por_area": desempenho_por_area,
            "dias_consecutivos": dias_consecutivos
        }

    @staticmethod
    def calculate_streak(dates: List[str]) -> int:
        if not dates:
            return 0
        
        dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]
        dates.sort(reverse=True)
        
        streak = 1
        for i in range(len(dates)-1):
            if (dates[i] - dates[i+1]).days == 1:
                streak += 1
            else:
                break
        return streak

class CRMJABot:
    def __init__(self):
        self.db = DatabaseManager()
        self.material_generator = StudyMaterialGenerator(self.db.get_connection())
        self.planner = StudyPlanGenerator(self.db)
        self.coach = MotivationalCoach()
        self.analytics = StudyAnalytics(self.db.conn)
        self.tracker = ProgressTracker(self.db.conn)

        self.performance = PerformanceAnalyzer()
        self.performance.set_db_connection(self.db.get_connection())

        try:
            self.qa_pipeline = pipeline(
                "question-answering",
                model="pierreguillou/bert-base-cased-squad-v1.1-portuguese",
                device=-1
            )
        except Exception as e:
            print(f"Erro ao carregar o modelo: {e}")
            self.qa_pipeline = None
        
        self.commands = {
            "/start": self.start_command,
            "/plano": self.create_plan,
            "/progresso": self.check_progress,
            "/questoes": self.previous_questions,
            "/estudo": self.study_mode,
            "/dica": self.get_tip,
            "/motiva": self.get_motivation,
            "/resumo": self.get_summary,
            "/ajuda": self.help_command,
            "/simulado": self.start_simulado,
            "/caso": self.start_caso_clinico,
            "/bancoquestoes": self.banco_questoes,
            "/revisao": self.modo_revisao,
            "/meta": self.set_goal,
            "/perfil": self.show_profile,
            "/configurar": self.configure_preferences
        }
        
    def start_command(self, message: str, user_id: str) -> str:
        """Mensagem inicial de boas-vindas"""
        return f"""🌟 Olá! Eu sou o crmjaBot, seu assistente pessoal para o Revalida!

Estou aqui para te ajudar a alcançar seu objetivo de aprovação! Vamos juntos nessa jornada? 

Comandos principais:
📚 /plano - Criar plano de estudos personalizado
📊 /progresso - Verificar seu progresso
📝 /questoes - Praticar questões anteriores
⏱ /estudo - Registrar sessão de estudo
💡 /dica - Receber dica de estudo
🌟 /motiva - Mensagem motivacional
📋 /resumo - Resumo do seu desempenho
❓ /ajuda - Ver todos os comandos

{self.coach.get_motivational_message()}

Como posso te ajudar hoje?"""

    def get_tip(self, message: str, user_id: str) -> str:
        """Fornece dica de estudo"""
        return f"💡 Dica do dia:\n\n{self.coach.get_study_tip()}"

    def get_motivation(self, message: str, user_id: str) -> str:
        """Fornece mensagem motivacional"""
        return f"✨ Mensagem motivacional:\n\n{self.coach.get_motivational_message()}"

    def get_summary(self, message: str, user_id: str) -> str:
        """Fornece resumo completo do progresso"""
        try:
            metrics = self.analytics.calculate_study_metrics(user_id)
            
            response = f"""📊 Resumo do seu desempenho:

⏱ Total de horas estudadas: {metrics['total_horas']:.1f}h
🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos

📈 Desempenho por área:"""
            
            for area, score in metrics['desempenho_por_area'].items():
                response += f"\n- {area}: {score:.1f}%"
            
            response += f"\n\n{self.coach.get_motivational_message()}"
            
            return response
            
        except Exception as e:
            return f"Erro ao gerar resumo: {str(e)}"

    def create_plan(self, message: str, user_id: str) -> str:
        """Criar plano de estudos personalizado com elementos motivacionais"""
        try:
            parts = message.split()
            if len(parts) < 3:
                return """📚 Para criar seu plano personalizado, preciso de algumas informações:

Formato: /plano horas_diarias AAAA-MM-DD área1,área2

Exemplo: /plano 4 2024-07-15 ClínicaMédica,Cirurgia

As áreas disponíveis são:
- ClínicaMédica
- Cirurgia
- Pediatria
- GinecologiaObstetrícia
- MedicinaFamília
- SaúdeMental"""

            horas = int(parts[1])
            data_alvo = parts[2]
            areas_fracas = parts[3].split(',') if len(parts) > 3 else []
            
            plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas_fracas)
            
            response = f"""✨ Seu Plano de Estudos Personalizado está pronto! 

{self.coach.get_motivational_message()}

📚 Distribuição semanal:"""

            for semana, topicos in plano.items():
                response += f"\n\n📅 {semana}:"
                for topico, horas in topicos.items():
                    response += f"\n  ▪ {topico}: {horas}h"

            response += f"\n\n💡 Dica: {self.coach.get_study_tip()}"
            
            return response
            
        except Exception as e:
            return f"Erro ao criar plano: {str(e)}"

    def check_progress(self, message: str, user_id: str) -> str:
        """Verifica o progresso com feedback motivacional"""
        try:
            metrics = self.analytics.calculate_study_metrics(user_id)
            
            response = f"""📊 Seu Progresso:

⭐ Incrível! Você já estudou {metrics['total_horas']:.1f} horas no total!
🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos

📈 Desempenho por área:"""
            
            for area, score in metrics['desempenho_por_area'].items():
                response += f"\n  ▪ {area}: {score:.1f}%"

            response += f"\n\n{self.coach.get_motivational_message()}"
            
            if metrics['dias_consecutivos'] >= 7:
                response += "\n\n🏆 Parabéns pela dedicação consistente!"
            
            return response
            
        except Exception as e:
            return f"Erro ao verificar progresso: {str(e)}"

    def study_mode(self, message: str, user_id: str) -> str:
        """Registra sessão de estudo com feedback motivacional"""
        try:
            parts = message.split()
            if len(parts) < 3:
                return """📚 Para registrar seu estudo:

Formato: /estudo área horas

Exemplo: /estudo ClínicaMédica 2.5"""
            
            area = parts[1]
            horas = float(parts[2])
            
            cursor = self.db.conn.cursor()
            cursor.execute('''
            INSERT INTO study_progress
            (user_id, date, topic, horas_estudadas, questions_answered, performance_score)
            VALUES (?, ?, ?, ?, ?, ?)
            ''', (user_id, datetime.now().date(), area, horas, 0, 0.0))
            self.db.conn.commit()
            
            metrics = self.analytics.calculate_study_metrics(user_id)
            
            response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area}

⭐ Total de horas estudadas: {metrics['total_horas']:.1f}h
🎯 Sequência atual: {metrics['dias_consecutivos']} dias

{self.coach.get_motivational_message()}

💡 Dica: {self.coach.get_study_tip()}"""
            
            return response
            
        except Exception as e:
            return f"Erro ao registrar estudo: {str(e)}"

    def generate_response(self, message: str, history: List) -> str:
        """Gera resposta personalizada usando o pipeline de QA"""
        if not self.qa_pipeline:
            return f"""Desculpe, o modelo de linguagem não está disponível no momento.

{self.coach.get_motivational_message()}

Use /ajuda para ver os comandos disponíveis!"""
            
        try:
            context = "\n".join([h[1] for h in history[-3:]] if history else "")
            
            result = self.qa_pipeline(
                question=message,
                context=context or "Você é o crmjaBot, um assistente motivacional e educacional para o Revalida."
            )
            
            return f"""{result['answer']}

{self.coach.get_motivational_message()}"""
        except Exception as e:
            return f"Erro ao gerar resposta: {str(e)}"

    def help_command(self, message: str, user_id: str) -> str:
        """Mostra todos os comandos disponíveis"""
        return """🤖 Comandos do crmjaBot:

📚 Estudos:
/plano - Criar plano de estudos personalizado
/estudo - Registrar sessão de estudo
/questoes - Praticar questões anteriores

📊 Acompanhamento:
/progresso - Ver seu progresso
/resumo - Resumo completo do desempenho

✨ Motivacional:
/dica - Receber dica de estudo
/motiva - Mensagem motivacional

❓ Ajuda:
/start - Iniciar/reiniciar bot
/ajuda - Ver esta mensagem

Estou aqui para te ajudar! Como posso ser útil hoje?"""

def create_interface():
    """Criar interface Gradio"""
    bot = CRMJABot()
    
    with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface:
        gr.Markdown("# 🏥 crmjaBot")
        gr.Markdown("### Seu mentor personalizado para o Revalida")
        
        with gr.Row():
            with gr.Column():
                user_id = gr.Textbox(
                    label="Seu ID (email ou telefone)",
                    placeholder="Digite seu ID único..."
                )
        
        chatbot = gr.Chatbot()
        msg = gr.Textbox(
            placeholder="Digite sua mensagem ou comando aqui...",
            show_label=False
        )
        clear = gr.ClearButton([msg, chatbot])

        def respond(message, history):
            bot_message = bot.process_message(message, user_id.value or "default_user", history)
            history.append((message, bot_message))
            return "", history

        msg.submit(respond, [msg, chatbot], [msg, chatbot])

    return interface

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