import { create } from 'zustand';
import { rhService } from '../services/rhService';
import { useRhFeedbackStore } from '../components/RhFeedbackNotification';

const notify = (type, title, message) => useRhFeedbackStore.getState().notify(type, title, message);

/**
 * Hook para Gestão de Férias.
 * Implementa a lógica de redução de dias por faltas e filtros de período.
 */
export const useGestaoFerias = create((set, get) => ({
  vacations: [],
  loading: false,
  filters: {
    month: new Date().getMonth() + 1,
    year: new Date().getFullYear(),
    department: ''
  },

  setFilters: (newFilters) => set((state) => ({ 
    filters: { ...state.filters, ...newFilters } 
  })),

  /**
   * Calcula os dias de direito baseado nas faltas
   */
  calculateEntitledDays: (faltas) => {
    if (faltas <= 5) return 30;
    if (faltas <= 14) return 24;
    if (faltas <= 23) return 18;
    if (faltas <= 32) return 12;
    return 0; // Acima de 32 perde o direito
  },

  fetchVacations: async () => {
    set({ loading: true });
    try {
      const { filters } = get();
      const response = await rhService.getCollaborators(filters);
      const rawList = Array.isArray(response) ? response : (response?.data || []);
      
      const mappedVacations = rawList.map(emp => {
        const admissionDate = emp.data_admissao ? new Date(emp.data_admissao) : new Date(2023, 0, 1);
        const lastReturn = emp.data_retorno_ferias ? new Date(emp.data_retorno_ferias) : new Date(admissionDate.getTime() + 365*24*60*60*1000);
        const limitDate = new Date(lastReturn.getTime() + 365*24*60*60*1000);
        
        const faltas = emp.faltas_periodo || 0;
        const diasGozados = emp.dias_gozados || 0;
        const diasDireito = get().calculateEntitledDays(faltas);
        const diasAGozar = Math.max(0, diasDireito - diasGozados);

        return {
          id: emp.idcolaborador || emp.id,
          name: emp.colaboradores || emp.nome,
          avatar: emp.avatar || null,
          role: emp.cargo || 'Colaborador',
          cnpj: emp.cnpj || '00.000.000/0001-00',
          companyName: (emp.empresas || emp.empresa || 'Empresa Padrão').trim(),
          admissionDate: admissionDate.toLocaleDateString(),
          lastReturnDate: lastReturn.toLocaleDateString(),
          limitDate: limitDate.toLocaleDateString(),
          limitDateObj: limitDate,
          faltas,
          diasGozados,
          diasDireito,
          diasAGozar,
          department: emp.cargo || 'Geral',
          status: (emp.status_contrato || emp.status || 'Ativo').toUpperCase()
        };
      });

      // Calcular Estatísticas
      const stats = {
        byCompany: {},
        monthly: Array(12).fill(0).map((_, i) => ({ month: i + 1, count: 0, urgent: 0 })),
        vencendo: 0,
        emGozo: 0,
        totalDias: 0
      };

      mappedVacations.forEach(v => {
        // Por Empresa
        const company = v.companyName;
        stats.byCompany[company] = (stats.byCompany[company] || 0) + 1;
        
        // Por Mês (baseado na data limite de gozo)
        const month = v.limitDateObj.getMonth();
        stats.monthly[month].count++;
        
        const now = new Date();
        const diffDays = (v.limitDateObj - now) / (1000 * 60 * 60 * 24);
        if (diffDays < 60) {
          stats.monthly[month].urgent++;
          stats.vencendo++;
        }

        if (v.status === 'FÉRIAS' || v.status === 'FERIAS') stats.emGozo++;
        stats.totalDias += v.diasAGozar;
      });

      set({ 
        vacations: mappedVacations,
        stats: {
          ...stats,
          chartByCompany: Object.entries(stats.byCompany)
            .map(([name, value]) => ({ name, value }))
            .sort((a, b) => b.value - a.value),
          chartMonthly: stats.monthly.map(m => ({ 
            name: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'][m.month - 1],
            Vencendo: m.urgent,
            Total: m.count,
            monthIdx: m.month
          }))
        }
      });
    } catch (err) {
      notify('error', 'Erro', 'Falha ao carregar dados de férias: ' + err.message);
    } finally {
      set({ loading: false });
    }
  }
}));
