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

export const STORAGE_KEY = 'multideal:recently-viewed:v1';
const MAX_ENTRIES = 20;

export type AnonRecentlyViewedItem = { dealId: string; viewedAt: number };

function isBrowser(): boolean {
  return typeof window !== 'undefined' && typeof localStorage !== 'undefined';
}

function read(): AnonRecentlyViewedItem[] {
  if (!isBrowser()) return [];
  try {
    const raw = localStorage.getItem(STORAGE_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw);
    if (!Array.isArray(parsed)) return [];
    return parsed.filter(
      (x): x is AnonRecentlyViewedItem =>
        x != null && typeof x.dealId === 'string' && typeof x.viewedAt === 'number',
    );
  } catch (err) {
    captureCaught(err, { scope: 'anonRecentlyViewedStore.read', severity: 'warning' });
    return [];
  }
}

function write(items: AnonRecentlyViewedItem[]): void {
  if (!isBrowser()) return;
  const trimmed = items.length > MAX_ENTRIES ? items.slice(items.length - MAX_ENTRIES) : items;
  try {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(trimmed));
  } catch (err) {
    if (err instanceof DOMException && err.name === 'QuotaExceededError') {
      try {
        localStorage.setItem(STORAGE_KEY, JSON.stringify(trimmed.slice(10)));
      } catch (retryErr) {
        captureCaught(retryErr, {
          scope: 'anonRecentlyViewedStore.write.retry',
          severity: 'warning',
        });
      }
    } else {
      captureCaught(err, { scope: 'anonRecentlyViewedStore.write', severity: 'warning' });
    }
  }
}

export function addToAnonRecentlyViewed(dealId: string): void {
  const items = read().filter((x) => x.dealId !== dealId);
  items.push({ dealId, viewedAt: Date.now() });
  // newest-first sort; trim oldest beyond MAX_ENTRIES
  items.sort((a, b) => b.viewedAt - a.viewedAt);
  write(items);
}

export function getAnonRecentlyViewed(): AnonRecentlyViewedItem[] {
  return read().sort((a, b) => b.viewedAt - a.viewedAt);
}

export function getAnonRecentlyViewedIds(): string[] {
  return getAnonRecentlyViewed().map((x) => x.dealId);
}

export function clearAnonRecentlyViewed(): void {
  if (!isBrowser()) return;
  try {
    localStorage.removeItem(STORAGE_KEY);
  } catch (err) {
    captureCaught(err, { scope: 'anonRecentlyViewedStore.clear', severity: 'warning' });
  }
}
