import { create } from "zustand";

type NewsType = "news" | "gallery" | "video" | "info" | "special" | "lfii";

type NewsTypeOptionTypes = {
  newsType?: NewsType;
  isRefetch: boolean;
};

type ArticleOptionTypes = {
  isRefetch: boolean;
};

type LiveStreamOptionTypes = {
  isRefetch: boolean;
};

type RevalidateStoreType = {
  newsTypeOption: NewsTypeOptionTypes;
  setNewsTypeOption: (newsTypeOption: NewsTypeOptionTypes) => void;
  setNewsType: (newsType: NewsType) => void;
  setRefetchStatus: (isRefetch: boolean) => void;
  triggerRefetch: () => void;
  resetStore: () => void;
};

type ArticleStoreType = {
  articleOption: ArticleOptionTypes;
  setArticleOption: (articleOption: ArticleOptionTypes) => void;
  resetArticleStore: () => void;
};

type LiveStreamStoreType = {
  liveStreamOption: LiveStreamOptionTypes;
  setLiveStreamOption: (liveStreamOption: LiveStreamOptionTypes) => void;
  resetLiveStreamStore: () => void;
};

const defaultState: NewsTypeOptionTypes = {
  isRefetch: false,
};

const defaultArticleState: ArticleOptionTypes = {
  isRefetch: false,
};

const defaultLiveStreamState: LiveStreamOptionTypes = {
  isRefetch: false,
};

export const useRevalidateNewsStore = create<RevalidateStoreType>()(
  (set, get) => ({
    newsTypeOption: defaultState,
    setNewsTypeOption: (newsTypeOption) =>
      set({
        newsTypeOption: {
          newsType: newsTypeOption.newsType ?? get().newsTypeOption.newsType,
          isRefetch: newsTypeOption.isRefetch,
        },
      }),
    setNewsType: (newsType) =>
      set((state) => ({
        newsTypeOption: {
          ...state.newsTypeOption,
          newsType,
        },
      })),
    setRefetchStatus: (isRefetch) =>
      set((state) => ({
        newsTypeOption: {
          ...state.newsTypeOption,
          isRefetch,
        },
      })),
    triggerRefetch: () =>
      set((state) => ({
        newsTypeOption: {
          ...state.newsTypeOption,
          isRefetch: true,
        },
      })),
    resetStore: () =>
      set({
        newsTypeOption: defaultState,
      }),
  })
);

export const useRevalidateArticleStore = create<ArticleStoreType>()((set) => ({
  articleOption: defaultArticleState,
  setArticleOption: (articleOption) =>
    set({
      articleOption: {
        isRefetch: articleOption.isRefetch,
      },
    }),
  resetArticleStore: () =>
    set({
      articleOption: defaultArticleState,
    }),
}));

export const useRevalidateLiveStreamStore = create<LiveStreamStoreType>()(
  (set) => ({
    liveStreamOption: defaultLiveStreamState,
    setLiveStreamOption: (liveStreamOption) =>
      set({
        liveStreamOption: {
          isRefetch: liveStreamOption.isRefetch,
        },
      }),
    resetLiveStreamStore: () =>
      set({
        liveStreamOption: defaultLiveStreamState,
      }),
  })
);
