import { WCProduct, WCCategory } from './woocommerce';

const PRODUCTS_CACHE_KEY = 'tnl_products_cache_v1';
const CATEGORIES_CACHE_KEY = 'tnl_categories_cache_v1';

export function getCachedProducts(): WCProduct[] {
  if (typeof window === 'undefined') return [];
  try {
    const raw = localStorage.getItem(PRODUCTS_CACHE_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw);
    return Array.isArray(parsed) ? parsed : [];
  } catch (err) {
    console.warn('Failed to load cached products from localStorage:', err);
    return [];
  }
}

export function getCachedCategories(): WCCategory[] {
  if (typeof window === 'undefined') return [];
  try {
    const raw = localStorage.getItem(CATEGORIES_CACHE_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw);
    return Array.isArray(parsed) ? parsed : [];
  } catch (err) {
    console.warn('Failed to load cached categories from localStorage:', err);
    return [];
  }
}

export function getProductSlug(p: WCProduct): string {
  if (!p) return '';
  if (p.permalink) {
    try {
      const cleanPermalink = p.permalink.replace(/\/$/, '');
      const lastSegment = cleanPermalink.split('/').pop();
      if (lastSegment && !/^\d+$/.test(lastSegment)) {
        return lastSegment.toLowerCase();
      }
    } catch {
      // ignore
    }
  }
  if (p.slug && !/^\d+$/.test(p.slug)) {
    return p.slug.toLowerCase();
  }
  if (p.slug) {
    return p.slug.toLowerCase();
  }
  return p.name ? p.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') : String(p.id);
}

export function getCachedProductById(idOrSlug: number | string): WCProduct | null {
  const products = getCachedProducts();
  if (!products || products.length === 0) return null;
  const target = String(idOrSlug).toLowerCase().trim();
  return (
    products.find((p) => {
      if (!p) return false;
      const pSlug = getProductSlug(p);
      const nameSlug = p.name ? p.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') : '';
      const rawSlug = p.slug ? p.slug.toLowerCase() : '';
      const permalinkSlug = p.permalink ? p.permalink.replace(/\/$/, '').split('/').pop()?.toLowerCase() : '';

      return (
        p.id.toString() === target ||
        pSlug === target ||
        rawSlug === target ||
        permalinkSlug === target ||
        nameSlug === target
      );
    }) || null
  );
}

export function saveProductsToCache(incoming: WCProduct[]): WCProduct[] {
  if (typeof window === 'undefined' || !incoming || incoming.length === 0) {
    return getCachedProducts();
  }

  try {
    const existing = getCachedProducts();
    const productMap = new Map<number, WCProduct>();

    // Load existing cached items
    existing.forEach((p) => {
      if (p && p.id) productMap.set(p.id, p);
    });

    // Overwrite/merge with incoming items (updates existing items, adds new items)
    incoming.forEach((p) => {
      if (p && p.id) {
        const prev = productMap.get(p.id) || {};
        productMap.set(p.id, {
          ...prev,
          ...p,
          // Ensure arrays like images and categories are fresh
          images: p.images && p.images.length > 0 ? p.images : (prev as WCProduct).images || [],
          categories: p.categories && p.categories.length > 0 ? p.categories : (prev as WCProduct).categories || [],
        });
      }
    });

    const updatedList = Array.from(productMap.values()).sort((a, b) => {
      const dateA = new Date(a.date_created || 0).getTime();
      const dateB = new Date(b.date_created || 0).getTime();
      if (dateA !== dateB && !isNaN(dateA) && !isNaN(dateB)) return dateB - dateA;
      return Number(b.id || 0) - Number(a.id || 0);
    });
    
    try {
      localStorage.setItem(PRODUCTS_CACHE_KEY, JSON.stringify(updatedList));
    } catch (quotaError) {
      // If LocalStorage quota is reached (~5MB), cap stored items to most recent 250 products
      const cappedList = updatedList.slice(-250);
      try {
        localStorage.setItem(PRODUCTS_CACHE_KEY, JSON.stringify(cappedList));
      } catch (e) {
        console.warn('LocalStorage quota limit reached:', e);
      }
    }

    return updatedList;
  } catch (err) {
    console.warn('Failed to save products to localStorage cache:', err);
    return incoming;
  }
}

export function saveCategoriesToCache(incoming: WCCategory[]): WCCategory[] {
  if (typeof window === 'undefined' || !incoming || incoming.length === 0) {
    return getCachedCategories();
  }

  try {
    const existing = getCachedCategories();
    const catMap = new Map<number, WCCategory>();

    existing.forEach((c) => {
      if (c && c.id) catMap.set(c.id, c);
    });

    incoming.forEach((c) => {
      if (c && c.id) {
        catMap.set(c.id, {
          ...catMap.get(c.id),
          ...c,
        });
      }
    });

    const updatedList = Array.from(catMap.values());
    localStorage.setItem(CATEGORIES_CACHE_KEY, JSON.stringify(updatedList));
    return updatedList;
  } catch (err) {
    console.warn('Failed to save categories to localStorage cache:', err);
    return incoming;
  }
}
