/* app.jsx — App principal, routing, tweaks */

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "primary": "#8C6FAE",
  "displayFont": "cormorant",
  "density": "regular",
  "showGold": true,
  "brunchMode": false,
  "productLayout": "editorial",
  "heroVariant": "full"
}/*EDITMODE-END*/;

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [route, setRoute] = React.useState('landing');
  const [cart, setCart] = React.useState([]);
  const [lastOrder, setLastOrder] = React.useState(null);
  const [cartOpen, setCartOpen] = React.useState(false);
  const [detailProduct, setDetailProduct] = React.useState(null);
  const [detailOpen, setDetailOpen] = React.useState(false);
  const [checkoutOpen, setCheckoutOpen] = React.useState(false);
  const [toast, setToast] = React.useState(null);
  const [orderInfo, setOrderInfo] = React.useState(null);
  const [ready, setReady] = React.useState(false);
  const [loadErr, setLoadErr] = React.useState(false);

  // ── Cargar el menú REAL desde la API antes de renderizar ───────
  React.useEffect(() => {
    let alive = true;
    Promise.all([window.loadMenuData(), window.loadSiteContent ? window.loadSiteContent() : Promise.resolve()])
      .then(() => { if (alive) setReady(true); })
      .catch(() => { if (alive) { setLoadErr(true); setReady(true); } });
    return () => { alive = false; };
  }, []);

  // ── Apply tweaks to document.body / :root ──────────────────────
  React.useEffect(() => {
    document.body.classList.toggle('brunch-mode', !!t.brunchMode);
    document.body.classList.toggle('no-gold', !t.showGold);
    document.body.classList.remove('density-compact', 'density-airy');
    if (t.density === 'compact') document.body.classList.add('density-compact');
    if (t.density === 'airy')    document.body.classList.add('density-airy');

    document.body.classList.remove('display-dm', 'display-italiana', 'display-playfair');
    if (t.displayFont === 'dm')        document.body.classList.add('display-dm');
    if (t.displayFont === 'italiana')  document.body.classList.add('display-italiana');
    if (t.displayFont === 'playfair')  document.body.classList.add('display-playfair');

    // Override --plum at root for signature color tweak
    document.documentElement.style.setProperty('--plum', t.primary);
    // Variante apenas más honda del MISMO lila (hover/peso) — sin caer en ciruela
    document.documentElement.style.setProperty('--plum-deep', shade(t.primary, -0.16));
  }, [t]);

  // Track route → top
  React.useEffect(() => { window.scrollTo({ top: 0 }); }, [route]);

  const cartCount = cart.reduce((s, i) => s + i.qty, 0);
  const cartTotal = cart.reduce((s, i) => s + i.unitPrice * i.qty, 0);

  // ── Cart actions ──────────────────────────────────────────────
  const addToCart = (cartItem) => {
    const uid = Date.now() + '-' + Math.random().toString(36).slice(2, 6);
    const item = { uid, ...cartItem };
    setCart((prev) => [...prev, item]);
    showToast(`${cartItem.name} añadido`);
  };

  const quickAdd = (product) => {
    const variant = product.variants[0];
    const cartItem = {
      productId: product.id,
      name: product.name,
      img: product.img,
      variantId: variant?.id || null,
      variantLabel: variant?.label || null,
      modIds: [],
      modLabels: [],
      unitPrice: variant?.price || product.price,
      qty: 1,
    };
    addToCart(cartItem);
  };

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

  const openDetail = (product) => {
    setDetailProduct(product);
    setDetailOpen(true);
  };
  const closeDetail = () => {
    setDetailOpen(false);
    setTimeout(() => setDetailProduct(null), 240);
  };

  const handleCheckout = () => {
    setCartOpen(false);
    setTimeout(() => setCheckoutOpen(true), 280);
  };
  const completeCheckout = (info) => {
    setLastOrder([...cart]);
    setCart([]);
    setCheckoutOpen(false);
    // Confirmación CLARA (pantalla), no un toast fugaz.
    const data = (info && typeof info === 'object') ? info : { orderId: info };
    setOrderInfo(data);
  };
  const repeatOrder = () => {
    if (lastOrder) {
      setCart([...lastOrder]);
      showToast('Pedido restaurado');
      setCartOpen(true);
    }
  };

  // Toast
  const showToast = (msg) => {
    setToast(msg);
    setTimeout(() => setToast(null), 2400);
  };

  // ── Pantalla de carga (mientras llega el menú real) ────────────
  if (!ready) {
    return (
      <div style={{
        minHeight: '100vh', display: 'flex', flexDirection: 'column',
        alignItems: 'center', justifyContent: 'center', gap: 22,
        background: 'var(--cream, #FBF8F2)', color: 'var(--ink, #2A2320)',
        fontFamily: 'var(--display, "Cormorant Garamond", serif)',
      }}>
        <Logo size={72} />
        <div style={{ fontSize: 24, letterSpacing: '0.04em' }}>Alexandra Castro</div>
        <div style={{
          fontFamily: 'var(--sans, "Jost", sans-serif)', fontSize: 11,
          letterSpacing: '0.22em', textTransform: 'uppercase', opacity: 0.6,
        }}>Preparando la carta…</div>
      </div>
    );
  }

  return (
    <>
      <SiteNav
        route={route}
        setRoute={setRoute}
        cartCount={cartCount}
        onCartOpen={() => setCartOpen(true)}
      />

      {route === 'landing' && (
        <Landing
          heroVariant={t.heroVariant}
          setRoute={setRoute}
          onProductClick={openDetail}
        />
      )}

      {route === 'menu' && (
        <MenuPage
          layout={t.productLayout}
          onAdd={quickAdd}
          onDetail={openDetail}
          onRepeat={repeatOrder}
          hasLastOrder={!!lastOrder}
        />
      )}

      <SiteFooter setRoute={setRoute} />

      <FloatingCart count={cartCount} total={cartTotal} onOpen={() => setCartOpen(true)} />
      <WhatsAppFab />

      <CartModal
        open={cartOpen}
        items={cart}
        total={cartTotal}
        onClose={() => setCartOpen(false)}
        onUpdateQty={updateQty}
        onRemove={removeItem}
        onCheckout={handleCheckout}
      />

      <DetailModal
        product={detailProduct}
        open={detailOpen}
        onClose={closeDetail}
        onAdd={addToCart}
      />

      <CheckoutModal
        open={checkoutOpen}
        onClose={() => setCheckoutOpen(false)}
        items={cart}
        total={cartTotal}
        onComplete={completeCheckout}
      />

      <OrderConfirmModal
        info={orderInfo}
        onClose={() => setOrderInfo(null)}
      />

      <StickyMobileFooter
        cartCount={cartCount}
        onCartOpen={() => setCartOpen(true)}
        route={route}
        setRoute={setRoute}
      />

      {toast && <Toast message={toast} />}

      <TweaksPanel title="Tweaks · Pastelería">
        <TweakSection label="Color firma">
          <TweakColor
            label="Sello de la marca"
            value={t.primary}
            options={['#8C6FAE', '#7E60A2', '#A98FCB', '#6F548D', '#5C3A56']}
            onChange={(v) => setTweak('primary', v)}
          />
        </TweakSection>

        <TweakSection label="Tipografía">
          <TweakSelect
            label="Display font"
            value={t.displayFont}
            options={[
              { value: 'cormorant', label: 'Cormorant Garamond' },
              { value: 'playfair',  label: 'Playfair Display' },
              { value: 'dm',        label: 'DM Serif Display' },
              { value: 'italiana',  label: 'Italiana' },
            ]}
            onChange={(v) => setTweak('displayFont', v)}
          />
        </TweakSection>

        <TweakSection label="Densidad de la carta">
          <TweakRadio
            label="Aire"
            value={t.density}
            options={[
              { value: 'compact', label: 'Densa' },
              { value: 'regular', label: 'Regular' },
              { value: 'airy',    label: 'Aireada' },
            ]}
            onChange={(v) => setTweak('density', v)}
          />
        </TweakSection>

        <TweakSection label="Detalles">
          <TweakToggle
            label="Acentos dorados"
            value={t.showGold}
            onChange={(v) => setTweak('showGold', v)}
          />
          <TweakToggle
            label="Modo Brunch (menta)"
            value={t.brunchMode}
            onChange={(v) => setTweak('brunchMode', v)}
          />
        </TweakSection>

        <TweakSection label="Carta de productos">
          <TweakRadio
            label="Tratamiento"
            value={t.productLayout}
            options={[
              { value: 'editorial', label: 'Lista editorial' },
              { value: 'grid',      label: 'Grid con foto' },
            ]}
            onChange={(v) => setTweak('productLayout', v)}
          />
        </TweakSection>

        <TweakSection label="Hero de la landing">
          <TweakRadio
            label="Variante"
            value={t.heroVariant}
            options={[
              { value: 'full',  label: 'Pleine page' },
              { value: 'split', label: 'Éditorial' },
            ]}
            onChange={(v) => setTweak('heroVariant', v)}
          />
        </TweakSection>
      </TweaksPanel>
    </>
  );
}

