/**
 * anonCartStore — minimal zustand store for anonymous cart.
 *
 * Source of truth is localStorage (`md_cart_v2`). This store mirrors that
 * state in memory so that multiple mounted components (navbar badge, drawer,
 * page) stay in sync without each re-reading localStorage independently.
 *
 * A single module-level `storage` event listener hydrates the store when
 * another tab writes the same key.
 *
 * v2: cart lines are keyed by dealSkuId (not dealId). v1 payloads are dropped
 * on hydrate — no live users, so no migration path needed.
 */

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

// ─── Types ────────────────────────────────────────────────────────────────────

export interface AnonCartItem {
  dealSkuId: string;
  qty: number;
  addedAt: string; // ISO-8601
  /** Snapshot stored at add-time so drawer can show title without a server round-trip. */
  title?: string;
  /** Primary image URL stored at add-time. */
  imageUrl?: string;
}

export interface AnonCartPayload {
  v: 2;
  items: AnonCartItem[];
}

export interface AnonCartState {
  items: AnonCartItem[];
  /** Replace items in-memory (does NOT write to localStorage). */
  hydrate: (items: AnonCartItem[]) => void;
  /** Replace items in-memory (does NOT write to localStorage). Same as hydrate; exposed separately for clarity. */
  set: (items: AnonCartItem[]) => void;
}

// ─── Store ────────────────────────────────────────────────────────────────────

export const useAnonCart = create<AnonCartState>((setState) => ({
  items: [],

  hydrate: (items) => setState({ items }),

  set: (items) => setState({ items }),
}));

// ─── localStorage helpers ─────────────────────────────────────────────────────

export const LS_KEY = 'md_cart_v2';
/** Legacy key — cleared on first boot to avoid stale v1 data */
const LS_KEY_V1 = 'md_cart_v1';

/** Read and parse the localStorage cart. Returns empty if absent or unknown version. */
export function readLocalCart(): AnonCartItem[] {
  if (typeof window === 'undefined') return [];
  try {
    const raw = localStorage.getItem(LS_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw) as { v?: unknown; items?: unknown };
    if (parsed.v !== 2 || !Array.isArray(parsed.items)) {
      localStorage.removeItem(LS_KEY);
      return [];
    }
    return parsed.items as AnonCartItem[];
  } catch (err) {
    captureCaught(err, { scope: 'features.cart.anonCartStore', severity: 'warning' });
    return [];
  }
}

/** Write items array to localStorage and sync the in-memory store. */
export function writeLocalCart(items: AnonCartItem[]): void {
  if (typeof window === 'undefined') return;
  const payload: AnonCartPayload = { v: 2, items };
  localStorage.setItem(LS_KEY, JSON.stringify(payload));
  useAnonCart.getState().set(items);
}

/** Clear localStorage cart and sync the in-memory store. */
export function clearLocalCart(): void {
  if (typeof window === 'undefined') return;
  localStorage.removeItem(LS_KEY);
  useAnonCart.getState().set([]);
}

// ─── Cross-tab sync ───────────────────────────────────────────────────────────

/**
 * Bootstrap the store from localStorage and attach a `storage` event listener
 * for cross-tab updates.  Call once at app mount (idempotent — checks a flag).
 */
let _bootstrapped = false;

export function bootstrapAnonCart(): void {
  if (typeof window === 'undefined' || _bootstrapped) return;
  _bootstrapped = true;

  // Drop legacy v1 data
  localStorage.removeItem(LS_KEY_V1);

  // Initial hydration
  useAnonCart.getState().hydrate(readLocalCart());

  // Cross-tab sync
  window.addEventListener('storage', (event: StorageEvent) => {
    if (event.key !== LS_KEY) return;
    if (event.newValue === null) {
      useAnonCart.getState().set([]);
      return;
    }
    try {
      const parsed = JSON.parse(event.newValue) as { v?: unknown; items?: unknown };
      if (parsed.v !== 2 || !Array.isArray(parsed.items)) {
        useAnonCart.getState().set([]);
        return;
      }
      useAnonCart.getState().set(parsed.items as AnonCartItem[]);
    } catch (err) {
      captureCaught(err, { scope: 'features.cart.anonCartStore', severity: 'warning' });
      useAnonCart.getState().set([]);
    }
  });
}
