// Moderis App — producten zoeken/scannen, met twee expliciete standen:
//   log    → "Eten loggen": wat je kiest wordt gelogd (met portie-vraag)
//   pantry → "Naar voorraad": wat je kiest gaat je voorraad in (met
//             hoeveelheid-vraag, voor het automatisch afboeken bij koken)
// De stand is bovenaan altijd zichtbaar én wisselbaar — geen verwarring meer
// over wáár iets heen gaat.

function SearchField({ query, setQuery, onScan, placeholder }) {
  return (
    <div style={{ display: 'flex', gap: 10, alignItems: 'center', marginBottom: 18 }}>
      <div className="m-zoek" style={{ flex: 1, minHeight: 48, boxShadow: 'var(--m-shadow)' }}>
        <MIcon name="search" size={17} color="var(--ink-3)" />
        <input value={query} onChange={(e) => setQuery(e.target.value)} autoFocus
          placeholder={placeholder || 'Zoek een product…'} />
        {query && (
          <button className="m-btn tap" onClick={() => setQuery('')}
            style={{ width: 22, height: 22, padding: 0, borderRadius: 999, background: 'var(--m-card-3)', flex: '0 0 auto' }}>
            <MIcon name="close" size={13} color="var(--ink-2)" />
          </button>
        )}
      </div>
      <button className="m-btn tap" onClick={onScan} title="Scan barcode"
        style={{ width: 48, height: 48, padding: 0, borderRadius: 16, background: 'var(--forest-700)', flex: '0 0 auto', boxShadow: 'var(--m-shadow)' }}>
        <MIcon name="barcode" size={22} color="var(--on-forest)" />
      </button>
    </div>
  );
}

// Hoeveel ga je ervan eten — en als wát (tussendoor/ontbijt/…)? Eén tik op
// een gram-chip logt direct; de macro's schalen live mee.
const QTY_MOMENTEN = [
  { key: 'tussendoor', label: 'Tussendoortje' },
  { key: 'ontbijt',    label: 'Ontbijt' },
  { key: 'lunch',      label: 'Lunch' },
  { key: 'avondeten',  label: 'Avondeten' },
];

