import { WCProduct } from './woocommerce';

const RECENTLY_VIEWED_KEY = 'tnl_recently_viewed_v1';
const MAX_RECENT_ITEMS = 12;
let inMemoryRecentlyViewed: WCProduct[] = [];

function loadRecentlyViewedFromStorage(): WCProduct[] {
  if (typeof window === 'undefined') return [];
  try {
    const raw = localStorage.getItem(RECENTLY_VIEWED_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw);
    if (Array.isArray(parsed)) {
      inMemoryRecentlyViewed = parsed;
      return parsed;
    }
  } catch (err) {
    console.warn('Error reading recently viewed from localStorage:', err);
  }
  return [];
}

function saveRecentlyViewedToStorage(items: WCProduct[]): void {
  inMemoryRecentlyViewed = items;
  if (typeof window === 'undefined') return;
  try {
    localStorage.setItem(RECENTLY_VIEWED_KEY, JSON.stringify(items));
    window.dispatchEvent(new Event('tnl_recently_viewed_updated'));
  } catch (err) {
    console.warn('Error saving recently viewed to localStorage:', err);
  }
}

export function getRecentlyViewed(): WCProduct[] {
  if (inMemoryRecentlyViewed.length > 0) return inMemoryRecentlyViewed;
  return loadRecentlyViewedFromStorage();
}

export function addRecentlyViewed(product: WCProduct): void {
  if (!product || !product.id) return;
  const current = getRecentlyViewed();
  
  // Remove if already present, then prepend
  const filtered = current.filter((p) => p.id !== product.id);
  const updated = [product, ...filtered].slice(0, MAX_RECENT_ITEMS);

  saveRecentlyViewedToStorage(updated);
}

export function clearRecentlyViewed(): void {
  saveRecentlyViewedToStorage([]);
}

export function subscribeToRecentlyViewed(callback: (items: WCProduct[]) => void): () => void {
  callback(getRecentlyViewed());

  const handleUpdate = () => {
    callback(getRecentlyViewed());
  };

  if (typeof window !== 'undefined') {
    window.addEventListener('tnl_recently_viewed_updated', handleUpdate);
    window.addEventListener('storage', handleUpdate);
  }

  return () => {
    if (typeof window !== 'undefined') {
      window.removeEventListener('tnl_recently_viewed_updated', handleUpdate);
      window.removeEventListener('storage', handleUpdate);
    }
  };
}
