File size: 5,579 Bytes
9246929
8b8a5a5
 
 
 
 
 
 
6f40e23
752eafd
716f72e
8b8a5a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a61bbd6
8b8a5a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
from datetime import datetime, timedelta
from typing import Dict, List, Optional
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class StudyMaterialGenerator:
    def __init__(self, db_connection):
        self.db_connection = db_connection
    
    def generate_daily_questions(self, user_id: str, num_questions: int = 10) -> List[Dict]:
        """Gera questões diárias baseadas no perfil do usuário"""
        try:
            conn = self.db.get_connection()
            cursor = conn.cursor()
            
            # Busca áreas fracas do usuário
            user_profile = self.db.get_user_profile(user_id)
            weak_areas = user_profile.get('weak_areas', []) if user_profile else []
            
            # Prioriza questões das áreas fracas
            query = '''
            SELECT * FROM previous_questions 
            WHERE area IN (?) 
            ORDER BY RANDOM() 
            LIMIT ?
            '''
            
            cursor.execute(query, (','.join(weak_areas), num_questions))
            questions = cursor.fetchall()
            
            return [dict(q) for q in questions]
            
        except Exception as e:
            logger.error(f"Erro ao gerar questões: {e}")
            return []
    
    def generate_materials(self, user_id, topic, hours) -> Dict:
        """Gera material de estudo para um tópico específico"""
        try:
            conn = self.db.get_connection()
            cursor = conn.cursor()
            
            # Busca casos clínicos relacionados
            cursor.execute('''
            SELECT * FROM clinical_cases 
            WHERE area = ? 
            ORDER BY RANDOM() 
            LIMIT 3
            ''', (topic,))
            
            cases = cursor.fetchall()
            
            return {
                'topic': topic,
                'clinical_cases': [dict(case) for case in cases],
                'key_points': self._generate_key_points(topic),
                'references': self._get_references(topic)
            }
            
        except Exception as e:
            logger.error(f"Erro ao gerar material: {e}")
            return {}

    def _generate_key_points(self, topic: str) -> List[str]:
        """Gera pontos-chave para um tópico"""
        # Implementar lógica para extrair pontos-chave
        return []

    def _get_references(self, topic: str) -> List[str]:
        """Busca referências para um tópico"""
        # Implementar lógica para buscar referências
        return []

class StudyPlanGenerator:
    def __init__(self, db):
        self.db = db
    
    def generate_plan(self, user_id: str, duration_days: int = 30) -> Dict:
        """Gera um plano de estudos personalizado"""
        try:
            # Busca perfil do usuário
            user_profile = self.db.get_user_profile(user_id)
            if not user_profile:
                return {}
            
            # Calcula distribuição de tempo
            weak_areas = user_profile.get('weak_areas', [])
            study_hours = user_profile.get('study_hours', 4)
            
            plan = {
                'user_id': user_id,
                'duration_days': duration_days,
                'daily_schedule': self._create_daily_schedule(study_hours, weak_areas),
                'weekly_goals': self._create_weekly_goals(weak_areas),
                'start_date': datetime.now().date(),
                'end_date': (datetime.now() + timedelta(days=duration_days)).date()
            }
            
            # Salva o plano no banco
            self._save_plan(user_id, plan)
            
            return plan
            
        except Exception as e:
            logger.error(f"Erro ao gerar plano: {e}")
            return {}
    
    def _create_daily_schedule(self, hours: int, areas: List[str]) -> Dict:
        """Cria cronograma diário"""
        schedule = {}
        hours_per_area = hours / len(areas) if areas else hours
        
        for area in areas:
            schedule[area] = {
                'hours': hours_per_area,
                'questions_goal': int(hours_per_area * 10),  # 10 questões por hora
                'review_time': hours_per_area * 0.2  # 20% do tempo para revisão
            }
        
        return schedule
    
    def _create_weekly_goals(self, areas: List[str]) -> List[Dict]:
        """Cria metas semanais"""
        goals = []
        for area in areas:
            goals.append({
                'area': area,
                'questions_target': 70,  # 10 questões por dia
                'mock_exam_target': 1,   # 1 simulado por semana
                'review_sessions': 2      # 2 sessões de revisão
            })
        return goals
    
    def _save_plan(self, user_id: str, plan: Dict) -> None:
        """Salva o plano no banco de dados"""
        try:
            conn = self.db.get_connection()
            cursor = conn.cursor()
            
            cursor.execute('''
            INSERT INTO study_sessions 
            (user_id, start_time, end_time, topic, activity_type, notes)
            VALUES (?, ?, ?, ?, ?, ?)
            ''', (
                user_id,
                datetime.now(),
                datetime.now() + timedelta(days=plan['duration_days']),
                'multiple',
                'study_plan',
                json.dumps(plan)
            ))
            
            conn.commit()
            
        except Exception as e:
            logger.error(f"Erro ao salvar plano: {e}")