function LogQtySheet({ food, onClose, onConfirm }) {
  const { useState } = React;
  const nuStr = (() => { const d = new Date(); const p = (x) => (x < 10 ? '0' : '') + x; return p(d.getHours()) + ':' + p(d.getMinutes()); })();
  const [gram, setGram] = useState('100');
  const [moment, setMoment] = useState('tussendoor');
  const [tijd, setTijd] = useState(nuStr);
  const [busy, setBusy] = useState(false);
  const kies = async (g) => {
    if (busy || !(Number(g) > 0)) return;
    setBusy(true);
    try { await onConfirm(Number(g), moment, tijd || nuStr); } finally { setBusy(false); }
  };
  const g = Number(gram) || 0;
  const f = g / 100;
  const CHIPS = [30, 50, 100, 150, 200, 250];
  return (
    <Sheet title={food.name} onClose={onClose}>
      <div style={{ fontSize: 12.5, color: 'var(--ink-3)', marginBottom: 12 }}>
        {food.brand} · per 100 g: <span className="num">{food.kcal}</span> kcal · E {food.p} K {food.c} V {food.f}
      </div>
      {/* Als wat log je dit? Standaard tussendoor — één tik om te wisselen. */}
      <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap', marginBottom: 10 }}>
        {QTY_MOMENTEN.map((mm) => (
          <button key={mm.key} className={'m-chip' + (moment === mm.key ? ' is-active' : '')}
            onClick={() => setMoment(mm.key)} style={{ padding: '6px 12px', fontSize: 12 }}>
            {mm.label}
          </button>
        ))}
      </div>
      {/* Hoe laat at je dit? (anker voor je eetschema) — standaard: nu */}
      <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 14 }}>
        <span style={{ fontSize: 12, color: 'var(--ink-3)' }}>gegeten om</span>
        <input type="time" value={tijd} onChange={(e) => setTijd(e.target.value)}
          style={{ padding: '5px 9px', fontSize: 13, borderRadius: 9, border: '1px solid var(--m-line-2)',
            background: 'var(--m-card)', fontFamily: 'inherit', width: 'auto' }} />
      </div>
      <div className="m-eyebrow" style={{ marginBottom: 8 }}>Hoeveel eet je? (tik = loggen)</div>
      <div className="m-pill-grid" style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 8, marginBottom: 14 }}>
        {CHIPS.map((c) => (
          <button key={c} className="m-btn tap" onClick={() => kies(c)} disabled={busy}
            style={{ padding: '12px 0', fontSize: 14, fontWeight: 600, borderRadius: 13,
              border: '1px solid var(--m-line-2)', background: 'var(--m-card)',
              ...(busy ? { opacity: 0.5, cursor: 'wait' } : {}) }}>
            <span className="num">{c}</span> g
            <span className="num" style={{ display: 'block', fontSize: 10.5, fontWeight: 500, color: 'var(--ink-3)', marginTop: 2 }}>
              {Math.round(food.kcal * c / 100)} kcal
            </span>
          </button>
        ))}
      </div>
      <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
        <input type="number" min="1" value={gram} onChange={(e) => setGram(e.target.value)}
          onKeyDown={(e) => e.key === 'Enter' && kies(g)}
          style={{ width: 90, padding: '11px 12px', fontSize: 14, borderRadius: 13,
            border: '1px solid var(--m-line-2)', background: 'var(--m-card)', fontFamily: 'inherit' }} />
        <span style={{ fontSize: 13, color: 'var(--ink-3)' }}>g</span>
        <button className="m-btn m-btn-primary tap" onClick={() => kies(g)} disabled={busy || !(g > 0)}
          style={{ flex: 1, fontSize: 14, padding: '12px', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 7, ...(busy ? { opacity: 0.6, cursor: 'wait' } : {}) }}>
          {busy ? <Spinner size={15} /> : null}{busy ? 'Loggen…' : `Log ${g > 0 ? g + ' g · ' + Math.round(food.kcal * f) + ' kcal' : ''}`}
        </button>
      </div>
    </Sheet>
  );
}

// Frequentie-score van een voorraad-item op basis van je eetpatroon: hoe vaak
// komen woorden uit de productnaam voor in wat je de laatste 30 dagen logde?
function eetFrequentie(naam, favMap) {
  const wrd = String(naam || '').toLowerCase().split(/[^a-zà-ü0-9]+/).filter((w) => w.length >= 4);
  let score = 0;
  favMap.forEach((aantal, favNaam) => {
    if (wrd.some((w) => favNaam.includes(w))) score += aantal;
  });
  return score;
}

