import { useState, useEffect, useCallback } from "react";
import {
  getEmployeeLeaveBalances,
  type LeaveBalance,
} from "../../services/leaveBalanceService";
import { handleToastError } from "../../utils";

interface UseLeaveBalanceState {
  leaveBalances: LeaveBalance[];
  loading: boolean;
  error: string | null;
}

function useLeaveBalance() {
  const [state, setState] = useState<UseLeaveBalanceState>({
    leaveBalances: [],
    loading: false,
    error: null,
  });

  // Fetch leave balances
  const fetchLeaveBalances = useCallback(async () => {
    setState((prev) => ({ ...prev, loading: true, error: null }));

    try {
      const response = await getEmployeeLeaveBalances();

      if (response?.data?.success !== false) {
        setState((prev) => ({
          ...prev,
          leaveBalances: response.data?.data || [],
          loading: false,
          error: null,
        }));
      } else {
        const errorMessage =
          response.data?.message || "Failed to fetch leave balances";
        setState((prev) => ({
          ...prev,
          leaveBalances: [],
          loading: false,
          error: errorMessage,
        }));
      }
    } catch (error: any) {
      const errorMessage = error?.response?.data?.message || error.toString();
      handleToastError(error?.response);
      setState((prev) => ({
        ...prev,
        leaveBalances: [],
        loading: false,
        error: errorMessage,
      }));
    }
  }, []);

  // Auto-fetch on mount
  useEffect(() => {
    fetchLeaveBalances();
  }, []);

  const refreshData = useCallback(async () => {
    await fetchLeaveBalances();
  }, []);

  return {
    ...state,
    refreshData,
  };
}

export default useLeaveBalance;
