/* ============================================================
   VLF 2026 · BUY FLOW — phase · 3 nhánh · 3 bước có giỏ
   Nhánh: view (Vé xem) · play (Vé thi đấu) · combo (Gói trải nghiệm)
   props: nav, phase, persona, addTicket, addOrder
   ============================================================ */
function BuyTickets({ nav, phase, persona, addTicket, addOrder, backRef }) {
  const t = useT();const lang = t.lang;const T = (vi, en) => lang === 'en' ? en : vi;
  const E = (o, k) => window.VLF.L(lang, o, k);
  const L2 = (o) => o ? o[lang] || o.vi : ''; // field vốn là object {vi,en}
  const V = window.VLF;const M = V.money;
  const ph = V.salePhases.find((p) => p.id === phase) || V.salePhases[1];
  const px = (base) => V.phasePrice(base, ph.id);

  const me = V.personas[persona] && V.personas[persona].me || { name: 'Khách VLF' };
  const [branch, setBranch] = useState(null); // 'view' | 'play' | 'combo'
  const [step, setStep] = useState(1); // 1 chọn · 2 upsell · 3 giỏ
  const [picked, setPicked] = useState(null); // ticket/combo object
  const [qty, setQty] = useState(1);
  const [galaSel, setGalaSel] = useState({}); // gala by date
  const [adds, setAdds] = useState({}); // addonId -> qty
  const [trainVenue, setTrainVenue] = useState(null);
  const [trainPkg, setTrainPkg] = useState(null);
  const [sheet, setSheet] = useState(null); // addon đang xem chi tiết
  const [pay, setPay] = useState('qr');
  const [invoice, setInvoice] = useState(false);
  const [inv, setInv] = useState({ company: '', tax: '', email: '' });
  const [result, setResult] = useState(null);
  const ref = React.useMemo(() => 'VLF' + Math.floor(10000 + Math.random() * 89999), []);

  const gift = ph.id === 'gift';
  const isCombo = branch === 'combo';

  /* back ở header hệ thống pop theo bước: step>1 → step trước; đã chọn nhánh → về chọn loại vé; gốc → thoát (false) */
  React.useEffect(() => {
    if (!backRef) return;
    backRef.current = () => { if (step > 1) { setStep((s) => s - 1); return true; } if (branch) { setBranch(null); return true; } return false; };
    return () => { backRef.current = null; };
  }, [step, branch]);

  function reset() {setStep(1);setPicked(null);setQty(1);setGalaSel({});setAdds({});setTrainVenue(null);setTrainPkg(null);}
  function pickBranch(b) {setBranch(b);reset();}

  /* ---------- promo & giá vé ---------- */
  function bestPromo(tk, q) {
    if (!tk || !tk.promo) return null;
    let best = null;tk.promo.forEach((p) => {if (q >= p.min && (!best || p.off > best.off)) best = p;});
    return best;
  }
  const promo = bestPromo(picked, qty);
  const galaBase = V.addons.find((a) => a.id === 'gala');
  const galaPrice = Math.round(px(galaBase.base) * (1 - (galaBase.disc || 0)) / 10000) * 10000;

  /* ---------- giỏ ---------- */
  const addLines = [];
  if (picked) {
    const unit = Math.round(px(picked.base) * (promo ? 1 - promo.off : 1) / 10000) * 10000;
    addLines.push({ key: 'tk', name: E(picked, 'name'), price: unit, qty, promoLabel: promo ? E(promo, 'label') : null });
    (picked.includes || []).forEach((inc, i) => addLines.push({ key: 'inc' + i, name: inc[lang] || inc.vi, price: 0, qty: 1, included: true }));
  }
  Object.keys(galaSel).forEach((d) => {if (galaSel[d]) {const g = V.galaNights.find((x) => x.date === d);addLines.push({ key: 'gala-' + d, name: 'Gala Dinner · ' + (g ? g.date : d), price: galaPrice, qty: 1 });}});
  V.addons.forEach((a) => {if (a.id !== 'gala' && adds[a.id]) addLines.push({ key: a.id, name: E(a, 'name'), price: px(a.base), qty: adds[a.id] });});
  if (trainPkg && branch === 'play' && picked && picked.id === 'side') {const v = V.training.venues.find((x) => x.id === trainVenue);addLines.push({ key: 'train', name: T('Tập golf · ', 'Training · ') + E(trainPkg, 'name') + (v ? ' · ' + v.name : ''), price: trainPkg.base, qty: 1 });}
  const total = addLines.reduce((s, l) => s + l.price * l.qty, 0);

  function commit(ok) {
    if (ok && picked) {
      const span = isCombo ? E(picked, 'who') : branch === 'play' ? T('Suất thi đấu', 'Playing slot') : picked.unit ? E(picked, 'unit') : T('Vé xem', 'Spectator');
      addTicket && addTicket({ name: E(picked, 'name'), tag: picked.tag, span, attendee: me.name, code: ref });
      addOrder && addOrder({ ref, kind: 'ticket', items: addLines.map((l) => ({ name: l.name + (l.included ? T(' · Đã gồm', ' · Included') : ''), qty: l.qty, price: l.price, tint: '#522367' })), total, deliv: 'eticket', method: pay, date: '19/06/2026', status: 'ready' });
    }
    setResult(ok ? 'ok' : 'fail');
  }

  /* ---------- KẾT QUẢ ---------- */
  if (result === 'ok') {
    return <SuccessScreen badge={pay === 'card' ? 'Visa · Mastercard' : T('Chuyển khoản QR', 'QR transfer')}
    title={T('Thanh toán thành công', 'Payment successful')}
    sub={T('Mã đơn ', 'Order ') + ref + T('. Vé QR đã gửi qua Zalo & lưu Apple/Google Wallet. BTC sẽ nhắn riêng về dress code & hướng dẫn trước sự kiện.', '. QR tickets sent via Zalo & saved to Wallet. Dress code & pre-event guidance will be messaged separately.')}
    cta={T('Mở vé của tôi', 'Open my tickets')} onCta={() => nav('ticket')} />;
  }
  if (result === 'fail') {
    return (
      <div className="v-screen" style={{ display: 'flex', flexDirection: 'column', minHeight: '100%', paddingBottom: 96 }}>
        <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', textAlign: 'center', padding: '0 32px' }}>
          <div className="v-success-ic" style={{ background: 'rgba(192,57,43,.12)', color: 'var(--vlf-under)' }}><Icon name="info" size={42} sw={2} /></div>
          <h3 style={{ fontSize: 23, fontWeight: 800, margin: '16px 0 8px' }}>{T('Thanh toán thất bại', 'Payment failed')}</h3>
          <p className="v-muted" style={{ fontSize: 14, lineHeight: 1.55, maxWidth: '32ch' }}>{T('Giao dịch bị từ chối hoặc gián đoạn. Giỏ hàng của bạn vẫn được giữ — vui lòng thử lại.', 'Declined or interrupted. Your cart is kept — please try again.')}</p>
        </div>
        <div className="v-cta"><button className="v-btn v-btn-primary" onClick={() => setResult(null)}>{T('Thử lại', 'Try again')}</button></div>
      </div>);

  }

  /* ---------- CHỌN NHÁNH ---------- */
  if (!branch) {
    return (
      <div className="v-screen" style={{ paddingBottom: 24 }}>
        <div className="v-pad">
          <PhaseStrip ph={ph} V={V} lang={lang} E={E} T={T} />
          <div className="v-sect"><h3>{T('Bạn muốn mua loại vé nào?', 'Which ticket type?')}</h3></div>
          <div className="v-branch" onClick={() => pickBranch('view')}>
            <div className="ic"><Icon name="ticket" size={26} sw={1.6} /></div>
            <div style={{ flex: 1 }}><div className="t">{T('Vé xem', 'Spectator')}</div><div className="s">{T('Khán giả vào xem giải · Thường / VIP', 'Watch the event · General / VIP')}</div></div>
            <Icon name="chev" size={20} className="chev" />
          </div>
          <div className="v-branch" onClick={() => pickBranch('play')}>
            <div className="ic" style={{ background: 'rgba(201,162,75,.16)', color: 'var(--vlf-gold-700)' }}><Icon name="golfer" size={26} sw={1.6} /></div>
            <div style={{ flex: 1 }}><div className="t">{T('Vé thi đấu', 'Compete')}</div><div className="s">{T('Vận động viên · Bảng phụ / Pro-Am / Legends', 'Athletes · Side / Pro-Am / Legends')}</div></div>
            <Icon name="chev" size={20} className="chev" />
          </div>
          <div className="v-branch" onClick={() => pickBranch('combo')}>
            <div className="ic" style={{ background: 'rgba(62,142,126,.16)', color: '#2E6E60' }}><Icon name="star" size={26} sw={1.6} /></div>
            <div style={{ flex: 1 }}><div className="t">{T('Gói trải nghiệm', 'Experience packages')}</div><div className="s">{T('Trọn hành trình · Gia đình · Golfer', 'Full journey · Family · Golfer')}</div></div>
            <Icon name="chev" size={20} className="chev" />
          </div>
          <p className="v-muted" style={{ fontSize: 11.5, lineHeight: 1.55, padding: '12px 2px 0' }}>{V.childPolicy[lang] || V.childPolicy.vi}</p>
        </div>
      </div>);

  }

  const stepLabels = [T('Chọn vé', 'Choose'), T('Nâng cấp', 'Add-ons'), T('Giỏ & thanh toán', 'Cart & pay')];

  /* render 1 thẻ vé/combo */
  function TicketCard(tk) {
    const on = picked && picked.id === tk.id;
    const tkPromo = bestPromo(tk, on ? qty : 1);
    return (
      <div className={'v-card v-tk' + (on ? ' v-tk-on' : '')} key={tk.id} onClick={() => {setPicked(tk);if (!on) setQty(1);}}
      style={{ cursor: 'pointer', borderColor: on ? 'var(--vlf-purple-600)' : tk.featured ? 'var(--vlf-gold-500)' : undefined, borderWidth: on || tk.featured ? 2 : 1 }}>
        <div className="v-tk-head">
          <div style={{ flex: 1, minWidth: 0 }}>
            {tk.featured && <span className="v-pill v-pill-gold" style={{ marginBottom: 7 }}>{T('Đáng mua nhất', 'Best value')}</span>}
            <div className="v-tk-name">{E(tk, 'name')}</div>
            <div className="v-tk-zone">{isCombo ? E(tk, 'who') : E(tk, 'note')}</div>
          </div>
          <div className="v-tk-price">
            {gift && !isCombo ? <b className="v-num" style={{ fontSize: 15 }}>{T('Vé mời', 'Invite')}</b> :
            <><b className="v-num">{M(px(tk.base))}</b>{tk.unit && <span className="v-muted" style={{ fontSize: 11 }}>{E(tk, 'unit')}</span>}</>}
            {!(gift && !isCombo) && ph.mult < 1 && <div className="v-muted v-num" style={{ fontSize: 11, marginTop: 3, textDecoration: 'line-through' }}>{M(tk.base)}</div>}
          </div>
        </div>
        <div className="v-tk-perks">{(isCombo ? tk.includes.map((x) => x[lang] || x.vi) : E(tk, 'perks')).map((pk, j) => <div className="v-perk" key={j}><Icon name="check" size={16} sw={2.4} />{pk}</div>)}</div>
        {tk.promo && <div className="v-promo-row">{tk.promo.map((p, j) => <span className={'v-promo-chip' + (tkPromo && tkPromo.min === p.min ? ' on' : '')} key={j}>{E(p, 'label')}</span>)}</div>}
        {tk.highlight && <div className="v-tk-highlight"><Icon name="trophy" size={17} sw={1.8} /><span>{L2(tk.highlight)}</span></div>}
        {isCombo && tk.note && <div className="v-tk-save">{E(tk, 'note')}</div>}
        {on && <div className="v-tk-foot"><span className="v-muted" style={{ fontSize: 12 }}>{T('Số lượng', 'Qty')}</span><div className="v-step"><button onClick={(e) => {e.stopPropagation();setQty((q) => Math.max(1, q - 1));}}>−</button><b className="v-num">{qty}</b><button onClick={(e) => {e.stopPropagation();setQty((q) => q + 1);}}>+</button></div></div>}
      </div>);

  }

  return (
    <div className="v-screen" style={{ display: 'flex', flexDirection: 'column', minHeight: '100%' }}>
      <div className="v-pad" style={{ flex: 1 }}>
        <div className="v-pay-steps">
          {stepLabels.map((l, i) => <React.Fragment key={i}>{i > 0 && <span className="div" />}<span className={step >= i + 1 ? 'on' : ''}>{i + 1} · {l}</span></React.Fragment>)}
        </div>

        {/* BƯỚC 1 — chọn vé */}
        {step === 1 && <>
          <PhaseStrip ph={ph} V={V} lang={lang} E={E} T={T} compact />
          {isCombo ?
          V.comboSegs.map((seg) =>
          <div key={seg.id}>
                <div className="v-sect"><h3>{E(seg, 'name')}</h3></div>
                <div style={{ display: 'flex', flexDirection: 'column', gap: 13 }}>{V.combos.filter((c) => c.seg === seg.id).map((c) => TicketCard(c))}</div>
              </div>
          ) :

          <div style={{ display: 'flex', flexDirection: 'column', gap: 13, marginTop: 4 }}>{(branch === 'view' ? V.viewTickets : V.playTickets).map((tk) => TicketCard(tk))}</div>
          }
          {gift && !isCombo && <p className="v-hint" style={{ marginTop: 14 }}>{T('Đang ở giai đoạn Vé tặng — vé phát hành dạng mời, kích hoạt bằng mã. Mở bán thương mại từ Early Bird.', 'Gift phase — tickets are invite-only via code. Commercial sale starts at Early Bird.')}</p>}
        </>}

        {/* BƯỚC 2 — upsell */}
        {step === 2 && <>
          {branch === 'play' &&
          <div className="v-hint" style={{ marginBottom: 14 }}>{T('Vé thi đấu đã gồm Gala + VIP Lounge ĐÚNG NGÀY bạn thi đấu. Mua thêm cho ngày khác bên dưới.', 'Your entry already includes Gala + VIP Lounge ON your competition day. Add other days below.')}</div>
          }

          {/* Gói tập golf — chỉ khi chọn vé bảng phụ */}
          {branch === 'play' && picked && picked.id === 'side' && <>
            <div className="v-sect" style={{ marginTop: 2 }}><h3>{T('Gói tập golf cho người mới', 'Training for new players')}</h3></div>
            <p className="v-muted" style={{ fontSize: 12, lineHeight: 1.5, padding: '0 2px 10px' }}>{L2(V.training.note)}</p>
            <div className="v-train-venues">
              {V.training.venues.map((v) =>
              <button key={v.id} className={'v-venue' + (trainVenue === v.id ? ' on' : '')} onClick={() => setTrainVenue(v.id)}>
                  <b>{v.name}</b><span>{v.kind}</span>
                </button>
              )}
            </div>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 12 }}>
              {V.training.packages.map((p) => {
                const on = trainPkg && trainPkg.id === p.id;
                return (
                  <div key={p.id} className={'v-card v-pkg' + (on ? ' on' : '')} onClick={() => {setTrainPkg(p);if (!trainVenue) setTrainVenue(V.training.venues[0].id);}}
                  style={{ cursor: 'pointer', borderColor: on ? 'var(--vlf-purple-600)' : p.featured ? 'var(--vlf-gold-500)' : undefined, borderWidth: on || p.featured ? 2 : 1, display: 'flex', alignItems: 'center', gap: 12 }}>
                    <span className={'v-radio' + (on ? ' on' : '')}>{on && <Icon name="check" size={12} sw={3} />}</span>
                    <div style={{ flex: 1, minWidth: 0 }}>
                      <div className="t" style={{ fontSize: 14.5, fontWeight: 700 }}>{E(p, 'name')}{p.featured && <span className="v-pill v-pill-gold" style={{ marginLeft: 8 }}>{T(p.tag, p.tagEn)}</span>}</div>
                      <div className="s" style={{ fontSize: 12 }}>{L2(V.training.groupNote)}</div>
                    </div>
                    <b className="v-num" style={{ fontSize: 14 }}>{M(p.base)}</b>
                  </div>);

              })}
            </div>
            {trainPkg && <button className="v-muted" style={{ background: 'none', border: 'none', fontSize: 12, padding: '8px 2px 0', cursor: 'pointer' }} onClick={() => {setTrainPkg(null);}}>{T('Bỏ gói tập', 'Remove training')}</button>}
          </>}

          {/* Gala Dinner — chỉ nhánh play */}
          {branch === 'play' && <>
            <div className="v-sect"><h3>{T('Gala Dinner', 'Gala Dinner')}</h3><span className="v-muted" style={{ fontSize: 12 }}>{M(galaPrice)}{T('/đêm · −30%', '/night · −30%')}</span></div>
            <div className="v-card" style={{ padding: '2px 14px' }}>
              {V.galaNights.map((g) =>
              <label className="v-check" key={g.date}>
                  <div style={{ flex: 1 }}><div className="t" style={{ fontSize: 14 }}>{T('Đêm ', 'Night ')}{lang === 'en' ? g.dayEn : g.day} · {g.date}</div></div>
                  <input type="checkbox" checked={!!galaSel[g.date]} onChange={(e) => setGalaSel((s) => ({ ...s, [g.date]: e.target.checked }))} />
                  <span className="v-box">{galaSel[g.date] && <Icon name="check" size={13} sw={3} />}</span>
                </label>
              )}
            </div>
            <p className="v-muted" style={{ fontSize: 11, padding: '7px 2px 0' }}>{T('Gala chỉ tổ chức tối Thứ Tư, Thứ Sáu, Thứ Bảy — không có tối Thứ Năm.', 'Gala runs Wed, Fri, Sat nights only — no Thursday.')}</p>
          </>}

          {/* Add-on services */}
          <div className="v-sect"><h3>{T('Dịch vụ thêm', 'Add-on services')}</h3><span className="v-muted" style={{ fontSize: 12 }}>{T('chạm để xem chi tiết', 'tap for details')}</span></div>
          <div className="v-card">
            {V.addons.filter((a) => a.id !== 'gala').map((a) => {
              const q = adds[a.id] || 0;
              return (
                <div className="v-addrow" key={a.id} onClick={() => setSheet(a)}>
                  <div className="ic" style={{ background: 'var(--vlf-purple-50)', color: 'var(--vlf-purple-700)' }}><Icon name={a.ic} size={19} sw={1.7} /></div>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div className="t" style={{ fontSize: 13.5, fontWeight: 600 }}>{E(a, 'name')}{q > 0 && <span className="v-qbadge v-num">×{q}</span>}</div>
                    <div className="s">{M(px(a.base))} {E(a, 'unit')} · <span style={{ color: 'var(--vlf-purple-700)', fontWeight: 600 }}>{T('Chi tiết', 'Details')}</span></div>
                  </div>
                  {q === 0 ?
                  <button className="v-add-btn" onClick={(e) => {e.stopPropagation();setAdds((s) => ({ ...s, [a.id]: 1 }));}}>{T('Thêm', 'Add')}</button> :
                  <div className="v-prod-qty" onClick={(e) => e.stopPropagation()}><button onClick={() => setAdds((s) => {const n = { ...s };if (n[a.id] > 1) n[a.id]--;else delete n[a.id];return n;})}>−</button><b className="v-num">{q}</b><button onClick={() => setAdds((s) => ({ ...s, [a.id]: q + 1 }))}>+</button></div>}
                </div>);

            })}
          </div>

          {/* Chính sách ra vào */}
          <div className="v-sect"><h3>{T('Chính sách ra vào', 'Access policy')}</h3></div>
          <div className="v-card" style={{ padding: '12px 14px' }}>
            {(V.accessNote[lang] || V.accessNote.vi).map((line, i) =>
            <div key={i} className="v-access-row"><Icon name="check" size={15} sw={2.3} /><span>{line}</span></div>
            )}
            <div className="v-access-row" style={{ color: 'var(--vlf-ink-500)' }}><Icon name="info" size={15} sw={2} /><span>{V.childPolicy[lang] || V.childPolicy.vi}</span></div>
          </div>
        </>}

        {/* BƯỚC 3 — review + thanh toán */}
        {step === 3 && <>
          <div className="v-sect" style={{ marginTop: 2 }}><h3>{T('Xác nhận đơn hàng', 'Review order')}</h3><span className="v-muted" style={{ fontSize: 12 }}>{addLines.reduce((s, l) => s + l.qty, 0)} {T('mục', 'items')}</span></div>
          <div className="v-card" style={{ padding: '2px 14px' }}>
            {addLines.map((l) =>
            <div className="v-row" key={l.key} style={{ cursor: 'default' }}>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="t" style={{ fontSize: 13.5 }}>{l.name}{l.promoLabel && <span className="v-promo-tag">{l.promoLabel}</span>}</div>
                  <div className="s">{l.included ? T('Quyền lợi kèm theo', 'Bundled benefit') : M(l.price) + ' × ' + l.qty}</div>
                </div>
                {l.included ?
              <span className="v-pill" style={{ background: 'rgba(62,142,126,.12)', color: '#2E6E60', fontSize: 11 }}>{T('Đã gồm', 'Included')}</span> :
              <span className="v-num" style={{ fontWeight: 700, fontSize: 13.5 }}>{M(l.price * l.qty)}</span>}
              </div>
            )}
            <div className="v-row" style={{ cursor: 'default', borderTop: '1px solid var(--vlf-line)' }}>
              <div style={{ flex: 1 }}><div className="t" style={{ fontSize: 13.5, fontWeight: 700 }}>{T('Tổng cộng', 'Total')}</div><div className="s">{T('Đã gồm VAT', 'VAT included')}</div></div>
              <span className="v-num" style={{ fontWeight: 800, fontSize: 15, color: 'var(--vlf-purple-700)' }}>{M(total)}</span>
            </div>
          </div>

          <div className="v-me-group"><div className="lbl">{T('Phương thức thanh toán', 'Payment method')}</div>
            <Segmented value={pay} onChange={setPay} items={[{ id: 'qr', label: T('QR · Chuyển khoản', 'QR · transfer') }, { id: 'card', label: T('Thẻ quốc tế', 'Card') }]} />
          </div>

          <div className="v-card" style={{ marginTop: 14, overflow: 'hidden' }}>
            <label className="v-row" style={{ cursor: 'pointer' }}>
              <div style={{ width: 38, height: 38, borderRadius: 11, flex: '0 0 auto', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--vlf-purple-50)', color: 'var(--vlf-purple-700)' }}><Icon name="survey" size={19} sw={1.7} /></div>
              <div style={{ flex: 1, minWidth: 0 }}><div className="t" style={{ fontSize: 14 }}>{T('Xuất hóa đơn (VAT)', 'Issue VAT invoice')}</div><div className="s">{T('Cho doanh nghiệp / công tác phí', 'For company / reimbursement')}</div></div>
              <input type="checkbox" checked={invoice} onChange={(e) => setInvoice(e.target.checked)} style={{ position: 'absolute', opacity: 0, pointerEvents: 'none' }} />
              <span className={'v-switch' + (invoice ? ' on' : '')}><span className="knob" /></span>
            </label>
            {invoice &&
            <div style={{ padding: '4px 14px 14px' }}>
                <div className="v-field"><label>{T('Tên công ty', 'Company name')}</label><input value={inv.company} onChange={(e) => setInv({ ...inv, company: e.target.value })} placeholder={T('Công ty TNHH...', 'Company Ltd...')} /></div>
                <div className="v-field"><label>{T('Mã số thuế', 'Tax code')}</label><input value={inv.tax} onChange={(e) => setInv({ ...inv, tax: e.target.value })} inputMode="numeric" placeholder="0123456789" /></div>
                <div className="v-field" style={{ marginBottom: 0 }}><label>{T('Email nhận hóa đơn', 'Invoice email')}</label><input value={inv.email} onChange={(e) => setInv({ ...inv, email: e.target.value })} inputMode="email" placeholder="ketoan@congty.vn" /></div>
              </div>
            }
          </div>
          <p className="v-hint">{T('Thanh toán 1 lần cho toàn bộ giỏ. BTC gửi dress code & hướng dẫn qua tin nhắn sau khi đặt.', 'One payment for the whole cart. Dress code & guidance are messaged after purchase.')}</p>
        </>}
      </div>

      <div className="v-cta">
        {step >= 2 &&
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10, padding: '0 2px' }}>
            <span className="v-muted" style={{ fontSize: 13 }}>{T('Tạm tính', 'Subtotal')}</span>
            <span className="v-num" style={{ fontFamily: 'var(--font-display)', fontSize: 22, fontWeight: 800, color: 'var(--vlf-purple-700)' }}>{M(total)}</span>
          </div>
        }
        {step === 1 && <button className="v-btn v-btn-primary" disabled={!picked || gift && !isCombo} onClick={() => setStep(2)}>{gift && !isCombo ? T('Giai đoạn vé mời', 'Invite-only phase') : T('Tiếp tục · nâng cấp', 'Continue · add-ons')}</button>}
        {step === 2 && <button className="v-btn v-btn-primary" onClick={() => setStep(3)}>{T('Xem giỏ hàng', 'View cart')}</button>}
        {step === 3 && <button className="v-btn v-btn-primary" onClick={() => commit(true)}>{T('Thanh toán', 'Pay')} {M(total)}</button>}
      </div>

      {sheet && ReactDOM.createPortal(
        <div className="v-sheet-wrap" onClick={() => setSheet(null)}>
          <div className="v-sheet" onClick={(e) => e.stopPropagation()}>
            <div className="v-sheet-grip" />
            <div style={{ display: 'flex', alignItems: 'center', gap: 13, marginBottom: 14 }}>
              <div style={{ width: 48, height: 48, borderRadius: 14, flex: '0 0 auto', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--vlf-purple-50)', color: 'var(--vlf-purple-700)' }}><Icon name={sheet.ic} size={24} sw={1.7} /></div>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontFamily: 'var(--font-display)', fontSize: 18, fontWeight: 800 }}>{E(sheet, 'name')}</div>
                <div className="v-num" style={{ fontSize: 13, fontWeight: 700, color: 'var(--vlf-purple-700)', marginTop: 2 }}>{M(px(sheet.base))} <span className="v-muted" style={{ fontWeight: 500 }}>{E(sheet, 'unit')}</span></div>
              </div>
            </div>
            <p style={{ fontSize: 14, lineHeight: 1.6, color: 'var(--vlf-ink-700)', margin: 0 }}>{E(sheet, 'desc')}</p>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginTop: 18 }}>
              <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--vlf-ink-500)' }}>{T('Số lượng', 'Quantity')}</span>
              <div className="v-step"><button onClick={() => setAdds((s) => {const n = { ...s };const c = (n[sheet.id] || 0) - 1;if (c > 0) n[sheet.id] = c;else delete n[sheet.id];return n;})}>−</button><b className="v-num">{adds[sheet.id] || 0}</b><button onClick={() => setAdds((s) => ({ ...s, [sheet.id]: (s[sheet.id] || 0) + 1 }))}>+</button></div>
            </div>
            <button className="v-btn v-btn-primary" style={{ marginTop: 16 }} onClick={() => {setAdds((s) => ({ ...s, [sheet.id]: Math.max(1, s[sheet.id] || 0) }));setSheet(null);}}>{T('Thêm vào giỏ', 'Add to cart')}</button>
          </div>
        </div>,
        document.querySelector('.za-screen') || document.body)}
    </div>);

}
function PhaseStrip({ ph, V, lang, E, T, compact }) {
  const [left, setLeft] = useState(3 * 86400 - 1);
  React.useEffect(() => {const id = setInterval(() => setLeft((s) => s > 0 ? s - 1 : 0), 1000);return () => clearInterval(id);}, []);
  const dd = Math.floor(left / 86400),hh = Math.floor(left % 86400 / 3600),mm = Math.floor(left % 3600 / 60),ss = left % 60;
  return (
    <div className="v-card" style={{ padding: '12px 14px', marginTop: compact ? 0 : 6, marginBottom: compact ? 14 : 0 }}>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>
        <span style={{ fontWeight: 700, fontSize: 13 }}>{T('Giai đoạn', 'Phase')}: {E(ph, 'name')}</span>
        <span className="v-pill v-pill-gold">{ph.mult === 0 ? T('Đếm ngược', 'Countdown') : ph.mult < 1 ? T('Giảm 20%', '20% off') : T('Giá chính thức', 'Standard')}</span>
      </div>
      <div className="v-phases">
        {V.salePhases.map((p, i) =>
        <div className={'v-phase' + (p.id === ph.id ? ' on' : '')} key={p.id}>
            <div className="dot">{i + 1}</div><div className="nm">{E(p, 'name')}</div><div className="sb">{E(p, 'sub')}</div>
          </div>
        )}
      </div>
      {ph.id === 'gift' &&
      <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 11, justifyContent: 'center', color: 'var(--vlf-purple-700)', fontWeight: 700, fontSize: 14 }}>
          <Icon name="clock" size={16} sw={1.9} /><span className="v-num">{dd}{T('n', 'd')} {String(hh).padStart(2, '0')}:{String(mm).padStart(2, '0')}:{String(ss).padStart(2, '0')}</span>
          <span className="v-muted" style={{ fontSize: 11, fontWeight: 500 }}>{T('đến Early Bird', 'to Early Bird')}</span>
        </div>
      }
    </div>);

}

Object.assign(window, { BuyTickets });