/*
  Foto no tamanho da lista, não no tamanho do arquivo.

  O kanban e as listas mostravam a foto original do produto (1 a 4 MB) num
  card de 180 px. A URL pública do Storage vira a URL do serviço de imagem
  do Supabase, que encolhe, converte para WebP e guarda na CDN. Mesma regra
  da vitrine (apps/public/src/lib/foto.ts): só URLs do próprio Storage mudam;
  originais acima de 25 MB o serviço recusa, e aí a lista fica sem foto até a
  fase das miniaturas geradas no upload.
*/

const MARCA_PUBLICA = "/storage/v1/object/public/";
const MARCA_RENDER = "/storage/v1/render/image/public/";

export function miniatura<T extends string | null | undefined>(url: T, largura: number, qualidade = 75): T {
  const texto = String(url ?? "").trim();
  if (!texto) return url;
  if (!/^https:\/\/[a-z0-9-]+\.supabase\.(co|in)\//i.test(texto)) return url;
  if (texto.includes(MARCA_RENDER)) return url;
  const inicio = texto.indexOf(MARCA_PUBLICA);
  if (inicio < 0) return url;
  const [semBusca] = texto.split("?");
  const caminho = semBusca.slice(inicio + MARCA_PUBLICA.length);
  if (!caminho || /\.(svg|gif)$/i.test(caminho)) return url;
  const base = semBusca.slice(0, inicio);
  const w = Math.max(16, Math.min(2500, Math.round(largura)));
  const q = Math.max(20, Math.min(100, Math.round(qualidade)));
  return `${base}${MARCA_RENDER}${caminho}?width=${w}&quality=${q}&resize=contain` as T;
}