// ── Toast (subtle) ────────────────────────────────────────────────
const Toast = ({ message }) => (
  <div style={{
    position: 'fixed', bottom: 100, left: '50%', transform: 'translateX(-50%)',
    zIndex: 9999,
    padding: '14px 24px',
    background: 'var(--ink)', color: 'var(--cream)',
    fontFamily: 'var(--sans)', fontSize: 11,
    letterSpacing: '0.18em', textTransform: 'uppercase',
    borderRadius: 2,
    border: '0.5px solid var(--gold)',
    boxShadow: '0 8px 24px rgba(42,35,32,0.24)',
    animation: 'toastIn 240ms cubic-bezier(.16,1,.3,1)',
  }}>
    {message}
  </div>
);

// ── Helper: shade a hex color ────────────────────────────────────
function shade(hex, amount) {
  const c = hex.replace('#', '');
  const num = parseInt(c.length === 3 ? c.split('').map((x) => x + x).join('') : c, 16);
  let r = (num >> 16) & 255, g = (num >> 8) & 255, b = num & 255;
  r = Math.max(0, Math.min(255, r + Math.round(255 * amount)));
  g = Math.max(0, Math.min(255, g + Math.round(255 * amount)));
  b = Math.max(0, Math.min(255, b + Math.round(255 * amount)));
  return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
