/** * Atualiza um relatório existente (edição) * @param id ID do relatório a ser atualizado * @param dados Dados a serem atualizados no relatório */ export async function editarRelatorio(id: string, dados: Partial<{ patient_id: string; order_number: string; exam: string; diagnosis: string; conclusion: string; cid_code: string; content_html: string; content_json: any; status: string; requested_by: string; due_at: string; hide_date: boolean; hide_signature: boolean; }>): Promise { const url = `${BASE_API_RELATORIOS}/${id}`; const cabecalhos: HeadersInit = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ', }; if (typeof window !== 'undefined') { const token = localStorage.getItem('token'); if (token) { cabecalhos['Authorization'] = `Bearer ${token}`; } } const resposta = await fetch(url, { method: 'PATCH', headers: cabecalhos, body: JSON.stringify(dados), }); if (!resposta.ok) throw new Error('Erro ao atualizar relatório'); return resposta.json(); } // services/reports.ts import { Report, CreateReportData, UpdateReportData, ReportsResponse, ReportResponse, ApiError } from '@/types/report-types'; // URL base da API Mock const BASE_API_RELATORIOS = 'https://mock.apidog.com/m1/1053378-0-default/rest/v1/reports'; // Cabeçalhos base para as requisições function obterCabecalhos(): HeadersInit { const cabecalhos: HeadersInit = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ', }; // Adiciona token de autenticação do localStorage se disponível if (typeof window !== 'undefined') { const token = localStorage.getItem('token'); if (token) { cabecalhos['Authorization'] = `Bearer ${token}`; } } return cabecalhos; } // Função para tratar erros da API async function tratarRespostaApi(resposta: Response): Promise { if (!resposta.ok) { let mensagemErro = `HTTP ${resposta.status}: ${resposta.statusText}`; try { const dadosErro = await resposta.json(); mensagemErro = dadosErro.message || dadosErro.error || mensagemErro; } catch (e) { // Se não conseguir parsear como JSON, usa a mensagem de status HTTP } const erro: ApiError = { message: mensagemErro, code: resposta.status.toString(), }; throw erro; } const dados = await resposta.json(); return dados; } // ===== SERVIÇOS DE RELATÓRIOS MÉDICOS ===== /** * Lista relatórios médicos com filtros opcionais (patient_id, status) */ export async function listarRelatorios(filtros?: { patient_id?: string; status?: string }): Promise { // Monta query string se houver filtros let url = BASE_API_RELATORIOS; if (filtros && (filtros.patient_id || filtros.status)) { const params = new URLSearchParams(); if (filtros.patient_id) params.append('patient_id', filtros.patient_id); if (filtros.status) params.append('status', filtros.status); url += `?${params.toString()}`; } // Monta cabeçalhos conforme cURL const cabecalhos: HeadersInit = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ', }; if (typeof window !== 'undefined') { const token = localStorage.getItem('token'); if (token) { cabecalhos['Authorization'] = `Bearer ${token}`; } } const resposta = await fetch(url, { method: 'GET', headers: cabecalhos, }); if (!resposta.ok) throw new Error('Erro ao buscar relatórios'); const dados = await resposta.json(); if (Array.isArray(dados)) return dados; if (dados && Array.isArray(dados.data)) return dados.data; for (const chave in dados) { if (Array.isArray(dados[chave])) return dados[chave]; } return []; } /** * Busca um relatório específico por ID */ export async function buscarRelatorioPorId(id: string): Promise { try { console.log('🔍 [API RELATÓRIOS] Buscando relatório ID:', id); const resposta = await fetch(`${BASE_API_RELATORIOS}/${id}`, { method: 'GET', headers: obterCabecalhos(), }); const resultado = await tratarRespostaApi(resposta); console.log('✅ [API RELATÓRIOS] Relatório encontrado:', resultado.data); return resultado.data; } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao buscar relatório:', erro); throw erro; } } /** * Cria um novo relatório médico */ export async function criarRelatorio(dadosRelatorio: CreateReportData): Promise { try { console.log('📝 [API RELATÓRIOS] Criando novo relatório...'); console.log('📤 [API RELATÓRIOS] Dados enviados:', dadosRelatorio); const resposta = await fetch(BASE_API_RELATORIOS, { method: 'POST', headers: obterCabecalhos(), body: JSON.stringify(dadosRelatorio), }); console.log('📝 [API RELATÓRIOS] Status da criação:', resposta.status); console.log('📝 [API RELATÓRIOS] Response OK:', resposta.ok); console.log('📝 [API RELATÓRIOS] Response URL:', resposta.url); if (!resposta.ok) { let mensagemErro = `HTTP ${resposta.status}: ${resposta.statusText}`; try { const dadosErro = await resposta.json(); mensagemErro = dadosErro.message || dadosErro.error || mensagemErro; console.log('📝 [API RELATÓRIOS] Erro da API:', dadosErro); } catch (e) { console.log('📝 [API RELATÓRIOS] Não foi possível parsear erro como JSON'); } const erro: ApiError = { message: mensagemErro, code: resposta.status.toString(), }; throw erro; } const resultadoBruto = await resposta.json(); console.log('📝 [API RELATÓRIOS] Resposta bruta da criação:', resultadoBruto); console.log('📝 [API RELATÓRIOS] Tipo da resposta:', typeof resultadoBruto); console.log('📝 [API RELATÓRIOS] Chaves da resposta:', Object.keys(resultadoBruto || {})); let relatorioCriado: Report; // Verifica formato da resposta similar ao listarRelatorios if (resultadoBruto && resultadoBruto.data) { relatorioCriado = resultadoBruto.data; } else if (resultadoBruto && resultadoBruto.id) { relatorioCriado = resultadoBruto; } else if (Array.isArray(resultadoBruto) && resultadoBruto.length > 0) { relatorioCriado = resultadoBruto[0]; } else { console.warn('📝 [API RELATÓRIOS] Formato de resposta inesperado, criando relatório local'); relatorioCriado = { id: 'local-' + Date.now() + '-' + Math.random().toString(36).substr(2, 5), created_at: new Date().toISOString(), updated_at: new Date().toISOString(), ...dadosRelatorio }; } console.log('✅ [API RELATÓRIOS] Relatório processado:', relatorioCriado); return relatorioCriado; } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao criar relatório:', erro); throw erro; } } /** * Atualiza um relatório existente */ export async function atualizarRelatorio(id: string, dadosRelatorio: UpdateReportData): Promise { try { console.log('📝 [API RELATÓRIOS] Atualizando relatório ID:', id); console.log('📤 [API RELATÓRIOS] Dados:', dadosRelatorio); const resposta = await fetch(`${BASE_API_RELATORIOS}/${id}`, { method: 'PATCH', headers: obterCabecalhos(), body: JSON.stringify(dadosRelatorio), }); const resultado = await tratarRespostaApi(resposta); console.log('✅ [API RELATÓRIOS] Relatório atualizado:', resultado.data); return resultado.data; } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao atualizar relatório:', erro); throw erro; } } /** * Deleta um relatório */ export async function deletarRelatorio(id: string): Promise { try { console.log('🗑️ [API RELATÓRIOS] Deletando relatório ID:', id); const resposta = await fetch(`${BASE_API_RELATORIOS}/${id}`, { method: 'DELETE', headers: obterCabecalhos(), }); await tratarRespostaApi(resposta); console.log('✅ [API RELATÓRIOS] Relatório deletado com sucesso'); } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao deletar relatório:', erro); throw erro; } } /** * Lista relatórios de um paciente específico */ export async function listarRelatoriosPorPaciente(idPaciente: string): Promise { try { console.log('👤 [API RELATÓRIOS] Buscando relatórios do paciente:', idPaciente); const resposta = await fetch(`${BASE_API_RELATORIOS}?patient_id=${idPaciente}`, { method: 'GET', headers: obterCabecalhos(), }); const resultado = await tratarRespostaApi(resposta); console.log('✅ [API RELATÓRIOS] Relatórios do paciente encontrados:', resultado.data?.length || 0); return resultado.data || []; } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao buscar relatórios do paciente:', erro); throw erro; } } /** * Lista relatórios de um médico específico */ export async function listarRelatoriosPorMedico(idMedico: string): Promise { try { console.log('👨‍⚕️ [API RELATÓRIOS] Buscando relatórios do médico:', idMedico); const resposta = await fetch(`${BASE_API_RELATORIOS}?doctor_id=${idMedico}`, { method: 'GET', headers: obterCabecalhos(), }); const resultado = await tratarRespostaApi(resposta); console.log('✅ [API RELATÓRIOS] Relatórios do médico encontrados:', resultado.data?.length || 0); return resultado.data || []; } catch (erro) { console.error('❌ [API RELATÓRIOS] Erro ao buscar relatórios do médico:', erro); throw erro; } }