import manifest from './images.manifest.json'

export type ImageName = keyof typeof manifest

/**
 * Emplacement d'image d'une section ou d'une fiche.
 * Tant que `image` vaut `null`, le site affiche un cadre « visuel à fournir »
 * qui rappelle le fichier attendu et le sujet de la prise de vue.
 */
export interface Visual {
  /** Nom de l'image dans le manifeste généré par `pnpm images`. */
  image: ImageName | null
  alt: string
  /** Fichier à déposer dans /public pour remplir cet emplacement. */
  expectedFile: string
  /** Sujet attendu, affiché dans le cadre provisoire. */
  brief: string
  /** Croquis affiché dans le cadre provisoire. */
  sketch: 'fan' | 'ring' | 'room'
  /** Point d'intérêt de la photo (object-position), ex. « 60% 30% ». */
  focus?: string
}

/** Dimensions natives et largeurs générées par `pnpm images`. */
export function imageInfo(name: ImageName) {
  return manifest[name]
}

/** srcset d'une photographie pour un format donné (AVIF ou WebP). */
export function imageSrcset(name: ImageName, format: 'avif' | 'webp'): string {
  return manifest[name].widths
    .map((width) => `/images/${name}-${width}.${format} ${width}w`)
    .join(', ')
}

/** Plus grande déclinaison WebP : sert de `src` de repli. */
export function imageSrc(name: ImageName): string {
  const widths = manifest[name].widths
  return `/images/${name}-${widths[widths.length - 1]}.webp`
}
