import { useState, useCallback, useMemo } from 'react'; import { rhExperienceContractService } from '../services/rhExperienceContractService'; import { toast } from 'sonner'; /** * Hook para gerenciar contratos de experiência do RH. */ export const useExperienceContracts = () => { const [contracts, setContracts] = useState([]); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(false); const [viewMode, setViewMode] = useState('registros'); // 'registros', 'dashboards' const [displayMode, setDisplayMode] = useState('kanban'); // 'kanban', 'tabela' const [filters, setFilters] = useState({ search: '', empresa: '' }); const fetchContracts = useCallback(async () => { setLoading(true); try { const response = await rhExperienceContractService.getContracts(); const data = response?.dados || response?.Base_Dados_API || response || []; setContracts(Array.isArray(data) ? data : []); } catch (error) { console.error('Erro ao buscar contratos:', error); toast.error('Erro ao carregar contratos de experiência.'); } finally { setLoading(false); } }, []); const fetchStatistics = useCallback(async (empresa) => { try { const response = await rhExperienceContractService.getStatistics(empresa ? { empresa } : {}); // Preserva a estrutura completa: { experiencia, prorrogacao, resumo } const data = response?.dados || response?.Base_Dados_API || response; setStats(data || null); } catch (error) { console.error('Erro ao buscar estatísticas:', error); } }, []); const handleCreateContract = async (payload) => { try { await rhExperienceContractService.createContract(payload); toast.success('Contrato criado com sucesso!'); fetchContracts(); return true; } catch (error) { console.error('Erro ao criar contrato:', error); toast.error('Erro ao criar contrato.'); return false; } }; const handleUpdateContract = async (payload) => { try { await rhExperienceContractService.updateContract(payload); toast.success('Contrato atualizado com sucesso!'); fetchContracts(); return true; } catch (error) { console.error('Erro ao atualizar contrato:', error); toast.error('Erro ao atualizar contrato.'); return false; } }; const handleMoveCard = async (idcolaborador, newStatus) => { try { await rhExperienceContractService.updateGlobalStatus({ idcolaborador, global_status: newStatus }); // Update local state for immediate feedback if needed, // or just refetch. Refetching is safer for data consistency. fetchContracts(); } catch (error) { console.error('Erro ao mover contrato:', error); toast.error('Erro ao atualizar status do contrato.'); } }; const filteredContracts = useMemo(() => { return contracts.filter(c => { const matchesSearch = (c.nome || c.nome_completo || '').toLowerCase().includes(filters.search.toLowerCase()) || (c.idcolaborador?.toString() || '').includes(filters.search); const matchesEmpresa = !filters.empresa || c.empresa === filters.empresa; return matchesSearch && matchesEmpresa; }); }, [contracts, filters]); return { contracts: filteredContracts, rawContracts: contracts, stats, loading, viewMode, setViewMode, displayMode, setDisplayMode, filters, setFilters: (newFilters) => setFilters(prev => ({ ...prev, ...newFilters })), fetchContracts, fetchStatistics, handleCreateContract, handleUpdateContract, handleMoveCard }; };