export const FILES_CDN = 'https://files.vystrikejto.cz';
export const FALLBACK_IMAGE = '/images/logo.png';

export function resolveImageUrl(url?: string | null): string {
  if (!url) return FALLBACK_IMAGE;
  const trimmed = url.trim();
  if (!trimmed || trimmed.includes('placeholder.webp')) return FALLBACK_IMAGE;
  if (trimmed.startsWith('//')) return `https:${trimmed}`;
  if (trimmed.startsWith('http://')) return `https://${trimmed.slice('http://'.length)}`;
  if (trimmed.startsWith('https://') || trimmed.startsWith('/images/')) return trimmed;
  if (trimmed.startsWith('/')) return `${FILES_CDN}${trimmed}`;
  return `${FILES_CDN}/${trimmed}`;
}

export interface ProductImageRow {
  url?: string | null;
  is_primary?: number | boolean | null;
  position?: number | null;
  alt?: string | null;
}

export interface ResolvedProductImage {
  url: string;
  isPrimary: boolean;
  alt: string | null;
}

function isBlankAlt(alt: string | null): boolean {
  return alt == null || String(alt).trim() === '';
}

export function pickProductImages(rows: ProductImageRow[]): {
  primaryImage: string;
  compositionImage: string;
  allImages: ResolvedProductImage[];
} {
  const images = (rows || [])
    .filter((row) => row.url && String(row.url).trim())
    .map((row) => ({
      url: resolveImageUrl(row.url),
      isPrimary: Number(row.is_primary) === 1,
      position: row.position == null ? null : Number(row.position),
      alt: row.alt ?? null,
    }));

  // Composition image (notes graphic) is allowed even with alt.
  // Gallery/main photos with alt are print-label assets and stay hidden.
  const composition = images.find((img) => !img.isPrimary && img.position === 1);
  const publicImages = images.filter((img) => isBlankAlt(img.alt));

  const primary =
    publicImages.find((img) => img.isPrimary) ||
    publicImages.find((img) => img.url !== composition?.url) ||
    publicImages[0];

  const seen = new Set<string>();
  const allImages: ResolvedProductImage[] = [];
  const gallerySource = [
    ...publicImages.filter((img) => img.isPrimary),
    ...publicImages.filter((img) => !img.isPrimary && img.url !== composition?.url),
  ];

  for (const img of gallerySource) {
    if (seen.has(img.url)) continue;
    seen.add(img.url);
    allImages.push({
      url: img.url,
      isPrimary: img.isPrimary,
      alt: img.alt,
    });
  }

  return {
    primaryImage: primary?.url || FALLBACK_IMAGE,
    compositionImage: composition?.url || FALLBACK_IMAGE,
    allImages,
  };
}
