import { VARIANT_MATRIX, type ImageVariant, type ImageFormat } from '@/lib/imageVariants';

export type { ImageVariant, ImageFormat };

/** Per-variant default `sizes` hints — browsers without `sizes` assume 100vw. */
export const DEFAULT_IMAGE_SIZES: Record<ImageVariant, string> = {
  card: '(min-width: 64rem) 25vw, (min-width: 40rem) 33vw, 50vw',
  hero: '100vw',
  thumb: '5rem',
  og: '75rem',
};

export interface PreloadImageEntry {
  src: string;
  variant?: ImageVariant;
  sizes?: string;
  fetchpriority?: 'high' | 'low' | 'auto';
}

/** Content-addressed R2 keys are lowercase hex sha256 digests. */
const CONTENT_SHA_RE = /^[a-f0-9]{64}$/;

function isContentAddressedSha(sha: string): boolean {
  return CONTENT_SHA_RE.test(sha);
}

/**
 * Extract the sha256 hash from an R2 key.
 * Input: "originals/<sha256>.<ext>" → "<sha256>"
 */
function extractSha(key: string): string {
  // Strip directory prefix and extension
  return key.replace(/^[^/]+\//, '').replace(/\.[^.]+$/, '');
}

/**
 * Build a variant URL from any image source.
 *
 * - Raw R2 key (originals/<sha>.<ext>) → /r2/variants/<sha>/<variant>-<width>.<format>
 * - Already an absolute URL (https://) → return as-is
 * - Already a /r2/ or other absolute path URL → return as-is
 */
export function buildVariantUrl(src: string, variant: ImageVariant, width: number): string {
  if (!src) return '';
  if (/^(https?:|data:|blob:)/.test(src)) return src;

  // /r2/originals/<sha>.<ext> — older stored URLs; route to the encoded variant
  if (src.startsWith('/r2/originals/')) {
    const filename = src.split('/').pop() ?? '';
    const sha = filename.replace(/\.[^.]+$/, '');
    if (sha && isContentAddressedSha(sha)) {
      const format = VARIANT_MATRIX[variant].format;
      return `/r2/variants/${sha}/${variant}-${width}.${format}`;
    }
    return '';
  }

  const storedVariant = src.match(/^\/r2\/variants\/([a-f0-9]{64})\/[^/]+$/);
  if (storedVariant) {
    const format = VARIANT_MATRIX[variant].format;
    return `/r2/variants/${storedVariant[1]}/${variant}-${width}.${format}`;
  }

  if (src.startsWith('/')) return src; // already a /r2/variants/ or other absolute path

  // Raw R2 key: originals/<sha256>.<ext> → extract sha256
  const sha = extractSha(src);
  if (!isContentAddressedSha(sha)) return '';
  const format = VARIANT_MATRIX[variant].format;
  return `/r2/variants/${sha}/${variant}-${width}.${format}`;
}

export function buildSrcSet(src: string, variant: ImageVariant): string {
  if (!src) return '';
  const entries = VARIANT_MATRIX[variant].widths
    .map((w) => {
      const url = buildVariantUrl(src, variant, w);
      return url ? `${url} ${w}w` : '';
    })
    .filter(Boolean);
  return entries.join(', ');
}
