import { useState, useEffect } from 'react' import { FileText, Loader2, Download, Calendar, TrendingUp, Building2, ClipboardList, Leaf } from 'lucide-react' import api from '../services/api' type TabKey = 'orcamento' | 'demandas' | 'fornecedores' | 'os' | 'esg_impacto' | 'esg_fornecedores' | 'esg_preventiva' | 'esg_governanca' const tabs: { key: TabKey; label: string; icon: React.ReactNode; esg?: boolean }[] = [ { key: 'orcamento', label: 'Orçamento', icon: }, { key: 'demandas', label: 'Demandas', icon: }, { key: 'fornecedores', label: 'Fornecedores', icon: }, { key: 'os', label: 'OS', icon: }, { key: 'esg_impacto', label: 'Impacto Ambiental', icon: , esg: true }, { key: 'esg_fornecedores', label: 'ESG Fornecedores', icon: , esg: true }, { key: 'esg_preventiva', label: 'Evolução Preventiva', icon: , esg: true }, { key: 'esg_governanca', label: 'Exceções Governança', icon: , esg: true }, ] export default function Relatorios() { const [activeTab, setActiveTab] = useState('orcamento') const [loading, setLoading] = useState(true) const [data, setData] = useState(null) const [dateFrom, setDateFrom] = useState('') const [dateTo, setDateTo] = useState('') useEffect(() => { fetchData() }, [activeTab, dateFrom, dateTo]) const endpoints: Record = { orcamento: '/relatorios/orcamento-mensal', demandas: '/relatorios/demandas-periodo', fornecedores: '/relatorios/fornecedores-ranking', os: '/relatorios/os-performance', esg_impacto: '/relatorios/esg-impacto-ambiental', esg_fornecedores: '/relatorios/esg-fornecedores', esg_preventiva: '/relatorios/esg-evolucao-preventiva', esg_governanca: '/relatorios/esg-excecoes-governanca', } const fetchData = async () => { setLoading(true) try { const params: any = {} if (dateFrom) params.data_inicio = dateFrom if (dateTo) params.data_fim = dateTo const { data } = await api.get(endpoints[activeTab], { params }) setData(data) } catch (err) { console.error('Error fetching report:', err) setData(null) } finally { setLoading(false) } } const renderEsgImpacto = () => { if (!data) return null return (
{data.resumo && (
{data.resumo.map((r: any) => (

Impacto {r.impacto}

{r.total}

))}
)} {renderGenericTable(data.detalhes || [])}
) } const renderEsgFornecedores = () => { if (!data) return null return (
{data.resumo && (
{data.resumo.map((r: any) => (

{r.classificacao_esg}

{r.total}

))}
)} {data.fornecedores && (
{data.fornecedores.map((f: any) => ( ))}
Fornecedor ESG Rating Pol. Ambiental SST EPI Treinada Total OS
{f.razao_social} {f.classificacao_esg || '-'} {Number(f.rating).toFixed(1)} {f.possui_politica_ambiental ? '✅' : '❌'} {f.possui_politica_sst ? '✅' : '❌'} {f.declara_uso_epi ? '✅' : '❌'} {f.equipe_treinada ? '✅' : '❌'} {f.total_os}
)}
) } const renderGenericTable = (items: any[]) => { if (!items || items.length === 0) return

Nenhum dado.

const keys = Object.keys(items[0]).filter(k => k !== 'id') return (
{keys.map(k => )} {items.map((item: any, i: number) => ( {keys.map(k => ( ))} ))}
{k.replace(/_/g, ' ')}
{typeof item[k] === 'number' ? item[k].toLocaleString('pt-BR', { maximumFractionDigits: 2 }) : String(item[k] ?? '-')}
) } const renderContent = () => { if (loading) return
if (!data) return

Nenhum dado disponível.

// ESG specific renderers if (activeTab === 'esg_impacto') return renderEsgImpacto() if (activeTab === 'esg_fornecedores') return renderEsgFornecedores() if (activeTab === 'esg_governanca') { const itens = data.itens || [] return (

Total de exceções: {data.total}

{renderGenericTable(itens.map((w: any) => ({ demanda: w.demanda_numero ? `#${w.demanda_numero} - ${w.demanda_titulo}` : w.demanda_titulo, valor: w.valor_total, status: w.status, })))}
) } // Generic const items = Array.isArray(data) ? data : data?.items || data?.dados || data?.detalhes || [] if (Array.isArray(items) && items.length > 0) return renderGenericTable(items) if (typeof data === 'object' && !Array.isArray(data)) { const entries = Object.entries(data).filter(([k]) => !['items', 'dados', 'detalhes', 'itens', 'resumo', 'fornecedores'].includes(k)) if (entries.length > 0) { return (
{entries.map(([k, v]) => (

{k.replace(/_/g, ' ')}

{typeof v === 'number' ? v.toLocaleString('pt-BR', { maximumFractionDigits: 2 }) : String(v)}

))}
) } } return

Formato de dados não reconhecido.

} return (

Relatórios

Relatórios detalhados por área.

setDateFrom(e.target.value)} className="input-field text-sm" /> setDateTo(e.target.value)} className="input-field text-sm" />
{/* Tabs */}
{tabs.map(tab => ( ))}
{/* Content */}
{renderContent()}
) }