import { Episode } from "@/components/video-player/video-detail-type";
import useFetchData from "@/hook/api-request/use-fetch-data";
import useFetchDetails from "@/hook/api-request/use-fetch-details";
import usePostData from "@/hook/api-request/use-post-data";
import API from "@/instance/api";
import instance from "@/instance/instance";
import { useMutation } from "@tanstack/react-query";

export const useGetEpisodeList = (params: {
  series_id?: string;
  enabled?: boolean;
}) => {
  return useFetchData<Episode[]>({
    url: API.seriesEpisode.list,
    enabled: !!params.series_id && params.series_id !== "undefined",
    params,
  });
};

export const useGetVideoDetails = (id?: string) => {
  return useFetchDetails<Episode>({
    url: API.video.details + "/",
    id,
    enabled: !!id,
  });
};
export const useEpisodeLike = () => {
  return useMutation({
    mutationFn: async ({ id, type }: { id: string; type: string }) => {
      try {
        const response = await instance.post(
          type == "episode"
            ? `${API.seriesEpisode.like}/${id}/like`
            : `${API.video.like}/${id}/like`,
          {},
        );

        if (response.data?.error) {
          throw new Error(
            response.data?.message || "Failed to liking the episode.",
          );
        }

        return response.data?.data;
      } catch (error) {
        throw error instanceof Error
          ? error
          : new Error("Something went wrong while liking the episode.");
      }
    },
  });
};

export const useRemoveSeriesLike = () => {
  return useMutation({
    mutationFn: async ({ id, type }: { id: string; type: string }) => {
      try {
        const response = await instance.delete(
          type == "episode"
            ? `${API.seriesEpisode.like}/${id}/like`
            : `${API.video.like}/${id}/like`,
        );
        console.log(response, "response");
        if (response?.data?.error) {
          throw new Error(
            response.data?.message || "Failed to update resource.",
          );
        }

        return response.data?.data;
      } catch (error) {
        throw error instanceof Error
          ? error
          : new Error("Something went wrong while liking the episode.");
      }
    },
  });
};

export const useSavedEpisode = () => {
  return useMutation({
    mutationFn: async ({ id, type }: { id: string; type: string }) => {
      try {
        const response = await instance.post(
          type == "episode"
            ? `${API.seriesEpisode.save}/${id}/save`
            : `${API.video.save}/${id}/save`,
          {},
        );

        if (response.data?.error) {
          throw new Error(
            response.data?.message || "Failed to save the episode.",
          );
        }

        return response.data?.data;
      } catch (error) {
        throw error instanceof Error
          ? error
          : new Error("Something went wrong while liking the episode.");
      }
    },
  });
};

export const useRemoveSavedEpisode = () => {
  return useMutation({
    mutationFn: async ({ id, type }: { id: string; type: string }) => {
      try {
        const response = await instance.delete(
          type == "episode"
            ? `${API.seriesEpisode.save}/${id}/save`
            : `${API.video.save}/${id}/save`,
        );

        if (response.data?.error) {
          throw new Error(
            response.data?.message || "Failed to remove episode.",
          );
        }

        return response.data?.data;
      } catch (error) {
        throw error instanceof Error
          ? error
          : new Error("Something went wrong while liking the episode.");
      }
    },
  });
};

export const useSavedWatchedHistory = () => {
  return usePostData({
    url: API.seriesEpisode.watchHistory,
    showToast: false,
  });
};

export const useViewCountEpisodes = (id: string | undefined) => {
  return usePostData({
    url: `${API.viewCount.episode}/${id}/view`,
    showToast: false,
  });
};

export const useViewCountVideos = (id: string | undefined) => {
  return usePostData({
    url: `${API.viewCount.videos}/${id}/view`,
    showToast: false,
  });
};