function AddScreen({ mode = 'log', onModeChange, onAdd, onScan, addedIds, voorraad = [], onAddCustom, favorieten = {}, restjes = [], onEetRestje }) {
  const [query, setQuery] = React.useState('');
  const [results, setResults] = React.useState([]);
  const [searching, setSearching] = React.useState(false);
  const [searchError, setSearchError] = React.useState(null);

  // Zoeken via onze EIGEN database (basistabel + eigen voedingsmiddelen + OFF
  // als fallback) — dus kip/gehakt/groente worden gevonden, en veel minder
  // externe calls. Gedebounced (400ms) zodat er pas na even niet-typen gezocht wordt.
  React.useEffect(() => {
    const q = query.trim();
    if (q.length < 2) { setResults([]); setSearchError(null); return; }
    setSearching(true); setSearchError(null);
    let cancelled = false;
    const t = setTimeout(async () => {
      try {
        const data = await api.zoekVoeding(q);
        if (cancelled) return;
        const list = (data.resultaten || [])
          .map((r, i) => adapt.foodFromVoeding(r, i))
          .filter((f) => f && f.name)
          .slice(0, 20);
        setResults(list);
      } catch (err) {
        if (!cancelled) setSearchError(err.message);
      } finally {
        if (!cancelled) setSearching(false);
      }
    }, 400);
    return () => { cancelled = true; clearTimeout(t); };
  }, [query]);

  // Eetpatroon (laatste 30 dagen) → naam→aantal map, voor sorteren + snel loggen.
  const favMap = React.useMemo(() => {
    const m = new Map();
    Object.values(favorieten || {}).forEach((lijst) => (lijst || []).forEach((f) => {
      const k = String(f.naam || '').toLowerCase().trim();
      if (k) m.set(k, (m.get(k) || 0) + (Number(f.aantal) || 0));
    }));
    return m;
  }, [favorieten]);

  // Voorraad: wat je het vaakst eet bovenaan (vaak_gegeten-vlag telt ook mee).
  const voorraadZichtbaar = React.useMemo(() => {
    return (voorraad || [])
      .filter((it) => !(it.hoeveelheid_g != null && Number(it.hoeveelheid_g) === 0))   // op = niet in huis
      .map((it) => ({ it, score: eetFrequentie(it.naam, favMap) + (it.vaak_gegeten ? 3 : 0) }))
      .sort((a, b) => b.score - a.score)
      .map((x) => x.it);
  }, [voorraad, favMap]);

  // "Vaak gelogd": complete items die je regelmatig at (≥2×) — één tik logt
  // de gemiddelde portie opnieuw. Voor je vaste ontbijt/snacks.
  const vaakGelogd = React.useMemo(() => {
    if (mode === 'pantry') return [];
    const per = new Map();
    Object.values(favorieten || {}).forEach((lijst) => (lijst || []).forEach((f) => {
      const k = String(f.naam || '').trim();
      if (!k) return;
      const bestaand = per.get(k);
      if (bestaand) bestaand.aantal += Number(f.aantal) || 0;
      else per.set(k, { ...f, naam: k, aantal: Number(f.aantal) || 0 });
    }));
    return [...per.values()]
      .filter((f) => f.aantal >= 2 && Number(f.gem_kcal) > 0)
      .sort((a, b) => b.aantal - a.aantal)
      .slice(0, 6)
      .map((f) => ({
        id: 'fav-' + f.naam, name: f.naam, brand: f.aantal + '× gegeten', portion: '1 portie',
        kcal: Math.round(Number(f.gem_kcal) || 0), p: Math.round(Number(f.gem_eiwitten) || 0),
        c: Math.round(Number(f.gem_koolhydraten) || 0), f: Math.round(Number(f.gem_vetten) || 0),
        barcode: null, vastePortie: true,
      }));
  }, [favorieten, mode]);

  // Zoeken in je voorraad is gratis en instant — matches tonen we bóven de
  // databaseresultaten, want wat je in huis hebt is meestal wat je bedoelt.
  const q = query.trim().toLowerCase();
  const voorraadMatches = (mode !== 'pantry' && q.length >= 2)
    ? voorraadZichtbaar.filter((it) => String(it.naam || '').toLowerCase().includes(q)).slice(0, 5)
    : [];

  // In voorraad-modus: waarschuw als het product er al staat (ook als het op
  // is) — dan pas je daar de hoeveelheid aan i.p.v. een duplicaat te maken.
  const alInVoorraad = (mode === 'pantry' && q.length >= 2)
    ? (voorraad || []).filter((it) => String(it.naam || '').toLowerCase().includes(q)).slice(0, 3)
    : [];

  const isPantry = mode === 'pantry';
  return (
    <div className="screen screen-add">
      <div style={{ marginBottom: 14 }}>
        <h1 style={{ margin: '0 0 4px', fontFamily: 'var(--m-serif)', fontSize: 28, fontWeight: 500, letterSpacing: '-0.015em', color: 'var(--forest-950)' }}>
          {isPantry ? 'Naar voorraad' : 'Eten loggen'}
        </h1>
        <div style={{ fontSize: 12.5, color: 'var(--ink-2)', lineHeight: 1.45 }}>
          {isPantry
            ? 'Wat je hier kiest gaat je voorraad in — zodat Moderis weet wat je kunt maken.'
            : 'Wat je hier kiest wordt gelogd als gegeten (je kiest eerst de portie).'}
        </div>
      </div>

      {/* Stand-wissel: altijd zichtbaar wáár je keuze heen gaat */}
      {onModeChange && (
        <div style={{ display: 'flex', gap: 7, marginBottom: 16 }}>
          {[['log', 'Eten loggen', 'apple'], ['pantry', 'Naar voorraad', 'box']].map(([k, label, icon]) => (
            <button key={k} className="tap" onClick={() => onModeChange(k)}
              style={{ flex: 1, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 7,
                fontSize: 13, fontWeight: 600, padding: '10px', borderRadius: 12, cursor: 'pointer', fontFamily: 'inherit',
                border: '1px solid ' + (mode === k ? 'var(--forest-300)' : 'var(--m-line)'),
                background: mode === k ? 'var(--forest-100)' : 'var(--m-card)',
                color: mode === k ? 'var(--forest-700)' : 'var(--ink-2)' }}>
              <MIcon name={icon} size={15} color={mode === k ? 'var(--forest-600)' : 'var(--ink-3)'} /> {label}
            </button>
          ))}
        </div>
      )}

      <SearchField query={query} setQuery={setQuery} onScan={onScan}
        placeholder={isPantry ? 'Zoek een product voor je voorraad…' : 'Zoek wat je gegeten hebt…'} />

      {!query.trim() && (
        <button className="tap" onClick={onScan}
          style={{ width: '100%', textAlign: 'left', display: 'flex', alignItems: 'center', gap: 14, padding: '14px 16px',
            background: 'var(--forest-100)', border: '1px solid var(--forest-200)', borderRadius: 18, marginBottom: 22, cursor: 'pointer' }}>
          <div style={{ width: 44, height: 44, borderRadius: 13, background: 'var(--forest-700)',
            display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}>
            <MIcon name="scan" size={22} color="var(--on-forest)" />
          </div>
          <div style={{ flex: 1 }}>
            <div style={{ fontSize: 14, fontWeight: 600, color: 'var(--forest-900)' }}>Scan een barcode</div>
            <div style={{ fontSize: 12, color: 'var(--forest-700)', marginTop: 2 }}>
              {isPantry ? 'Gescand product gaat naar je voorraad' : 'Gescand product log je met één portie-keuze'}
            </div>
          </div>
          <MIcon name="chevron" size={18} color="var(--forest-500)" />
        </button>
      )}

      {query.trim() ? (
        <div>
          {/* Duplicaat-hint: staat al in je voorraad → daar hoeveelheid aanpassen */}
          {alInVoorraad.length > 0 && (
            <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8, padding: '10px 13px', marginBottom: 12,
              background: 'var(--forest-100)', border: '1px solid var(--forest-200)', borderRadius: 13,
              fontSize: 12.5, color: 'var(--forest-900)', lineHeight: 1.45 }}>
              <MIcon name="box" size={15} color="var(--forest-600)" style={{ marginTop: 1, flex: '0 0 auto' }} />
              <span>
                Al in je voorraad: <strong>{alInVoorraad.map((it) => it.naam).join(', ')}</strong>.
                Pas daar de hoeveelheid aan i.p.v. dubbel toe te voegen.
              </span>
            </div>
          )}
          {/* Matches uit je eigen voorraad — instant, geen wachten op de database */}
          {voorraadMatches.length > 0 && (
            <div style={{ marginBottom: 14 }}>
              <div className="m-eyebrow" style={{ marginBottom: 2 }}>Uit je voorraad</div>
              {voorraadMatches.map((it, i) => {
                const food = adapt.foodFromVoorraad(it);
                return (
                  <React.Fragment key={food.id}>
                    {i > 0 && <hr className="m-hr" />}
                    <FoodResultRow food={food} onAdd={onAdd} added={addedIds.includes(food.id)} />
                  </React.Fragment>
                );
              })}
            </div>
          )}
          <div className="m-eyebrow" style={{ marginBottom: 6 }}>
            {searching ? 'Zoeken…' : (results.length + ' ' + (results.length === 1 ? 'resultaat' : 'resultaten'))}
          </div>
          {searchError && (
            <div style={{ fontSize: 13, color: 'var(--macro-fat)', padding: '10px 0' }}>{searchError}</div>
          )}
          {results.map((food, i) => (
            <React.Fragment key={food.id}>
              {i > 0 && <hr className="m-hr" />}
              <FoodResultRow food={food} onAdd={onAdd} added={addedIds.includes(food.id)} pantryMode={isPantry} />
            </React.Fragment>
          ))}
          {/* Zelf toevoegen — voor kruiden/producten die nergens in staan */}
          {onAddCustom && !searching && query.trim().length >= 2 && (
            <button className="tap" onClick={() => onAddCustom(query.trim())}
              style={{ display: 'flex', alignItems: 'center', gap: 12, width: '100%', textAlign: 'left', cursor: 'pointer',
                padding: '13px 2px', marginTop: results.length ? 8 : 4, background: 'none', border: 'none',
                borderTop: results.length ? '1px solid var(--m-line)' : 'none' }}>
              <div style={{ width: 40, height: 40, borderRadius: 12, background: 'var(--forest-100)', border: '1px solid var(--forest-200)',
                display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}>
                <MIcon name="plus" size={18} color="var(--forest-600)" />
              </div>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontSize: 14, fontWeight: 600 }}>Voeg “{query.trim()}” zelf toe</div>
                <div style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 2 }}>
                  {mode === 'pantry' ? 'Eigen product in je voorraad' : 'Moderis schat de macro’s en logt het'}
                </div>
              </div>
              <MIcon name="chevron" size={18} color="var(--ink-3)" />
            </button>
          )}
        </div>
      ) : (
        <div>
          {/* Restjes — kant-en-klaar in de koelkast: één tik logt een portie */}
          {mode !== 'pantry' && onEetRestje && (restjes || []).filter((g) => Number(g.porties_over) > 0).length > 0 && (
            <div style={{ marginBottom: 16 }}>
              <div className="m-eyebrow" style={{ marginBottom: 2 }}>Kant-en-klaar in huis · 1 tik</div>
              {(restjes || []).filter((g) => Number(g.porties_over) > 0).map((g, i) => (
                <React.Fragment key={g.id}>
                  {i > 0 && <hr className="m-hr" />}
                  <div style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '11px 0' }}>
                    <div style={{ width: 40, height: 40, flex: '0 0 auto', borderRadius: 12, background: 'var(--forest-100)',
                      border: '1px solid var(--forest-200)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                      <MIcon name="box" size={17} color="var(--forest-600)" />
                    </div>
                    <div style={{ flex: 1, minWidth: 0 }}>
                      <div style={{ fontSize: 14, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{g.naam}</div>
                      <div className="num" style={{ fontSize: 11.5, color: 'var(--ink-3)', marginTop: 2 }}>
                        {(+g.porties_over % 1 ? (+g.porties_over).toFixed(1) : +g.porties_over)} over · {Math.round(g.kcal || 0)} kcal/portie · E {Math.round(g.eiwitten || 0)}g
                      </div>
                    </div>
                    <button className="m-btn m-btn-primary tap" onClick={() => onEetRestje(g)}
                      style={{ fontSize: 12.5, padding: '9px 13px', flex: '0 0 auto' }}>
                      <MIcon name="plus" size={14} sw={2.2} color="var(--on-forest)" /> 1 portie
                    </button>
                  </div>
                </React.Fragment>
              ))}
            </div>
          )}
          {/* Vaak gelogd — je vaste items: één tik logt de gemiddelde portie */}
          {vaakGelogd.length > 0 && (
            <div style={{ marginBottom: 16 }}>
              <div className="m-eyebrow" style={{ marginBottom: 2 }}>Vaak gelogd · 1 tik</div>
              {vaakGelogd.map((food, i) => (
                <React.Fragment key={food.id}>
                  {i > 0 && <hr className="m-hr" />}
                  <FoodResultRow food={food} onAdd={onAdd} added={addedIds.includes(food.id)} />
                </React.Fragment>
              ))}
            </div>
          )}
          {mode !== 'pantry' && voorraadZichtbaar.length > 0 ? (
            <React.Fragment>
              <div className="m-eyebrow" style={{ marginBottom: 2 }}>Uit je voorraad</div>
              {voorraadZichtbaar.slice(0, 20).map((it, i) => {
                const food = adapt.foodFromVoorraad(it);
                return (
                  <React.Fragment key={food.id}>
                    {i > 0 && <hr className="m-hr" />}
                    <FoodResultRow food={food} onAdd={onAdd} added={addedIds.includes(food.id)} />
                  </React.Fragment>
                );
              })}
            </React.Fragment>
          ) : vaakGelogd.length === 0 ? (
            <div style={{ fontSize: 13.5, color: 'var(--ink-3)', padding: '10px 2px', lineHeight: 1.5 }}>
              Zoek een product hierboven{mode === 'pantry' ? '.' : ', of scan een barcode.'}
            </div>
          ) : null}
        </div>
      )}
    </div>
  );
}

