import React, { useState, useEffect } from 'react';
import {
Container,
Grid,
Card,
CardContent,
Typography,
Button,
Avatar,
Box,
Chip,
CircularProgress,
Alert,
Paper,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Stepper,
Step,
StepLabel,
Checkbox,
FormControlLabel
} from '@mui/material';
import {
ArrowBack,
CalendarToday,
AccessTime,
Person,
LocalHospital,
CheckCircle,
Email,
Sms
} from '@mui/icons-material';
import { useParams, useNavigate } from 'react-router-dom';
import { Link } from "react-router-dom";
import Swal from "sweetalert2";
import { getAccessToken } from "../../utils/auth.js";
import { getPatientId } from "../../utils/userInfo";
import { getUserRole } from '../../utils/userInfo';
const AgendarConsulta = () => {
const { medicoId } = useParams();
const navigate = useNavigate();
const [medico, setMedico] = useState(null);
const [horariosDisponiveis, setHorariosDisponiveis] = useState([]);
const [loading, setLoading] = useState(true);
const [dataSelecionada, setDataSelecionada] = useState('');
const [horarioSelecionado, setHorarioSelecionado] = useState(null);
const [modalConfirmacao, setModalConfirmacao] = useState(false);
const [agendando, setAgendando] = useState(false);
const [activeStep, setActiveStep] = useState(0);
const [enviarEmail, setEnviarEmail] = useState(true);
const [enviarSMS, setEnviarSMS] = useState(true);
const [minDate, setMinDate] = useState("");
const [carregandoHorarios, setCarregandoHorarios] = useState(false);
const [formData, setFormData] = useState({
scheduled_date: "",
scheduled_time: "",
chief_complaint: "",
patient_notes: ""
});
let [confirmationModal, setConfirmationModal] = useState(false);
const role = getUserRole();
const tokenUsuario = getAccessToken();
const patientId = getPatientId();
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
const supabaseAK = import.meta.env.VITE_SUPABASE_ANON_KEY;
const headers = {
"Content-Type": "application/json",
apikey: supabaseAK,
Authorization: `Bearer ${tokenUsuario}`,
};
const handleConfirmationModal = async () => {
if (!dataSelecionada || !horarioSelecionado) {
alert("Selecione uma data e horário válidos");
return;
}
const confirm = window.confirm(`
Confirmar agendamento:
Médico: Dr. ${medico?.nome}
Especialidade: ${medico?.especialidade}
Data: ${new Date(dataSelecionada).toLocaleDateString('pt-BR')}
Horário: ${horarioSelecionado ? horarioSelecionado.datetime.split("T")[1].substring(0, 5) : ''}
Valor: R$ ${medico?.valorConsulta}
Deseja confirmar?
`);
if (confirm) {
await confirmarAgendamento();
alert(`Consulta marcada com sucesso! Sua consulta com Dr. ${medico.nome} foi agendada.`);
navigate(`/${role}/consultalist`);
}
};
useEffect(() => {
const getToday = () => {
const today = new Date();
const offset = today.getTimezoneOffset();
today.setMinutes(today.getMinutes() - offset);
return today.toISOString().split("T")[0];
};
setMinDate(getToday());
}, []);
useEffect(() => {
carregarMedicoEHorarios();
}, [medicoId]);
const carregarMedicoEHorarios = async () => {
setLoading(true);
try {
// Buscar dados do médico
const medicoResponse = await fetch(
`${supabaseUrl}/rest/v1/doctors?id=eq.${medicoId}`,
{ headers }
);
if (medicoResponse.ok) {
const medicoData = await medicoResponse.json();
if (medicoData.length > 0) {
const doctorData = medicoData[0];
setMedico({
id: doctorData.id,
nome: doctorData.full_name,
especialidade: doctorData.specialty,
valorConsulta: 250, // Valor fixo por enquanto
foto: '',
biografia: doctorData.bio || 'Especialista em ' + doctorData.specialty
});
} else {
throw new Error('Médico não encontrado');
}
} else {
throw new Error('Erro ao carregar dados do médico');
}
setLoading(false);
} catch (error) {
console.error('Erro ao carregar dados:', error);
setMedico(medicoMock);
setLoading(false);
}
};
// Função para buscar horários disponíveis
const fetchHorariosDisponiveis = async (date) => {
if (!medicoId || !date) {
setHorariosDisponiveis([]);
return;
}
setCarregandoHorarios(true);
const startDate = `${date}T00:00:00.000Z`;
const endDate = `${date}T23:59:59.999Z`;
const payload = {
doctor_id: medicoId,
start_date: startDate,
end_date: endDate,
appointment_type: "presencial",
};
try {
const response = await fetch(
`${supabaseUrl}/functions/v1/get-available-slots`,
{
method: "POST",
headers,
body: JSON.stringify(payload),
}
);
const data = await response.json();
console.log("🔍 AgendarConsultas - Resposta da Edge Function:", data);
if (!response.ok) throw new Error(data.error || "Erro ao buscar horários");
// Usar exatamente o mesmo formato do AgendaForm
const slotsDisponiveis = (data?.slots || []).filter((s) => s.available);
console.log("✅ Slots disponíveis após filtro:", slotsDisponiveis);
console.log("🔍 Todos os slots (antes do filtro):", data?.slots);
console.log("❌ Slots NÃO disponíveis:", (data?.slots || []).filter((s) => !s.available));
console.log("✅ AgendarConsultas - Slots disponíveis após filtro:", slotsDisponiveis);
setHorariosDisponiveis(slotsDisponiveis);
if (slotsDisponiveis.length === 0) {
alert("Nenhum horário disponível para este dia.");
}
} catch (error) {
console.error("Erro ao buscar horários disponíveis:", error);
setHorariosDisponiveis([]);
alert("Não foi possível obter os horários disponíveis.");
} finally {
setCarregandoHorarios(false);
}
};
// Atualizar horários quando a data muda
useEffect(() => {
if (dataSelecionada && medicoId) {
fetchHorariosDisponiveis(dataSelecionada);
}
}, [dataSelecionada, medicoId]);
const selecionarHorario = (horario) => {
setHorarioSelecionado(horario);
setModalConfirmacao(true);
setActiveStep(0);
};
const confirmarAgendamento = async () => {
setAgendando(true);
try {
if (!horarioSelecionado || !horarioSelecionado.datetime) {
throw new Error("Horário não selecionado corretamente");
}
// Usar exatamente o mesmo formato que o AgendaForm
const scheduled_at = horarioSelecionado.datetime;
const payload = {
patient_id: patientId,
doctor_id: medicoId,
scheduled_at,
duration_minutes: 30,
appointment_type: "presencial",
chief_complaint: formData.chief_complaint || "Consulta agendada pelo paciente",
patient_notes: formData.patient_notes || "",
created_by: patientId,
};
const response = await fetch(
`${supabaseUrl}/rest/v1/appointments`,
{
method: "POST",
headers: {
...headers,
Prefer: "return=representation",
},
body: JSON.stringify(payload),
}
);
if (response.ok) {
const consultaCriada = await response.json();
console.log("Consulta criada:", consultaCriada);
setActiveStep(2);
setAgendando(false);
// Aqui você pode adicionar envio de SMS se necessário
// if (enviarSMS) {
// await sendSMS(telefone, mensagem, patientId);
// }
} else {
const error = await response.json();
console.error("Erro da API:", error);
throw new Error("Não foi possível criar a consulta");
}
} catch (error) {
console.error('Erro no agendamento:', error);
alert(error.message || "Erro ao realizar agendamento. Tente novamente.");
setAgendando(false);
}
};
const finalizarAgendamento = () => {
setModalConfirmacao(false);
navigate(`/${role}/consultalist`);
};
// Não precisamos mais da linha datasDisponiveis, pois usamos a Edge Function
const horariosDaData = horariosDisponiveis.filter(h => h.data === dataSelecionada);
const renderStepContent = (step) => {
switch (step) {
case 0:
return (