# 📄 Análise de Código: `MainActivity.java` O `MainActivity.java` é a classe central da aplicação. Como usa o `BottomNavigationView`, ele controla três "ecrãs" virtuais que se escondem ou aparecem dependendo do botão carregado: Agenda, Pacientes e Perfil. ## 1. Importações e Declarações (Linhas 1 - 34) A classe estende `AppCompatActivity` e implementa interfaces do `ConsultaAdapter` (`OnConsultaActionClickListener`, `OnConsultaClickListener`) para conseguir "ouvir" cliques feitos nos itens da lista de consultas. ## 2. Variáveis Globais (Linhas 36 - 57) * **Views de Navegação:** `viewAgenda`, `viewPacientes`, `viewPerfil`, `layTop` — Estas variáveis controlam a visibilidade de cada secção da app. * **RecyclerViews e Adapters:** `recyclerConsultas` e `adapterPacientes` (para a lista de pacientes), `recyclerAgenda` e `adapterAgenda` (para a lista de consultas). * **Firebase:** `mAuth` (autenticação) e `db` (Firestore). * **ID:** `currentMedicoId` guarda o UID (User ID) do médico logado. ## 3. Método `onCreate()` (Linhas 59 - 188) * **Verificação de Login:** A primeira coisa que o `onCreate` faz é verificar se há algum utilizador logado (`mAuth.getCurrentUser() == null`). Se não houver, ele atira o utilizador para a `LoginActivity`. * **Carregamento Instantâneo (SharedPreferences):** Usa o cache local `SessaoMedico` para exibir o nome ("Olá, [Nome]") antes mesmo da base de dados responder. * **Configuração dos Recyclers:** Define os layouts (LinearLayoutManager) e os Adapters que vão desenhar as listas. * **Bottom Navigation:** Há um `setOnItemSelectedListener` que, dependendo do botão tocado (Agenda, Pacientes, Perfil), faz um `setVisibility(View.GONE)` aos ecrãs indesejados e um `VISIBLE` ao ecrã selecionado. * **Início dos Dados:** Chama `loadUtilizadores()`, `loadPerfilMedico()`, e usa a data atual (`SimpleDateFormat`) para chamar `loadConsultasAgendaForDate(today)`. ## 4. Lógica de Pacientes (`loadUtilizadores()`) (Linhas 190 - 230) * Coloca um `SnapshotListener` (espião em tempo real) na coleção `"utilizadores"`. * Se o `tipo` for "paciente" (ou nulo), adiciona à lista e manda o adapter desenhá-los no ecrã. * Tenta ir buscar o nome a `"nome_completo"` e depois a `"nome"`. ## 5. Eventos de Clique nas Consultas (Linhas 232 - 260) * **`onAceitarClick()`:** Altera o status da consulta para "aceite". * **`onEliminarClick()`:** Elimina a consulta inteira da base de dados e informa o utilizador com um Toast. * **`onConsultaClick()`:** Se o médico clicar na consulta (e não nos botões de aceitar/rejeitar), a app vai para a `DetalhePacienteActivity`, passando o `PACIENTE_ID` via Intent. ## 6. Lógica da Agenda (`loadConsultasAgendaForDate()`) (Linhas 262 - 342) * Recebe uma data (ex: `12/04/2026`). * Liga-se à coleção `"consultas"`. Filtra no cliente (através de um `if`) se o ID do médico (como string ou como parte de uma lista) está na consulta. * Aceita três formatos de data via `getAlternativeDate` (ex: 04/05/2026 e 4/5/2026) ou formato ISO. * Só mostra consultas se não estiverem marcadas como "cancelada". ## 7. Lógica do Perfil (`loadPerfilMedico()`) (Linhas 350 - 403) * Acede à coleção `"utilizadores"`. Se o documento não existir, faz um *fallback* e tenta ler na coleção `"medicos"`. * Depois de encontrar, usa o `updateProfileUI()` para meter o nome, email, especialidade e cédula nos `TextViews` respetivos. * Atualiza a `SharedPreferences` para garantir que o "Olá, X" nunca fica vazio quando o ecrã recarrega.