'use client';

import { useEffect } from 'react';
import {
  bootstrapAnonCart,
  clearLocalCart,
  readLocalCart,
  useAnonCart,
  writeLocalCart,
  type AnonCartItem,
} from './anonCartStore';
import type { AnonAddOptions, CartErrorCode, CartItem } from './useCart';

export function useGuestCart(onError: (code: CartErrorCode) => void): {
  items: CartItem[];
  add: (dealSkuId: string, qty: number, opts?: AnonAddOptions) => void;
  updateQty: (dealSkuId: string, qty: number) => void;
  remove: (dealSkuId: string) => void;
  clear: () => void;
} {
  useEffect(() => {
    bootstrapAnonCart();
  }, []);
  const anonItems = useAnonCart((state) => state.items);

  const add = (dealSkuId: string, qty: number, opts?: AnonAddOptions): void => {
    const current = readLocalCart();
    const existing = current.find((item) => item.dealSkuId === dealSkuId);
    const existingQty = existing?.qty ?? 0;
    const requested = existingQty + qty;
    let clamped = requested;
    if (opts?.stock !== undefined) {
      const cap =
        opts.maxPerUser !== null && opts.maxPerUser !== undefined
          ? Math.min(opts.maxPerUser, opts.stock)
          : opts.stock;
      clamped = Math.max(0, Math.min(requested, cap));
      if (clamped === existingQty) {
        onError(opts.stock <= 0 ? 'OUT_OF_STOCK' : 'MAX_REACHED');
        return;
      }
    }
    const snapshot = { title: opts?.title, imageUrl: opts?.imageUrl };
    const updated: AnonCartItem[] = existing
      ? current.map((item) =>
          item.dealSkuId === dealSkuId ? { ...item, qty: clamped, ...snapshot } : item,
        )
      : [...current, { dealSkuId, qty: clamped, addedAt: new Date().toISOString(), ...snapshot }];
    writeLocalCart(updated);
  };

  return {
    items: anonItems.map(
      (item): CartItem => ({
        dealSkuId: item.dealSkuId,
        qty: item.qty,
        addedAt: item.addedAt,
        title: item.title,
        imageId: item.imageUrl,
        qtyTiers: [],
      }),
    ),
    add,
    updateQty: (dealSkuId, qty) =>
      writeLocalCart(
        qty <= 0
          ? readLocalCart().filter((item) => item.dealSkuId !== dealSkuId)
          : readLocalCart().map((item) => (item.dealSkuId === dealSkuId ? { ...item, qty } : item)),
      ),
    remove: (dealSkuId) =>
      writeLocalCart(readLocalCart().filter((item) => item.dealSkuId !== dealSkuId)),
    clear: clearLocalCart,
  };
}