// ---------- Barcode scanner (echte camera via html5-qrcode) ----------
// Leest EAN/UPC-barcodes live uit de camera (achtercamera op mobiel). De code
// gaat door /api/food?barcode= voor het product + macro's. Vereist HTTPS
// (Vercel) of localhost voor camera-toegang.
function ScannerView({ onClose, onResult }) {
  const { useState, useRef, useEffect } = React;
  const [status, setStatus] = useState('starting'); // starting | scanning | looking | found | error
  const [found, setFound] = useState(null);
  const [error, setError] = useState(null);
  const [runId, setRunId] = useState(0);
  const scannerRef = useRef(null);
  const busyRef = useRef(false);

  const stopScanner = async () => {
    const s = scannerRef.current;
    scannerRef.current = null;
    if (s) { try { await s.stop(); } catch (_) {} try { s.clear(); } catch (_) {} }
  };

  useEffect(() => {
    let cancelled = false;
    busyRef.current = false;
    if (!window.Html5Qrcode) { setError('Scanner niet geladen — herlaad de pagina.'); setStatus('error'); return; }

    const fmts = window.Html5QrcodeSupportedFormats;
    const config = {
      fps: 12,
      // GEEN qrbox: scan het hele camerabeeld. Een klein kader mist 1D-
      // streepjescodes vaak. Native BarcodeDetector gebruiken waar mogelijk
      // (sneller + betrouwbaarder voor barcodes), anders ZXing-fallback.
      experimentalFeatures: { useBarCodeDetectorIfSupported: true },
      formatsToSupport: fmts
        ? [fmts.EAN_13, fmts.EAN_8, fmts.UPC_A, fmts.UPC_E, fmts.CODE_128, fmts.CODE_39]
        : undefined,
    };
    const scanner = new window.Html5Qrcode('scan-region', { verbose: false });
    scannerRef.current = scanner;

    const onDecoded = async (text) => {
      if (busyRef.current) return;
      busyRef.current = true;
      setStatus('looking');
      await stopScanner();
      try {
        const product = await api.barcode(String(text).trim());
        const food = adapt.foodFromOFF(product, 0);
        if (!food) throw new Error('Dit product mist voedingswaarden in de database.');
        if (!cancelled) { setFound(food); setStatus('found'); }
      } catch (e) {
        if (!cancelled) { setError((e.message || 'Onbekende fout') + ' · barcode ' + text); setStatus('error'); }
      }
    };

    scanner.start({ facingMode: 'environment' }, config, onDecoded, () => {})
      .then(() => { if (!cancelled) setStatus('scanning'); })
      .catch((e) => {
        if (cancelled) return;
        const msg = /permission|denied|notallowed/i.test(String(e))
          ? 'Geen camera-toegang. Sta camera toe voor deze site en probeer opnieuw.'
          : 'Camera starten mislukt: ' + (e && e.message ? e.message : e);
        setError(msg); setStatus('error');
      });

    return () => { cancelled = true; stopScanner(); };
    // eslint-disable-next-line
  }, [runId]);

  const opnieuw = () => { setFound(null); setError(null); setStatus('starting'); busyRef.current = false; setRunId((x) => x + 1); };
  const sluit = () => { stopScanner(); onClose(); };
  const cameraBezig = status === 'starting' || status === 'scanning';

  return (
    <div className="scanner">
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '52px 22px 0' }}>
        <span style={{ color: 'var(--on-forest)', fontWeight: 600, fontSize: 15 }}>Barcode scannen</span>
        <button className="m-btn tap" onClick={sluit}
          style={{ width: 34, height: 34, padding: 0, borderRadius: 999, background: 'rgba(243,241,231,0.14)' }}>
          <MIcon name="close" size={17} color="var(--on-forest)" />
        </button>
      </div>

      {/* Live camera — html5-qrcode injecteert de video in #scan-region */}
      <div style={{ display: 'flex', justifyContent: 'center', padding: '20px 22px 0' }}>
        <div style={{ position: 'relative', width: '100%', maxWidth: 340, borderRadius: 20, overflow: 'hidden',
          background: 'rgba(0,0,0,0.35)', minHeight: cameraBezig ? 210 : 0 }}>
          <div id="scan-region" style={{ width: '100%' }}></div>
          {status === 'scanning' && (
            <div style={{ position: 'absolute', bottom: 10, left: 0, right: 0, textAlign: 'center',
              color: 'rgba(243,241,231,0.85)', fontSize: 12.5 }}>Richt op de streepjescode…</div>
          )}
        </div>
      </div>

      <div style={{ flex: 1, padding: '18px 22px 40px', display: 'flex', flexDirection: 'column', justifyContent: 'flex-end' }}>
        {status === 'found' && found ? (
          <div style={{ background: 'var(--m-card)', borderRadius: 22, padding: 16, boxShadow: 'var(--m-shadow-md)',
            animation: 'm-slide-up .3s cubic-bezier(0.22,1,0.36,1) both' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 12 }}>
              <span style={{ width: 18, height: 18, borderRadius: 999, background: 'var(--leaf)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                <MIcon name="check" size={11} sw={2.8} color="var(--forest-950)" />
              </span>
              <span className="m-eyebrow" style={{ color: 'var(--forest-600)' }}>Product gevonden</span>
            </div>
            <div style={{ display: 'flex', alignItems: 'center', gap: 13, marginBottom: 16 }}>
              <div style={{ width: 46, height: 46, borderRadius: 13, background: 'var(--m-card-2)', border: '1px solid var(--m-line)',
                display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                <MIcon name="utensils" size={19} color="var(--forest-600)" />
              </div>
              <div style={{ flex: 1 }}>
                <div style={{ fontSize: 15, fontWeight: 600 }}>{found.name}</div>
                <div style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 2 }}>
                  {found.brand} · <span className="num">{found.portion}</span> · <span className="num">{found.kcal}</span> kcal
                </div>
              </div>
            </div>
            <div style={{ display: 'flex', gap: 9 }}>
              <button className="m-btn m-btn-primary tap" onClick={() => onResult(found)} style={{ flex: 1, padding: '12px', fontSize: 14 }}>
                <MIcon name="plus" size={15} sw={2.2} color="var(--on-forest)" /> Toevoegen
              </button>
              <button className="m-btn m-btn-ghost tap" onClick={opnieuw} style={{ padding: '12px 16px', fontSize: 14 }}>
                Opnieuw
              </button>
            </div>
          </div>
        ) : status === 'error' ? (
          <div style={{ background: 'var(--m-card)', borderRadius: 22, padding: 16, boxShadow: 'var(--m-shadow-md)' }}>
            <div style={{ fontSize: 13.5, color: 'var(--macro-fat)', marginBottom: 12 }}>{error}</div>
            <button className="m-btn m-btn-ghost tap" onClick={opnieuw} style={{ padding: '10px 14px', fontSize: 13 }}>Opnieuw</button>
          </div>
        ) : (
          <div style={{ textAlign: 'center', color: 'rgba(243,241,231,0.7)', fontSize: 13.5 }}>
            {status === 'looking' ? 'Product opzoeken…' : (status === 'starting' ? 'Camera starten…' : 'Zoeken naar streepjescode…')}
          </div>
        )}
      </div>
    </div>
  );
}

Object.assign(window, { AddScreen, ScannerView, LogQtySheet });
