import { envs } from 'src/config';

type Consulta = <T = unknown>(sql: string, ...params: unknown[]) => Promise<T[]>;
type Item = { id?: string; imageUrl?: string | null };

/**
 * Completa la imagen de los ítems de pedidos que se guardaron sin foto (el producto
 * no tenía imagen al comprarse) con la imagen actual del producto o de su padre de
 * variantes. Así una foto cargada después también aparece en «Mis pedidos» y en el
 * seguimiento. Los ítems que ya tienen imagen no se tocan.
 */
export async function completarImagenesItems(consulta: Consulta, listas: unknown[]): Promise<void> {
  const items = listas.flatMap((l) => (Array.isArray(l) ? (l as Item[]) : []));
  const ids = [...new Set(items.filter((i) => i?.id && !i.imageUrl).map((i) => i.id))] as string[];
  if (!ids.length) return;
  const filas = await consulta<{ id: string; path: string | null }>(
    `SELECT p.id,
            (SELECT i.path FROM producto_imagenes i
              WHERE i.producto_id IN (p.id, p.producto_padre_id) AND i.active = true
              ORDER BY (i.producto_id = p.id) DESC, i.es_principal DESC, i.orden ASC NULLS LAST
              LIMIT 1) AS path
     FROM productos p
     WHERE p.id = ANY($1::uuid[])`,
    ids,
  ).catch(() => []);
  const base = (envs.doSpacesPublicUrl ?? '').replace(/\/+$/, '');
  const porId = new Map(filas.filter((f) => f.path).map((f) => [f.id, `${base}/${f.path}`]));
  for (const it of items) {
    if (it?.id && !it.imageUrl && porId.has(it.id)) it.imageUrl = porId.get(it.id);
  }
}
