import { useQuery } from '@tanstack/react-query';

import { useApiClient } from '@/lib/apiClient';

export const HOOK_STATUS = {
  submitted: 'submitted',
  rendering: 'rendering',
  rendered_in_moderation: 'rendered_in_moderation',
  rendered_failed_moderation: 'rendered_failed_moderation',
  rendered_passed_moderation: 'rendered_passed_moderation',
  error: 'error',
};

export const HOOK_TERMINAL_STATES = [
  HOOK_STATUS.rendered_failed_moderation,
  HOOK_STATUS.rendered_passed_moderation,
  HOOK_STATUS.error,
];

export const useHookById = ({
  hookId,
  shouldPoll = false,
}: {
  hookId?: string;
  shouldPoll?: boolean;
}) => {
  const apiClient = useApiClient();

  return useQuery({
    queryKey: ['hookStatus', hookId],
    queryFn: async () => {
      if (!hookId) {
        return null;
      }

      const { data } = await apiClient.GET('/api/video/hooks/{hook_id}', {
        params: { path: { hook_id: hookId } },
      });

      if (data?.status === HOOK_STATUS.error) {
        throw new Error('Hook failed to render');
      }

      return data;
    },
    enabled: !!hookId,
    refetchInterval: (queryData) => {
      if (!shouldPoll) {
        return false;
      }

      if (!queryData.state.data || !hookId) return false;

      if (
        queryData.state.data?.status &&
        HOOK_TERMINAL_STATES.includes(queryData.state.data.status)
      ) {
        return false;
      }

      return 2000; // Continue polling every 2 seconds
    },
    refetchOnWindowFocus: false,
  });
};
