type StoryRecord = {
  background_image_url?: string | null;
  library_image?: string | null;
  thumbnail_url?: string | null;
  listing_image?: string | null;
  entry_image?: string | null;
};

const prefetchedFilters = new Set<'new' | 'read' | 'mastered'>();

const isGradient = (v: string) =>
  v.startsWith('linear-gradient') || v.startsWith('radial-gradient');

const preloadImage = (src: string | null | undefined) => {
  if (!src) return;
  const trimmed = src.trim();
  if (!trimmed || isGradient(trimmed)) return;
  const img = new Image();
  img.src = trimmed;
  if ('decode' in img) (img as HTMLImageElement).decode().catch(() => {});
};

const preloadStoryImages = (stories: StoryRecord[]) => {
  stories.forEach((story) => {
    preloadImage(story.background_image_url);
    preloadImage(story.library_image);
    preloadImage(story.thumbnail_url);
    preloadImage(story.listing_image);
    preloadImage(story.entry_image);
  });
};

export const prefetchFilterStories = async (
  filter: 'new' | 'read' | 'mastered',
  version?: string | null
) => {
  if (prefetchedFilters.has(filter)) return;
  prefetchedFilters.add(filter);

  try {
    const headers: Record<string, string> = {
      Accept: 'application/json',
      'X-Requested-With': 'XMLHttpRequest',
      'X-Inertia': 'true',
      'X-Inertia-Partial-Component': 'Student/Index',
      'X-Inertia-Partial-Data': 'stories',
      'X-Prefetch': '1',
    };
    if (version) headers['X-Inertia-Version'] = version;

    const response = await fetch(`/student?filter=${filter}`, {
      credentials: 'same-origin',
      headers,
    });

    if (!response.ok) {
      prefetchedFilters.delete(filter);
      return;
    }

    const payload = await response.json();
    const stories: StoryRecord[] = payload?.props?.stories ?? [];
    preloadStoryImages(stories);
  } catch {
    prefetchedFilters.delete(filter);
  }
};
