import React, { useState, useEffect } from "react"; import { Calendar, User, FileText, CheckCircle, LogOut } from "lucide-react"; // import consultaService from "../services/consultaService"; // não utilizado após integração com appointmentService import { appointmentService, patientService } from "../services"; import AvailableSlotsPicker from "../components/agenda/AvailableSlotsPicker"; import { doctorService } from "../services"; import toast from "react-hot-toast"; import { format, addDays } from "date-fns"; import { ptBR } from "date-fns/locale"; import { useNavigate } from "react-router-dom"; interface Medico { _id: string; nome: string; especialidade: string; valorConsulta: number; horarioAtendimento: Record; } interface Paciente { _id: string; nome: string; cpf: string; telefone: string; email: string; } const AgendamentoPaciente: React.FC = () => { const [medicos, setMedicos] = useState([]); const [pacienteLogado, setPacienteLogado] = useState(null); const [patientTableId, setPatientTableId] = useState(null); // ID da tabela patients const [loading, setLoading] = useState(false); const [etapa, setEtapa] = useState(1); const [agendamento, setAgendamento] = useState({ medicoId: "", data: "", horario: "", tipoConsulta: "primeira-vez", motivoConsulta: "", observacoes: "", }); // Slots são carregados diretamente pelo AvailableSlotsPicker const navigate = useNavigate(); useEffect(() => { // Verificar se paciente está logado const pacienteData = localStorage.getItem("pacienteLogado"); if (!pacienteData) { console.log( "[AgendamentoPaciente] Paciente não logado, redirecionando..." ); navigate("/paciente"); return; } try { const paciente = JSON.parse(pacienteData); console.log("[AgendamentoPaciente] Paciente logado:", paciente); setPacienteLogado(paciente); // Buscar o patient.id (ID da tabela) usando o user_id const fetchPatientTableId = async () => { try { const patientData = await patientService.getByUserId(paciente._id); console.log( "[AgendamentoPaciente] Patient data da tabela:", patientData ); if (patientData?.id) { setPatientTableId(patientData.id); console.log( "[AgendamentoPaciente] Patient table ID:", patientData.id ); } else { console.error( "[AgendamentoPaciente] ❌ Paciente não encontrado na tabela" ); } } catch (error) { console.error( "[AgendamentoPaciente] Erro ao buscar patient.id:", error ); } }; void fetchPatientTableId(); void fetchMedicos(); } catch (error) { console.error( "[AgendamentoPaciente] Erro ao carregar dados do paciente:", error ); navigate("/paciente"); } }, [navigate]); // As consultas locais agora aparecem na Dashboard (AcompanhamentoPaciente) const fetchMedicos = async () => { try { console.log("[AgendamentoPaciente] Iniciando busca de médicos..."); const doctors = await doctorService.list({ active: true }); console.log("[AgendamentoPaciente] Médicos recebidos:", doctors); const mapped: Medico[] = doctors.map((m: any) => ({ _id: m.id, nome: m.full_name, especialidade: m.specialty || "", valorConsulta: 0, horarioAtendimento: {}, })); console.log("[AgendamentoPaciente] Médicos mapeados:", mapped); setMedicos(mapped); if (mapped.length === 0) { toast.error( "Nenhum médico ativo encontrado. Por favor, cadastre médicos primeiro." ); } } catch (error) { console.error("[AgendamentoPaciente] Erro ao carregar médicos:", error); toast.error("Erro ao carregar lista de médicos"); } }; // Horários disponíveis agora são resolvidos no componente de slots const handleMedicoChange = (medicoId: string) => { setAgendamento((prev) => ({ ...prev, medicoId, data: "", horario: "" })); }; const handleDataChange = (data: string) => { setAgendamento((prev) => ({ ...prev, data, horario: "" })); }; const confirmarAgendamento = async () => { if (!pacienteLogado) return; // Verificar se temos o patient.id da tabela if (!patientTableId) { console.error( "[AgendamentoPaciente] ❌ Patient table ID não encontrado!" ); toast.error( "Erro: Dados do paciente não carregados. Recarregue a página." ); return; } try { setLoading(true); // Verificar se há token de autenticação const token = localStorage.getItem("mediconnect_access_token"); console.log("[AgendamentoPaciente] Token presente?", !!token); if (!token) { console.error( "[AgendamentoPaciente] ❌ Token não encontrado! Redirecionando para login..." ); toast.error("Sessão expirada. Faça login novamente."); navigate("/paciente"); return; } // NOTE: Removed remote CPF validation to avoid false negatives // NOTE: remote CEP validation removed to avoid false negatives const dataHora = new Date( `${agendamento.data}T${agendamento.horario}:00.000Z` ); // Payload conforme documentação da API Supabase const payload = { doctor_id: agendamento.medicoId, patient_id: patientTableId, scheduled_at: dataHora.toISOString(), duration_minutes: 30, created_by: pacienteLogado._id, }; console.log("[AgendamentoPaciente] 📋 Dados para criar consulta:", { patient_id: patientTableId, patient_user_id: pacienteLogado._id, doctor_id: agendamento.medicoId, scheduled_at: dataHora.toISOString(), chief_complaint: agendamento.motivoConsulta, token_presente: !!token, payload_completo: payload, }); const resultado = await appointmentService.create(payload); console.log( "[AgendamentoPaciente] ✅ Consulta criada com sucesso:", resultado ); toast.success("Consulta agendada com sucesso!"); setEtapa(4); // Etapa de confirmação } catch (error) { console.error( "[AgendamentoPaciente] ❌ Erro ao agendar consulta:", error ); toast.error("Erro ao agendar consulta. Tente novamente."); } finally { setLoading(false); } }; const resetarAgendamento = () => { setAgendamento({ medicoId: "", data: "", horario: "", tipoConsulta: "primeira-vez", motivoConsulta: "", observacoes: "", }); setEtapa(1); }; // Removido: criação/visualização local aqui. Use a Dashboard para ver. const logout = () => { localStorage.removeItem("pacienteLogado"); navigate("/paciente"); }; const proximosSeteDias = () => { const dias = []; for (let i = 1; i <= 7; i++) { const data = addDays(new Date(), i); dias.push({ valor: format(data, "yyyy-MM-dd"), label: format(data, "EEEE, dd/MM", { locale: ptBR }), }); } return dias; }; const medicoSelecionado = medicos.find((m) => m._id === agendamento.medicoId); if (!pacienteLogado) { return (
); } if (etapa === 4) { return (

Consulta Agendada com Sucesso!

Detalhes do Agendamento:

Paciente: {pacienteLogado.nome}

Médico: {medicoSelecionado?.nome}

Especialidade:{" "} {medicoSelecionado?.especialidade}

Data:{" "} {format(new Date(agendamento.data), "dd/MM/yyyy", { locale: ptBR, })}

Horário: {agendamento.horario}

Tipo: {agendamento.tipoConsulta}

{agendamento.motivoConsulta && (

Motivo: {agendamento.motivoConsulta}

)}
); } return (
{/* Header com informações do paciente */}

Bem-vindo(a), {pacienteLogado.nome}!

Agende sua consulta médica

{/* As consultas locais serão exibidas na Dashboard do paciente */} {/* Indicador de Etapas */}
{[1, 2, 3].map((numero) => (
= numero ? "bg-blue-600 text-white" : "bg-gray-300 text-gray-600" }`} > {numero}
{numero < 3 && (
numero ? "bg-blue-600" : "bg-gray-300" }`} /> )} ))}
{/* Etapa 1: Seleção de Médico */} {etapa === 1 && (

Selecione o Médico

)} {/* Etapa 2: Seleção de Data e Horário */} {etapa === 2 && (

Selecione Data e Horário

{agendamento.data && agendamento.medicoId && (
setAgendamento((prev) => ({ ...prev, horario: t })) } />
)}
)} {/* Etapa 3: Informações Adicionais */} {etapa === 3 && (

Informações da Consulta