import type { UploadPurpose } from '@/lib/enums/upload-purpose';

export type ImageFormat = 'avif' | 'webp';
export type ImageVariant = 'thumb' | 'card' | 'hero' | 'og';

interface VariantSpec {
  widths: readonly number[];
  format: ImageFormat;
  height?: number;
}

export const VARIANT_MATRIX: Record<ImageVariant, VariantSpec> = {
  thumb: { widths: [240], format: 'avif' },
  card: { widths: [400, 800], format: 'avif' },
  hero: { widths: [800, 1600, 1920], format: 'avif' },
  og: { widths: [1200], format: 'webp', height: 630 },
};

export interface VariantFile {
  variant: ImageVariant;
  width: number;
  format: ImageFormat;
  height?: number;
}

// Deliberate subset of UploadPurpose — only purposes with defined variant configs.
// 'user_gallery' is excluded because it uses a different variant pipeline.
export type ImagePurpose = Exclude<UploadPurpose, 'user_gallery'>;

export interface PurposeConfig {
  variants: VariantFile[];
  acceptedMIME: string[];
  maxOriginalBytes: number;
}

export const PURPOSES: Record<ImagePurpose, PurposeConfig> = {
  vendor_hero: {
    variants: [
      { variant: 'hero', width: 800, format: 'avif' },
      { variant: 'hero', width: 1600, format: 'avif' },
      { variant: 'hero', width: 1920, format: 'avif' },
      { variant: 'og', width: 1200, format: 'webp', height: 630 },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 10 * 1024 * 1024,
  },
  vendor_logo: {
    variants: [
      { variant: 'thumb', width: 240, format: 'avif' },
      { variant: 'thumb', width: 240, format: 'webp' },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 5 * 1024 * 1024,
  },
  deal_image: {
    variants: [
      { variant: 'card', width: 400, format: 'avif' },
      { variant: 'card', width: 800, format: 'avif' },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 10 * 1024 * 1024,
  },
  avatar: {
    variants: [
      { variant: 'thumb', width: 240, format: 'avif' },
      { variant: 'thumb', width: 240, format: 'webp' },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 5 * 1024 * 1024,
  },
  vendor_gallery: {
    variants: [
      { variant: 'card', width: 400, format: 'avif' },
      { variant: 'card', width: 800, format: 'avif' },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 10 * 1024 * 1024,
  },
  homepage_banner: {
    variants: [
      { variant: 'hero', width: 800, format: 'avif' },
      { variant: 'hero', width: 1600, format: 'avif' },
      { variant: 'hero', width: 1920, format: 'avif' },
    ],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp'],
    maxOriginalBytes: 15 * 1024 * 1024,
  },
  support_attachment: {
    variants: [{ variant: 'card', width: 800, format: 'avif' }],
    acceptedMIME: ['image/jpeg', 'image/png', 'image/webp', 'image/gif'],
    maxOriginalBytes: 10 * 1024 * 1024,
  },
};

export function listVariantFiles(): VariantFile[] {
  const out: VariantFile[] = [];
  for (const [v, spec] of Object.entries(VARIANT_MATRIX) as [ImageVariant, VariantSpec][]) {
    for (const width of spec.widths) {
      out.push({
        variant: v,
        width,
        format: spec.format,
        ...(spec.height ? { height: spec.height } : {}),
      });
    }
  }
  return out;
}

export function variantR2Key(sha256: string, f: VariantFile): string {
  return `variants/${sha256}/${f.variant}-${f.width}.${f.format}`;
}

export function variantFieldName(f: { variant: string; width: number; format: string }): string {
  return `${f.variant}-${f.width}.${f.format}`;
}
