import { useState, useCallback } from 'react';
import { rhService } from '../services/rhService';
import { toast } from 'sonner';

/**
 * Hook customizado para gerenciar benefícios
 */
export const useBeneficios = () => {
  const [beneficios, setBeneficios] = useState([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  /**
   * Criar benefício
   */
  const createBeneficio = useCallback(async (payload) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.createBeneficio(payload);
      const data = response?.data || response;
      toast.success(response?.message || 'Benefício criado com sucesso!');
      return data;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao criar benefício';
      setError(errorMessage);
      toast.error(errorMessage);
      throw err;
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * Listar benefícios
   */
  const fetchBeneficios = useCallback(async (params = {}) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.getAllBeneficios(params);
      // A API retorna { data: [...], success: true } ou diretamente [...]
      const beneficiosList = Array.isArray(response)
        ? response
        : (Array.isArray(response?.data) ? response.data : (response?.beneficios || []));
      setBeneficios(beneficiosList);
      return response;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao listar benefícios';
      setError(errorMessage);
      toast.error(errorMessage);
      return null;
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * Buscar benefício por ID
   */
  const fetchBeneficioById = useCallback(async (id) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.getBeneficioById(id);
      const beneficio = response?.beneficio || response?.data || response;
      return beneficio;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao buscar benefício';
      setError(errorMessage);
      toast.error(errorMessage);
      return null;
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * Atualizar benefício
   */
  const updateBeneficio = useCallback(async (id, payload) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.updateBeneficio(id, payload);
      const data = response?.data || response;
      toast.success(response?.message || 'Benefício atualizado com sucesso!');
      return data;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao atualizar benefício';
      setError(errorMessage);
      toast.error(errorMessage);
      throw err;
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * Deletar benefício
   */
  const deleteBeneficio = useCallback(async (id) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.deleteBeneficio(id);
      toast.success(response?.message || 'Benefício deletado com sucesso!');
      return response;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao deletar benefício';
      setError(errorMessage);
      toast.error(errorMessage);
      throw err;
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * Calcular desconto do benefício
   */
  const calcularBeneficio = useCallback(async (id, payload = {}) => {
    setLoading(true);
    setError(null);
    try {
      const response = await rhService.calcularBeneficio(id, payload);
      return response;
    } catch (err) {
      const errorMessage = err?.response?.data?.message || err?.message || 'Erro ao calcular benefício';
      setError(errorMessage);
      toast.error(errorMessage);
      throw err;
    } finally {
      setLoading(false);
    }
  }, []);

  return {
    beneficios,
    loading,
    error,
    createBeneficio,
    fetchBeneficios,
    fetchBeneficioById,
    updateBeneficio,
    deleteBeneficio,
    calcularBeneficio
  };
};
