import { ShowApiErrorToast, ShowSuccessToast } from "@/components/Toast/Toast";
import {
  useCreateTopicMutation,
  useDeleteTopicMutation,
  useGetAllTopicsQuery,
  useGetSingleTopicQuery,
  useUpdateTopicMutation,
} from "@/Redux/Topics/TopicSlice";
import {
  CreateTopicRequest,
  DeleteTopicRequest,
  UpdateTopicRequest,
} from "@/Redux/Topics/TopicTypes";

export const useGetAllTopics = ({
  page,
  limit,
  search,
}: {
  page: number;
  limit: number;
  search: {
    title: string;
  };
}) => {
  try {
    const { data, isError, isFetching, isLoading, refetch, error } =
      useGetAllTopicsQuery({
        page: page || 1,
        limit: limit || 10,
        search: {
          title: search.title || "",
        },
      });

    if (error) {
      ShowApiErrorToast(error);
    }

    return { data, isError, isFetching, isLoading, refetch };
  } catch (error) {
    console.log(error);
    ShowApiErrorToast(error);
  }
};

export const useGetSingleTopic = ({
  topicID,
  page,
  limit,
  search,
}: {
  topicID: string;
  page: number;
  limit: number;
  search: {
    title: string;
  };
}) => {
  try {
    const { data, isError, isFetching, isLoading, refetch, error } =
      useGetSingleTopicQuery({
        topicID: topicID,
        page: page || 1,
        limit: limit || 10,
        search: {
          title: search.title || "",
        },
      });
    if (error) {
      ShowApiErrorToast(error);
    }
    return { data, isError, isFetching, isLoading, refetch };
  } catch (error) {
    console.log(error);
    ShowApiErrorToast(error);
  }
};

export const useAddTopic = ({
  setIsOpen,
}: {
  setIsOpen: (isOpen: boolean) => void;
}) => {
  const [createTopic, { isError, isLoading }] = useCreateTopicMutation();

  const handleCreateTopic = async (data: CreateTopicRequest) => {
    try {
      const response = await createTopic(data);

      console.log(response.error);

      if (response.error) {
        ShowApiErrorToast(
          response.error && "data" in response.error
            ? response.error.data
            : response.error
        );
      }
      if (!response.error) {
        ShowSuccessToast(response.data.message);
        setIsOpen(false);
      }
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };
  return { handleCreateTopic, isLoading };
};

export const useUpdateTopic = ({
  setIsOpen,
}: {
  setIsOpen: (isOpen: boolean) => void;
}) => {
  const [updateTopic, { isError, isLoading }] = useUpdateTopicMutation();

  const handleUpdateTopic = async (data: UpdateTopicRequest) => {
    try {
      const response = await updateTopic(data);

      console.log(response.error);

      if (response.error) {
        ShowApiErrorToast(
          response.error && "data" in response.error
            ? response.error.data
            : response.error
        );
      }
      if (!response.error) {
        ShowSuccessToast(response.data.message);
        setIsOpen(false);
      }
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };
  return { handleUpdateTopic, isLoading };
};

export const useDeleteTopic = ({
  setIsOpen,
}: {
  setIsOpen: (isOpen: boolean) => void;
}) => {
  const [deleteTopic, { isError, isLoading }] = useDeleteTopicMutation();

  const handleUpdateTopic = async (data: DeleteTopicRequest) => {
    try {
      const response = await deleteTopic(data);

      console.log(response.error);

      if (response.error) {
        ShowApiErrorToast(
          response.error && "data" in response.error
            ? response.error.data
            : response.error
        );
      }
      if (!response.error) {
        ShowSuccessToast(response.data.message);
        setIsOpen(false);
      }
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };
  return { handleUpdateTopic, isLoading };
};
