/** * Serviço para gerenciar produtos de venda via BFF * Integração com https://bff-dev.saveinmed.com.br/api/v1/produtos-venda */ const BFF_BASE_URL = process.env.NEXT_PUBLIC_BFF_API_URL!; export interface ProdutoVendaResponse { id: string; catalogo_id: string; nome: string; preco_venda: number; observacoes?: string; data_validade?: string; empresa_id: string; createdAt: string; updatedAt: string; } export interface ProdutoCatalogoResponse { $id: string; descricao: string; nome?: string; "codigo-interno"?: string; "codigo-ean"?: string; "principio-ativo"?: string; concentracao?: string; "forma-farmaceutica"?: string; "registro-anvisa"?: string; prescricao?: string; observacoes?: string; laboratorios?: any; categorias?: any; "preco-base"?: number; } export interface ProdutoVendaData { id: string; catalogo_id: string; nome: string; descricao?: string; codigo_ean?: string; codigo_interno?: string; preco_base?: number; preco_venda: number; laboratorio?: string; categoria?: string; lab_nome?: string; cat_nome?: string; observacoes?: string; data_validade?: string; principio_ativo?: string; concentracao?: string; forma_farmaceutica?: string; registro_anvisa?: string; prescricao?: string; } export interface ApiResponse { success: boolean; data?: T; error?: string; } export const produtoVendaService = { /** * Obtém o token de autenticação do localStorage */ getAuthToken: (): string | null => { return localStorage.getItem('access_token'); }, /** * Busca dados do catálogo de produtos por ID */ buscarCatalogoPorId: async (catalogoId: string): Promise => { try { const token = produtoVendaService.getAuthToken(); if (!token) { console.error('❌ Token de autenticação não encontrado'); return null; } const response = await fetch(`${BFF_BASE_URL}/produtos-catalogo/${catalogoId}`, { method: 'GET', headers: { 'accept': 'application/json', 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); return data; } else { const errorData = await response.json(); console.error('❌ Erro ao buscar produto do catálogo:', errorData); return null; } } catch (error) { console.error('💥 Erro ao buscar produto do catálogo:', error); return null; } }, /** * Busca um produto de venda por ID e complementa com dados do catálogo */ buscarPorId: async (produtoId: string): Promise => { try { const token = produtoVendaService.getAuthToken(); if (!token) { console.error('❌ Token de autenticação não encontrado'); return null; } // 1. Buscar dados do produto de venda const vendaResponse = await fetch(`${BFF_BASE_URL}/produtos-venda/${produtoId}`, { method: 'GET', headers: { 'accept': 'application/json', 'Authorization': `Bearer ${token}`, }, }); if (!vendaResponse.ok) { const errorData = await vendaResponse.json(); console.error('❌ Erro ao buscar produto de venda:', errorData); return null; } const produtoVenda: ProdutoVendaResponse = await vendaResponse.json(); // 2. Buscar dados complementares do catálogo let produtoCatalogo: ProdutoCatalogoResponse | null = null; if (produtoVenda.catalogo_id) { produtoCatalogo = await produtoVendaService.buscarCatalogoPorId(produtoVenda.catalogo_id); } // 3. Combinar os dados const produtoCompleto: ProdutoVendaData = { id: produtoVenda.id, catalogo_id: produtoVenda.catalogo_id, nome: produtoVenda.nome || produtoCatalogo?.nome || 'Produto sem nome', descricao: produtoCatalogo?.descricao || '', codigo_ean: produtoCatalogo?.['codigo-ean'] || '', codigo_interno: produtoCatalogo?.['codigo-interno'] || '', preco_base: produtoCatalogo?.['preco-base'] || 0, preco_venda: produtoVenda.preco_venda, laboratorio: produtoCatalogo?.laboratorios || '', categoria: produtoCatalogo?.categorias || '', lab_nome: '', // Será preenchido se necessário cat_nome: '', // Será preenchido se necessário observacoes: produtoVenda.observacoes, data_validade: produtoVenda.data_validade, principio_ativo: produtoCatalogo?.['principio-ativo'] || '', concentracao: produtoCatalogo?.concentracao || '', forma_farmaceutica: produtoCatalogo?.['forma-farmaceutica'] || '', registro_anvisa: produtoCatalogo?.['registro-anvisa'] || '', prescricao: produtoCatalogo?.prescricao || '', }; return produtoCompleto; } catch (error) { console.error('💥 Erro ao buscar produto de venda:', error); return null; } }, /** * Busca múltiplos produtos de venda por IDs */ buscarMultiplosPorIds: async (produtoIds: string[]): Promise => { try { const produtosPromises = produtoIds.map(id => produtoVendaService.buscarPorId(id)); const produtosResults = await Promise.all(produtosPromises); const produtosValidos = produtosResults.filter(produto => produto !== null) as ProdutoVendaData[]; return produtosValidos; } catch (error) { console.error('💥 Erro ao buscar múltiplos produtos de venda:', error); return []; } } };