import AsyncStorage from "@react-native-async-storage/async-storage";
import { createContext, useCallback, useContext, useEffect, useRef, useState, type ReactNode } from "react";
import { SEED_ORDERS, type CartItem, type Order } from "@sheikbras/domain";

export interface Store {
  favs: number[]; cart: CartItem[]; orders: Order[]; coupon: string; toast: string;
  toggleFav: (id: number, on?: boolean) => void; addCart: (id: number, q?: number) => void; setQty: (id: number, q: number) => void;
  removeItem: (id: number) => void; clearCart: () => void; setCoupon: (c: string) => void; addOrder: (o: Order) => void; notify: (m: string) => void;
}
const Ctx = createContext<Store | null>(null);
const DEFAULT_CART: CartItem[] = [{ id: 1, q: 1 }, { id: 7, q: 1 }];
async function load<T>(k: string, d: T): Promise<T> { try { const v = await AsyncStorage.getItem(k); return v ? (JSON.parse(v) as T) : d; } catch { return d; } }
const save = (k: string, v: unknown) => { AsyncStorage.setItem(k, JSON.stringify(v)).catch(() => {}); };

export function StoreProvider({ children }: { children: ReactNode }) {
  const [favs, setFavs] = useState<number[]>([]); const [cart, setCart] = useState<CartItem[]>(DEFAULT_CART); const [orders, setOrders] = useState<Order[]>(SEED_ORDERS);
  const [coupon, setCoupon] = useState(""); const [toast, setToast] = useState(""); const [ready, setReady] = useState(false); const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
  useEffect(() => { (async () => { setFavs(await load("sb_favs", [])); setCart(await load("sb_cart", DEFAULT_CART)); setOrders(await load("sb_orders", SEED_ORDERS)); setReady(true); })(); }, []);
  useEffect(() => { if (ready) save("sb_favs", favs); }, [favs, ready]);
  useEffect(() => { if (ready) save("sb_cart", cart); }, [cart, ready]);
  useEffect(() => { if (ready) save("sb_orders", orders); }, [orders, ready]);
  const notify = useCallback((m: string) => { setToast(m); if (timer.current) clearTimeout(timer.current); timer.current = setTimeout(() => setToast(""), 1800); }, []);
  const value: Store = {
    favs, cart, orders, coupon, toast, notify, setCoupon,
    toggleFav: (id, on) => setFavs((f) => { const has = f.includes(id); const want = on ?? !has; return want ? (has ? f : [...f, id]) : f.filter((x) => x !== id); }),
    addCart: (id, q = 1) => setCart((c) => (c.some((i) => i.id === id) ? c.map((i) => (i.id === id ? { ...i, q: Math.min(10, i.q + q) } : i)) : [...c, { id, q }])),
    setQty: (id, q) => setCart((c) => c.map((i) => (i.id === id ? { ...i, q: Math.max(1, Math.min(10, q)) } : i))),
    removeItem: (id) => setCart((c) => c.filter((i) => i.id !== id)),
    clearCart: () => { setCart([]); setCoupon(""); }, addOrder: (o) => setOrders((os) => [o, ...os]),
  };
  return <Ctx.Provider value={value}>{children}</Ctx.Provider>;
}
export function useStore(): Store { const s = useContext(Ctx); if (!s) throw new Error("useStore fora do StoreProvider"); return s; }
