import { useEffect, useState } from 'react';

function fileKey(file: File): string {
  return `${file.name}-${file.size}-${file.lastModified}`;
}

export function isPreviewableImage(file: File): boolean {
  if (file.type.startsWith('image/')) {
    return true;
  }
  const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
  return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'].includes(ext);
}

/** Stable object URLs for File previews with proper revoke on change/unmount */
export function useObjectUrls(files: File[]): Map<string, string> {
  const [urls, setUrls] = useState<Map<string, string>>(() => new Map());

  useEffect(() => {
    const next = new Map<string, string>();
    for (const file of files) {
      if (isPreviewableImage(file)) {
        next.set(fileKey(file), URL.createObjectURL(file));
      }
    }
    setUrls(next);

    return () => {
      next.forEach((url) => URL.revokeObjectURL(url));
    };
  }, [files]);

  return urls;
}

export function getObjectUrl(urls: Map<string, string>, file: File): string | undefined {
  return urls.get(fileKey(file));
}
