import { useState, useEffect } from "react"; import { useAuth } from "../../_assets/utils/AuthProvider"; import { GetAllDoctors, GetDoctorByName } from '../../_assets/utils/Functions-Endpoints/Doctor'; import API_KEY from "../../_assets/utils/apiKeys"; import "../../_assets/css/components/agendamento/FormAgendamento.css"; const ENDPOINT_CRIAR_EXCECAO = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions"; const FormCriarExcecao = ({ onCancel, doctorID }) => { const { getAuthorizationHeader, user, getUserInfo } = useAuth(); const [dadosAtendimento, setDadosAtendimento] = useState({ profissional: doctorID || '', crm: '', tipoAtendimento: '', dataAtendimento: '', inicio: '', termino: '', motivo: '' }); const [todosProfissionais, setTodosProfissionais] = useState([]); const [profissionaisFiltrados, setProfissionaisFiltrados] = useState([]); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [doctorSearchName, setDoctorSearchName] = useState(''); const [searchingDoctor, setSearchingDoctor] = useState(false); const handleAtendimentoChange = (e) => { const { value, name } = e.target; setDadosAtendimento(prev => ({ ...prev, [name]: value })); }; // Preencher automaticamente usando GetDoctorByName (se disponível) ou dados do usuário como fallback useEffect(() => { let cancelled = false; const loggedDoctorId = doctorID || user?.doctor_id || user?.id || null; const userName = user?.full_name || user?.name || user?.username || ''; const userCrm = user?.crm || user?.crm_number || user?.crmFormatted || ''; const tryFill = async () => { // se não há nome para buscar, usa fallback local if (!userName) { setDadosAtendimento(prev => ({ ...prev, profissional: prev.profissional || loggedDoctorId || '', crm: prev.crm || userCrm || '' })); setDoctorSearchName(prev => prev || ''); return; } try { const authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; const doctor = await GetDoctorByName(userName, authHeader); if (cancelled) return; if (doctor) { const crmValue = doctor.crm || doctor.crm_number || doctor.crmFormatted || userCrm || ''; const idValue = doctor.id || loggedDoctorId || ''; setDadosAtendimento(prev => ({ ...prev, profissional: prev.profissional || idValue, crm: prev.crm || crmValue })); setDoctorSearchName(prev => prev || (doctor.full_name || userName)); } else { // fallback para dados do usuário quando busca não retorna resultado setDadosAtendimento(prev => ({ ...prev, profissional: prev.profissional || loggedDoctorId || '', crm: prev.crm || userCrm || '' })); setDoctorSearchName(prev => prev || userName); } } catch (err) { console.warn('GetDoctorByName falhou, usando fallback do usuário:', err); if (cancelled) return; setDadosAtendimento(prev => ({ ...prev, profissional: prev.profissional || loggedDoctorId || '', crm: prev.crm || userCrm || '' })); setDoctorSearchName(prev => prev || userName); } }; tryFill(); return () => { cancelled = true; }; }, [doctorID, user, getAuthorizationHeader]); useEffect(() => { const loadDoctors = async () => { setSearchingDoctor(true); let authHeader = ''; try { authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; } catch {} try { const Medicos = await GetAllDoctors(authHeader); const medicosArray = Array.isArray(Medicos) ? Medicos : []; setTodosProfissionais(medicosArray); // preencher automaticamente com médico logado (se encontrado na lista) const loggedDoctorId = doctorID || user?.doctor_id || user?.id || null; if (loggedDoctorId) { const match = medicosArray.find(d => String(d.id) === String(loggedDoctorId) || String(d.doctor_id || '').toLowerCase() === String(loggedDoctorId).toLowerCase() ); if (match) { const crmValue = match.crm || match.crm_number || match.crmFormatted || ''; setDadosAtendimento(prev => ({ ...prev, profissional: prev.profissional || match.id, crm: prev.crm || crmValue })); setDoctorSearchName(prev => prev || (match.full_name || '')); } else { // se não encontrou na lista mas user tem crm, preenche crm const userCrm = user?.crm || user?.crm_number || ''; if (userCrm) { setDadosAtendimento(prev => ({ ...prev, crm: prev.crm || userCrm })); } } } else { // se não há loggedDoctorId, mas user tem crm, preenche crm const userCrm = user?.crm || user?.crm_number || ''; if (userCrm) { setDadosAtendimento(prev => ({ ...prev, crm: prev.crm || userCrm })); } } } catch (err) { console.error('Erro ao carregar médicos:', err); setTodosProfissionais([]); } finally { setSearchingDoctor(false); } }; loadDoctors(); }, [getAuthorizationHeader, doctorID, user]); const handleSearchProfissional = (e) => { const term = e.target.value; setDoctorSearchName(term); if (term.trim() === '') { setProfissionaisFiltrados([]); setIsDropdownOpen(false); return; } const filtered = todosProfissionais.filter(p => ((p.full_name || '').toLowerCase().includes(term.toLowerCase()) || (String(p.crm || p.crm_number || '').toLowerCase().includes(term.toLowerCase()))) ); setProfissionaisFiltrados(filtered); setIsDropdownOpen(filtered.length > 0); }; const handleSelectProfissional = (profissional) => { const crmValue = profissional.crm || profissional.crm_number || profissional.crmFormatted || ''; setDadosAtendimento(prev => ({ ...prev, profissional: profissional.id, crm: crmValue })); setDoctorSearchName(profissional.full_name || ''); setProfissionaisFiltrados([]); setIsDropdownOpen(false); }; // lista simples de valores permitidos const ALLOWED_KINDS = ['disponibilidade_extra', 'bloqueio']; const handleSubmitExcecao = async (e) => { e.preventDefault(); console.log("Tentando criar Exceção."); let { profissional, crm, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento; // agora a validação principal é pelo CRM (campo obrigatório) if (!crm || !dataAtendimento || !tipoAtendimento || !motivo) { alert("Por favor, preencha o CRM do médico, Data, Tipo e Motivo."); return; } // se o ID do profissional não foi selecionado, tenta resolver pelo CRM usando lista carregada if (!profissional) { const match = todosProfissionais.find(d => { const dcrm = String(d.crm || d.crm_number || d.crmFormatted || '').trim(); return dcrm && dcrm.toLowerCase() === String(crm).toLowerCase(); }); if (match) { profissional = match.id; } else { alert("Médico com o CRM informado não encontrado. Selecione a partir da lista ou verifique o CRM."); return; } } else { // se ID estiver setado, opcional: conferir se CRM coincide com o cadastrado (se tiver) const sel = todosProfissionais.find(d => d.id === profissional); if (sel) { const dcrm = String(sel.crm || sel.crm_number || sel.crmFormatted || '').trim(); if (dcrm && dcrm.toLowerCase() !== String(crm).toLowerCase()) { // apenas alerta, não bloqueia — mantém ID para envio como pedido if (!window.confirm("O CRM informado não corresponde ao CRM do médico selecionado. Deseja continuar?")) { return; } } } } // usa diretamente o value selecionado (já definido no {isDropdownOpen && profissionaisFiltrados.length > 0 && (
{profissionaisFiltrados.map(p => (
handleSelectProfissional(p)}> {p.full_name}
))}
)} {searchingDoctor && Carregando médicos...} {/* CRM do profissional (agora campo obrigatório de validação) */}
); }; export default FormCriarExcecao;