import { useQuery } from '@tanstack/react-query';
import { useCallback, useMemo, useRef } from 'react';

import { useStores } from '@/app/(root)/AppProviders';

export default function useLyrics(id?: string) {
  const { genForm } = useStores();
  const cancelledIdRef = useRef<string | undefined>(id);
  const cancel = useCallback(() => (cancelledIdRef.current = id), [id]);

  const result = useQuery({
    enabled: !!id,
    queryKey: ['lyrics', id],
    queryFn: async () => {
      if (!id) return;
      if (cancelledIdRef.current === id) return;

      const response = await genForm.apiClient.GET(
        `/api/generate/lyrics/{lyrics_id}`,
        {
          params: {
            path: {
              lyrics_id: id,
            },
          },
        }
      );

      if (response.error) {
        throw new Error((response as any).error);
      }

      if (response.data.status === 'error') {
        throw new Error(response.data.error_message);
      }

      return response.data;
    },

    refetchInterval: (data) => {
      if (
        !id ||
        cancelledIdRef.current === id ||
        !!data.state.error ||
        (data.state.data as any)?.status === 'complete' ||
        (data.state.data as any)?.status === 'error'
      ) {
        return false;
      }
      return 2500;
    },
  });

  return useMemo(() => {
    return {
      data: result.data && id ? { ...result.data, id } : undefined,
      error: result.error,
      cancel,
    };
  }, [result.data, result.error, id, cancel]);
}
