import { useCallback, useMemo } from "react";
import { useParams } from "next/navigation";
import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData";
import { useReceiptStore } from "@/zustand/receiptStore";
import {
  useClearCart,
  useDecrementCart,
  useGetCartItems,
  useIncrementCart,
} from "../hooks/useCartData";

export const useCart = () => {
  const { isSuccess } = useGetProfile();
  const params = useParams();
  const currentSlug = (params.name as string) || null;
  const { clear, increment, decrement, items, slug, setSlug } = useReceiptStore();
  const { mutate: mutateIncrementCart } = useIncrementCart();
  const { mutate: mutateDecrementCart } = useDecrementCart();
  const { mutate: mutateClearCart } = useClearCart();
  const { data: cartItems } = useGetCartItems(isSuccess);

  const addToCart = (id: string | number) => {
    if (isSuccess) {
      mutateIncrementCart(id);
    } else {
      // تنظیم slug هنگام افزودن آیتم به سبد (فقط برای کاربران لاگین نشده)
      if (currentSlug && slug !== currentSlug) {
        setSlug(currentSlug);
      }
      increment(id);
    }
  };

  const removeFromCart = (id: string | number) => {
    if (isSuccess) {
      mutateDecrementCart(id);
    } else {
      decrement(id);
    }
  };

  const clearCart = useCallback(() => {
    if (isSuccess) {
      mutateClearCart();
    } else {
      clear();
    }
  }, [isSuccess, mutateClearCart, clear]);

  const cartItemsMap = useMemo(() => {
    if (isSuccess) {
      if (!cartItems?.data?.items) {
        return {};
      }
      return cartItems.data.items.reduce((acc, item) => {
        acc[item.foodId] = { quantity: item.quantity };
        return acc;
      }, {} as Record<string | number, { quantity: number }>);
    } else {
      return items;
    }
  }, [isSuccess, cartItems?.data?.items, items]);

  const isItemLoading = () => {
    return false;
  };

  // برای کاربران لاگین شده، slug از API می‌آید (در cartItems.data.restaurantId)
  // برای کاربران لاگین نشده، slug از receiptStore می‌آید
  const cartSlug = useMemo(() => {
    if (isSuccess && cartItems?.data?.restaurantId) {
      // اگر از API آمده، می‌توانیم restaurantId را برگردانیم
      // اما بهتر است slug را از URL بگیریم چون API ممکن است restaurantId را برگرداند نه slug
      return currentSlug;
    }
    return slug;
  }, [isSuccess, cartItems?.data?.restaurantId, currentSlug, slug]);

  return {
    items: cartItemsMap,
    slug: cartSlug,
    increment,
    decrement,
    clear,
    addToCart,
    removeFromCart,
    clearCart,
    isItemLoading,
  };
};
