const { createContext, useContext, useState, useEffect, useCallback, useMemo } = React;

const LS_KEYS = { cart: 'fair:cart', city: 'fair:city' };

const loadJSON = (key, fallback) => {
  try { const r = localStorage.getItem(key); return r ? JSON.parse(r) : fallback; } catch { return fallback; }
};
const saveJSON = (key, value) => { try { localStorage.setItem(key, JSON.stringify(value)); } catch {} };

const StoreCtx = createContext(null);

const StoreProvider = ({ children }) => {
  // --- Cart ---
  const [cart, setCart] = useState(() => loadJSON(LS_KEYS.cart, []));
  useEffect(() => { saveJSON(LS_KEYS.cart, cart); }, [cart]);

  // --- City filter ---
  const [city, setCityRaw] = useState(() => loadJSON(LS_KEYS.city, null));
  const setCity = (id) => { setCityRaw(id); saveJSON(LS_KEYS.city, id); };

  // --- Orders (loaded from API) ---
  const [orders, setOrders] = useState([]);
  useEffect(() => {
    fetch('/api/orders')
      .then(r => r.json())
      .then(data => setOrders(Array.isArray(data) ? data : []))
      .catch(() => setOrders(window.DATA.DEMO_ORDERS));
  }, []);

  // --- Toast ---
  const [toast, setToast] = useState(null);
  const showToast = useCallback((msg) => {
    setToast({ id: Math.random(), msg });
    setTimeout(() => setToast(null), 2200);
  }, []);

  // --- Cart actions ---
  const addToCart = useCallback((productId, qty = 1) => {
    setCart((prev) => {
      const idx = prev.findIndex((i) => i.productId === productId);
      if (idx >= 0) {
        const next = [...prev];
        next[idx] = { ...next[idx], qty: next[idx].qty + qty };
        return next;
      }
      return [...prev, { productId, qty }];
    });
    const product = window.DATA.productById(productId);
    if (product) showToast(`«${product.title}» добавлен в корзину`);
  }, [showToast]);

  const updateQty = useCallback((productId, qty) => {
    setCart((prev) => {
      if (qty <= 0) return prev.filter((i) => i.productId !== productId);
      return prev.map((i) => (i.productId === productId ? { ...i, qty } : i));
    });
  }, []);

  const removeFromCart = useCallback((productId) => {
    setCart((prev) => prev.filter((i) => i.productId !== productId));
  }, []);

  const clearCart = useCallback(() => setCart([]), []);

  // --- Order actions ---
  const submitOrder = useCallback(async (payload) => {
    const now = new Date();
    const pad = (n) => String(n).padStart(2, '0');
    const createdAt = `${pad(now.getDate())}.${pad(now.getMonth() + 1)}.${now.getFullYear()}, ${pad(now.getHours())}:${pad(now.getMinutes())}`;

    const cityObj = window.DATA.cityById(payload.customer.city);
    const teamObj = window.DATA.teamById(payload.customer.team);

    const orderData = {
      createdAt,
      status: 'new',
      customer: {
        ...payload.customer,
        cityName: cityObj?.name || payload.customer.city,
        teamName: teamObj?.name || payload.customer.team,
      },
      delivery: payload.delivery,
      comment: payload.comment,
      // Enrich items with team/title/price so server can notify correct team
      items: cart.map((i) => {
        const p = window.DATA.productById(i.productId);
        return {
          productId: i.productId,
          qty: i.qty,
          team: p?.team,
          title: p?.title,
          price: p?.price,
        };
      }),
    };

    const res = await fetch('/api/orders', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(orderData),
    });

    const order = await res.json();
    setOrders((prev) => [order, ...prev]);
    clearCart();
    return order;
  }, [cart, clearCart]);

  const updateOrderStatus = useCallback((id, status) => {
    setOrders((prev) => prev.map((o) => (o.id === id ? { ...o, status } : o)));
    fetch(`/api/orders/${id}`, {
      method: 'PATCH',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ status }),
    }).catch(() => {});
  }, []);

  // --- Derived ---
  const cartCount = useMemo(() => cart.reduce((a, i) => a + i.qty, 0), [cart]);
  const cartTotal = useMemo(
    () => cart.reduce((sum, i) => {
      const p = window.DATA.productById(i.productId);
      return sum + (p ? p.price * i.qty : 0);
    }, 0),
    [cart]
  );

  const value = {
    city, setCity,
    cart, addToCart, updateQty, removeFromCart, clearCart, cartCount, cartTotal,
    orders, submitOrder, updateOrderStatus,
    toast, showToast,
  };

  return <StoreCtx.Provider value={value}>{children}</StoreCtx.Provider>;
};

const useStore = () => useContext(StoreCtx);
const fmtPrice = (n) => `${n.toLocaleString('ru-RU')} ₽`;

Object.assign(window, { StoreProvider, useStore, fmtPrice });
