/* eslint-disable @typescript-eslint/no-explicit-any */
import { getApiClient } from "@/utils/api-client";
import { useMemo, useState } from "react";
import useSWR, { SWRConfiguration } from "swr";
import { useLocale } from "next-intl";
import { useEffect, useRef } from "react";
import { AxiosInstance } from "axios";

const WEBSITE_SWR_DEFAULTS: SWRConfiguration = {
  revalidateOnFocus: false,
  revalidateOnReconnect: false,
  dedupingInterval: 5 * 60 * 1000,
  keepPreviousData: true,
};

export function useApiClient() {
  const locale = useLocale();
  const apiRef = useRef(getApiClient(locale));

  useEffect(() => {
    // Just update the headers when locale changes
    apiRef.current.defaults.headers["Accept-Language"] = locale;
  }, [locale]);

  return apiRef.current;
}

const fetcher = async (
  url: string,
  params?: Record<string, any>,
  api?: AxiosInstance
) => {
  try {
    const response = await api?.get(url, { params });
    return response;
  } catch (error) {
    console.log("🚀 ~ fetcher ~ error:", error);
  }
};

export function useQueryWebsite(
  url: string | null,
  params?,
  options: SWRConfiguration = {},
  skip?: boolean
) {
  const api = useApiClient();
  const locale = useLocale();
  const {
    data,
    error,
    isLoading,
    isValidating,
    mutate: refetch,
  } = useSWR(
    // locale is part of the key so switching language fetches fresh data
    // instead of serving the previous language from cache
    url && !skip ? [url, params, locale] : null,
    ([url, params]) => fetcher(url, params, api),
    {
      ...WEBSITE_SWR_DEFAULTS,
      ...options,
    }
  );

  return {
    data: data?.data,
    error,
    isLoading,
    isValidating,
    refetch,
  };
}

export function useQueryWebsitePagination(
  url: string | null,
  params?,
  options: SWRConfiguration = {},
  skip?: boolean
) {
  const [page, setPage] = useState(1);
  const [pageSize, setPageSize] = useState(params?.per_page || 10);

  const queryParams = useMemo(
    () => ({
      page,
      per_page: pageSize,
      ...params,
    }),
    [page, pageSize, params]
  );

  const swr = useQueryWebsite(url, queryParams, options, skip);

  const paginationProps = useMemo(
    () => ({
      currentPage: swr.data?.data?.paginator?.current_page ?? page,
      pageSize: swr.data?.data?.paginator?.per_page ?? pageSize,
      total: swr.data?.data?.paginator?.total_count ?? 0,
      onChange: (newPage: number, newPageSize?: number) => {
        setPage(newPage);
        if (newPageSize && newPageSize !== pageSize) {
          setPageSize(newPageSize);
        }
      },
    }),
    [swr.data?.data?.paginator, page, pageSize]
  );

  return {
    ...swr,
    pagination: paginationProps,
    data: swr.data?.data?.list ?? swr.data?.data ?? [],
    paginator: swr.data?.data?.paginator,
  };
}
