"use client";

import {
  ShowApiErrorToast,
  ShowErrorToast,
  ShowSuccessToast,
  ShowWarningToast,
} from "@/components/Toast/Toast";

import {
  useAddUserMutation,
  useDeleteUserMutation,
  useGetAllUsersQuery,
  useSingleUserQuery,
  useUpdateUserMutation,
} from "@/Redux/Users/UserSlice";
import { AddUserRequest, UpdateUserRequest } from "@/Redux/Users/UserTypes";

import { deleteCookie, getCookie, setCookie } from "cookies-next";
import { useRouter } from "next/navigation";

export const useGetAllUsers = ({
  page,
  limit,
  search,
}: {
  page: number;
  limit: number;
  search: {
    firstName: string;
    lastName: string;
    email: string;
    phoneNumber: string;
    status: string;
  };
}) => {
  try {
    const { data, isError, isFetching, isLoading, refetch, error } =
      useGetAllUsersQuery({
        page: page || 1,
        limit: limit || 10,
        search: {
          firstName: search.firstName || "",
          lastName: search.lastName || "",
          email: search.email || "",
          phoneNumber: search.phoneNumber || "",
          status: search.status || "",
        },
      });

    if (error) {
      ShowApiErrorToast(error);
    }

    return { data, isError, isFetching, isLoading, refetch };
  } catch (error) {
    console.log(error);
    ShowApiErrorToast(error);
  }
};

export const useAddUser = ({
  setIsOpen,
}: {
  setIsOpen: (isOpen: boolean) => void;
}) => {
  const [addUser, { isError, isLoading }] = useAddUserMutation();

  const handleAddUser = async (data: AddUserRequest) => {
    try {
      const response = await addUser(data);

      console.log(response.error);

      if (response.error) {
        ShowApiErrorToast(
          response.error && "data" in response.error
            ? response.error.data
            : response.error
        );
      }
      if (!response.error && response.data.status === true) {
        ShowSuccessToast(response.data.message);
        setIsOpen(false);
      }
      // ShowSuccessToast("User Added Successfully");
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };
  return { handleAddUser, isLoading };
};

export const useUpdateUser = ({
  setIsOpen,
}: {
  setIsOpen: (isOpen: boolean) => void;
}) => {
  const [updateUser, { isError, isLoading }] = useUpdateUserMutation();

  const handleUpdateUser = async (data: UpdateUserRequest) => {
    try {
      const response = await updateUser(data);

      if (response.error) {
        ShowApiErrorToast(
          response.error && "data" in response.error
            ? response.error.data
            : response.error
        );
      }
      if (!response.error && response.data.status === true) {
        ShowSuccessToast(response.data.message);
        setIsOpen(false);
      }
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };
  return { handleUpdateUser, isLoading };
};

export const useGetSingleUser = ({ userId }: { userId: string }) => {
  try {
    const { data, isLoading } = useSingleUserQuery({
      userId,
    });

    return { data, isLoading };
  } catch (error) {
    ShowApiErrorToast(error);
  }
};

export const useDeleteUser = () => {
  const [deleteUser, { isError, isLoading }] = useDeleteUserMutation();

  const handleDeleteUser = async (userId: string) => {
    try {
      const response = await deleteUser({ userId });

      if (response.error) {
        ShowApiErrorToast(response.error);
      }
      if (!response.error && response.data.status === true) {
        ShowSuccessToast(response.data.message);
      }
    } catch (error) {
      ShowApiErrorToast(error);
    }
  };

  return { handleDeleteUser, isLoading };
};
