import React, { useEffect, useState, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import API_KEY from '../components/utils/apiKeys';
import { useAuth } from '../components/utils/AuthProvider';
import TiptapEditor from './TiptapEditor';
import { GetAllPatients } from '../components/utils/Functions-Endpoints/Patient';
import { GetAllDoctors } from '../components/utils/Functions-Endpoints/Doctor';
import { UserInfos } from '../components/utils/Functions-Endpoints/General';
import './styleMedico/FormNovoRelatorio.css';
const FormNovoRelatorio = () => {
const { getAuthorizationHeader } = useAuth();
const authHeader = getAuthorizationHeader();
const navigate = useNavigate();
const [patients, setPatients] = useState([]);
const [doctors, setDoctors] = useState([]);
const [loadingPatients, setLoadingPatients] = useState(true);
const [loadingDoctors, setLoadingDoctors] = useState(true);
const [form, setForm] = useState({
patient_id: '',
patient_name: '',
patient_birth: '',
doctor_id: '',
doctor_name: '',
contentHtml: '',
});
const [patientQuery, setPatientQuery] = useState('');
const [doctorQuery, setDoctorQuery] = useState('');
const [showPatientDropdown, setShowPatientDropdown] = useState(false);
const [showDoctorDropdown, setShowDoctorDropdown] = useState(false);
const patientRef = useRef();
const doctorRef = useRef();
useEffect(() => {
let mounted = true;
const loadPatients = async () => {
setLoadingPatients(true);
try {
const list = await GetAllPatients(authHeader);
if (mounted && Array.isArray(list)) setPatients(list);
} catch (err) {
console.error('Erro GetAllPatients:', err);
} finally {
if (mounted) setLoadingPatients(false);
}
};
const loadDoctors = async () => {
setLoadingDoctors(true);
try {
const list = await GetAllDoctors(authHeader);
if (mounted && Array.isArray(list)) setDoctors(list);
} catch (err) {
console.error('Erro GetAllDoctors:', err);
} finally {
if (mounted) setLoadingDoctors(false);
}
};
loadPatients();
loadDoctors();
return () => { mounted = false; };
}, [authHeader]);
useEffect(() => {
const handleClick = (e) => {
if (patientRef.current && !patientRef.current.contains(e.target)) setShowPatientDropdown(false);
if (doctorRef.current && !doctorRef.current.contains(e.target)) setShowDoctorDropdown(false);
};
document.addEventListener('click', handleClick);
return () => document.removeEventListener('click', handleClick);
}, []);
const generateTemplate = (patientName = '', birthDate = '', doctorName = '') => {
return `
Clinica Rise up
Dr - CRM/SP 123456
Avenida - (79) 9 4444-4444
Paciente: ${patientName}
Data de nascimento: ${birthDate}
Data do exame:
Exame:
Diagnóstico:
Conclusão:
Dr ${doctorName}
Emitido em: 0
`;
};
const choosePatient = async (patient) => {
setForm(prev => ({
...prev,
patient_id: patient.id,
patient_name: patient.full_name || '',
patient_birth: patient.birth_date || '',
contentHtml: generateTemplate(patient.full_name || '', patient.birth_date || '', prev.doctor_name)
}));
setPatientQuery('');
setShowPatientDropdown(false);
};
const chooseDoctor = (doctor) => {
setForm(prev => ({
...prev,
doctor_id: doctor.id,
doctor_name: doctor.full_name || '',
contentHtml: generateTemplate(prev.patient_name, prev.patient_birth, doctor.full_name || '')
}));
setDoctorQuery('');
setShowDoctorDropdown(false);
};
const filteredPatients = patientQuery
? patients.filter(p => (p.full_name || '').toLowerCase().startsWith(patientQuery.toLowerCase())).slice(0, 40)
: [];
const filteredDoctors = doctorQuery
? doctors.filter(d => (d.full_name || '').toLowerCase().startsWith(doctorQuery.toLowerCase())).slice(0, 40)
: [];
const handleEditorChange = (html) => setForm(prev => ({ ...prev, contentHtml: html }));
// 🔹 Agora com created_by sendo o ID do usuário logado
const handleSubmit = async (e) => {
e.preventDefault();
if (!form.patient_id) return alert('Selecione o paciente (clicando no item) antes de salvar.');
if (!form.doctor_id) return alert('Selecione o médico (clicando no item) antes de salvar.');
try {
const myHeaders = new Headers();
myHeaders.append('apikey', API_KEY);
if (authHeader) myHeaders.append('Authorization', authHeader);
myHeaders.append('Content-Type', 'application/json');
myHeaders.append('Accept', 'application/json');
myHeaders.append('Prefer', 'return=representation');
const payload = {
patient_id: form.patient_id,
content_html: form.contentHtml,
requested_by: form.doctor_name || ''
};
// Busca o id do usuário logado (via token)
let userId = null;
try {
const token = authHeader?.replace(/^Bearer\s+/i, '') || '';
const userInfo = await UserInfos(token);
userId =
userInfo?.id ||
userInfo?.user?.id ||
userInfo?.sub ||
userInfo?.data?.id;
} catch (err) {
console.warn('Não foi possível obter o ID do usuário logado:', err);
}
if (userId) {
payload.created_by = userId;
} else {
console.warn('ID do usuário não encontrado, created_by não será incluído.');
}
payload.status = 'draft';
const res = await fetch('https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports', {
method: 'POST',
headers: myHeaders,
body: JSON.stringify(payload),
});
if (!res.ok) {
let txt;
try {
txt = await res.json();
} catch {
txt = await res.text();
}
console.error('Erro POST criar relatório:', res.status, txt);
return alert(`Erro ao criar relatório (ver console). Status ${res.status}\nMensagem: ${JSON.stringify(txt)}`);
}
const created = await res.json();
console.log('Relatório criado:', created);
window.dispatchEvent(new Event('reports:refresh'));
alert('Relatório criado com sucesso!');
navigate('/medico/relatorios');
} catch (err) {
console.error('Erro salvar relatório (catch):', err);
alert('Erro ao salvar relatório. Veja console.');
}
};
return (
);
};
export default FormNovoRelatorio;