import { listProducts, type Product, type VariantPrice } from '@platform-modules/commerce-catalog';
import type { Querier } from '@platform-modules/db';
import type { CatalogSchema } from '@platform-modules/commerce-catalog';
import { formatMinor } from './money.js';

export type ProductPriceDisplay = {
  amount: bigint;
  currency: string;
  label: string;
};

export function lowestVariantPrice(product: Product): VariantPrice | null {
  let best: VariantPrice | null = null;
  for (const variant of product.variants) {
    for (const price of variant.prices) {
      if (!best || price.amount < best.amount) {
        best = price;
      }
    }
  }
  return best;
}

export function productPriceLabel(product: Product): string | null {
  const price = lowestVariantPrice(product);
  if (!price) return null;
  return formatMinor(price.amount, price.currency);
}

export async function listActiveProducts(
  db: Querier<CatalogSchema>,
  maxItems: number,
): Promise<Product[]> {
  const items: Product[] = [];
  let page = 1;

  while (items.length < maxItems) {
    const result = await listProducts(db, { audience: 'public', status: 'active', page });
    if (result.items.length === 0) break;
    items.push(...result.items);
    if (page * result.pageSize >= result.total) break;
    page += 1;
  }

  return items.slice(0, maxItems);
}

export function filterProductsByTitle(products: Product[], query: string): Product[] {
  const q = query.trim().toLowerCase();
  if (!q) return products;
  return products.filter((p) => p.title.toLowerCase().includes(q));
}
