/**
 * Edge cache purge helpers.
 *
 * Call after successful admin mutations that affect filter/browse data so that
 * the next request gets fresh SSR output instead of a stale `caches.default`
 * entry.
 *
 * Failures are swallowed with a warning-level Sentry capture — a cache miss on
 * the next request is acceptable; a 500 on a successful admin write is not.
 */

import { env } from '@/server/env';
import { captureCaught } from '@/lib/observability';

/**
 * Delete the canonical filter-data + browse cache keys for all locales.
 *
 * Safe to call fire-and-forget after an admin category/tag mutation:
 *
 *   ```ts
 *   await purgeFilterDataCache();
 *   ```
 *
 * `origin` defaults to `env.PUBLIC_SITE_URL`. Pass an explicit value only in
 * tests or when the origin is derived from the incoming request.
 */
export async function purgeFilterDataCache(origin?: string): Promise<void> {
  const base = origin ?? env.PUBLIC_SITE_URL;
  if (!base) return;

  try {
    const cacheGlobal = (globalThis as { caches?: { default?: Cache } }).caches;
    const cache = cacheGlobal?.default;
    if (!cache) return;
    await Promise.all([
      cache.delete(`${base}/api/deals/filter-data?locale=he`),
      cache.delete(`${base}/api/deals/filter-data?locale=en`),
      cache.delete(`${base}/search`),
      cache.delete(`${base}/api/deals/categories`),
      cache.delete(`${base}/api/deals/tags`),
    ]);
  } catch (err) {
    captureCaught(err, { scope: 'server.lib.edge-cache-purge', severity: 'warning' });
  }
}

/**
 * Delete all R2 HTML cache entries (html-cache/*).
 *
 * Call after deploy (stale-build prevention) or when content changes
 * affect pre-warmed pages. Returns count of deleted keys.
 */
export async function purgeHtmlCache(): Promise<{ deleted: number }> {
  const bucket = env.R2_BUCKET;
  if (!bucket) return { deleted: 0 };

  try {
    // R2 list is eventually consistent but sufficient for purge — worst case
    // a missed key serves one stale response before the next cron refresh.
    const listed = await bucket.list({ prefix: 'html-cache/' });
    if (listed.objects.length === 0) return { deleted: 0 };

    await Promise.all(listed.objects.map((obj) => bucket.delete(obj.key)));
    return { deleted: listed.objects.length };
  } catch (err) {
    captureCaught(err, { scope: 'server.lib.edge-cache-purge.html', severity: 'warning' });
    return { deleted: 0 };
  }
}
