import { createContext, useContext, useEffect, useState, type ReactNode } from "react";

export type CartItem = { slug: string; qty: number };
type Ctx = {
  items: CartItem[];
  add: (slug: string, qty?: number) => void;
  setQty: (slug: string, qty: number) => void;
  clear: () => void;
  count: number;
};

const CartContext = createContext<Ctx | null>(null);
const KEY = "rog-cart";

export function CartProvider({ children }: { children: ReactNode }) {
  const [items, setItems] = useState<CartItem[]>([]);
  useEffect(() => {
    try { setItems(JSON.parse(localStorage.getItem(KEY) || "[]")); } catch { /* ignore */ }
  }, []);
  const save = (next: CartItem[]) => { setItems(next); localStorage.setItem(KEY, JSON.stringify(next)); };
  const add = (slug: string, qty = 1) => {
    const found = items.find((i) => i.slug === slug);
    save(found ? items.map((i) => (i.slug === slug ? { ...i, qty: i.qty + qty } : i)) : [...items, { slug, qty }]);
  };
  const setQty = (slug: string, qty: number) =>
    save(qty <= 0 ? items.filter((i) => i.slug !== slug) : items.map((i) => (i.slug === slug ? { ...i, qty } : i)));
  const clear = () => save([]);
  const count = items.reduce((s, i) => s + i.qty, 0);
  return <CartContext.Provider value={{ items, add, setQty, clear, count }}>{children}</CartContext.Provider>;
}

export function useCart() {
  const c = useContext(CartContext);
  if (!c) throw new Error("useCart outside CartProvider");
  return c;
}
