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
    };
};
