/* Klipzy.lv — Create campaign (multi-step) */
function CreateCampaign({ go, setTab, user, draftCampaign }) {
  const lang = useLang();
  const T = (s) => tr(s, lang);
  const brandUid0 = (user && user.user && user.user.uid) || null;
  const editId = draftCampaign ? draftCampaign.id : null;
  const draftKey = 'klipzy_campaign_draft_' + (brandUid0 || 'anon');
  const loadDraft = () => { if (draftCampaign) return null; try { const raw = localStorage.getItem(draftKey); return raw ? JSON.parse(raw) : null; } catch (_) { return null; } };
  const seedFromCampaign = (c) => ({
    name: c.name || '', niche: c.niche || '', desc: c.desc || '',
    rate: String(c.rate || '2.00'), budget: String(c.budget || '0'),
    minViews: c.minViews ? String(c.minViews) : '', maxPerClip: c.maxPerClip ? String(c.maxPerClip) : '50',
    platforms: c.platforms || [], dos: (c.dos && c.dos.length ? c.dos : ['']), donts: (c.donts && c.donts.length ? c.donts : ['']),
    start: c.start || '', end: c.end || '', assetsLinks: (c.assetsLinks && c.assetsLinks.length ? c.assetsLinks : ['']), assets: c.assets || [],
  });
  const draft = loadDraft();
  const [step, setStep] = useState((draft && draft.step) || 0);
  const [busy, setBusy] = useState(false);
  const [err, setErr] = useState('');
  const [toast, setToast] = useState('');
  const [confirmDel, setConfirmDel] = useState(false);
  const [f, setF] = useState(draftCampaign ? seedFromCampaign(draftCampaign) : ((draft && draft.f) || {
    name: '', niche: '', desc: '', rate: '2.00', budget: '0', minViews: '', maxPerClip: '50',
    platforms: [], dos: [''], donts: [''], start: '', end: '', assetsLinks: [''], assets: [],
  }));
  const set = (k, v) => setF((p) => ({ ...p, [k]: v }));
  const togglePlat = (p) => set('platforms', f.platforms.includes(p) ? f.platforms.filter((x) => x !== p) : [...f.platforms, p]);

  // Autosave as a draft whenever the form changes, so leaving mid-creation
  // (switching tabs) doesn't lose progress — resumes on next visit.
  useEffect(() => {
    if (editId) return;
    try { localStorage.setItem(draftKey, JSON.stringify({ step, f })); } catch (_) {}
  }, [step, f]);
  const discardDraft = () => { try { localStorage.removeItem(draftKey); } catch (_) {} };

  const brandUid = brandUid0;
  // Available funds = the brand's uncommitted balance (same escrow ledger as Maksājumi).
  const { txns } = useTransactions(brandUid);
  const sumT = (t) => txns.filter((x) => x.type === t && x.status !== 'declined').reduce((s, x) => s + x.amount, 0);
  const available = sumT('deposit') - sumT('cashout') - sumT('reserve') + sumT('refund') - sumT('fee');
  // 1% platform fee charged on top of the campaign budget at creation.
  const CREATE_FEE_PCT = 0.01;
  const fee = Math.round((+f.budget || 0) * CREATE_FEE_PCT * 100) / 100;
  const totalCost = (+f.budget || 0) + fee;
  const MIN_TOTAL = 10; // minimum total campaign cost (budget + fee)
  const underMin = (+f.budget || 0) > 0 && totalCost < MIN_TOTAL;
  const overBudget = totalCost > available;
  // Campaigns can run at most 30 days. Compute the max allowed end date.
  const MAX_DAYS = 30;
  const maxEnd = (() => { if (!f.start) return ''; const d = new Date(f.start); if (isNaN(d)) return ''; d.setDate(d.getDate() + MAX_DAYS); return d.toISOString().slice(0, 10); })();
  const endTooLong = f.start && f.end && maxEnd && f.end > maxEnd;

  const steps = [T('Pamatinformācija'), T('Cena & budžets'), T('Vadlīnijas'), T('Pārskats')];
  const canNext = () => {
    if (step === 0) return f.name && f.niche && f.desc;
    if (step === 1) return +f.rate > 0 && +f.budget > 0 && f.platforms.length && !overBudget && !underMin;
    if (step === 2) return !endTooLong && f.start && f.end && f.dos.some((s) => s.trim()) && f.donts.some((s) => s.trim()) && f.assetsLinks.some((s) => s.trim());
    return true;
  };
  const estClips = Math.floor((+f.budget / +f.rate) * 1000 / 200000) || 0;

  const brandName = (user && user.profile && user.profile.displayName) || (user && user.user && user.user.displayName) || 'Zīmols';
  const saveDraft = async () => {
    if (!window.KlipzyFirebase) { discardDraft(); go('brand', { tab: 'panel' }); return; }
    setBusy(true); setErr('');
    try {
      const payload = {
        brandUid, brandName, brandLogo: (user && user.profile && user.profile.photoURL) || '',
        name: f.name || 'Melnraksts', niche: f.niche, desc: f.desc,
        rate: +f.rate || 0, budget: +f.budget || 0, minViews: (+f.minViews > 0 ? Math.max(1000, +f.minViews) : 1000), maxPerClip: Math.min(200, +f.maxPerClip || 0), platforms: f.platforms,
        dos: f.dos.map((s) => s.trim()).filter(Boolean),
        donts: f.donts.map((s) => s.trim()).filter(Boolean),
        start: f.start, end: f.end, assetsLink: (f.assetsLinks.find((s) => s.trim()) || '').trim(), assetsLinks: f.assetsLinks.map((s) => s.trim()).filter(Boolean), assets: (f.assets || []).map((a) => ({ name: a.name, url: a.url })),
      };
      if (editId) {
        await window.KlipzyFirebase.updateCampaign(editId, payload);
      } else {
        const n = await window.KlipzyFirebase.countDrafts(brandUid);
        if (n >= 5) { setErr(T('Vari saglabāt ne vairāk kā 5 melnrakstus.')); setBusy(false); return; }
        await window.KlipzyFirebase.createCampaign({ ...payload, draft: true });
      }
      discardDraft();
      try { sessionStorage.setItem('klipzy_toast', T('Melnraksts saglabāts.')); } catch (_) {}
      go('brand', { tab: 'campaigns' });
    } catch (e) { setErr('Neizdevās saglabāt melnrakstu.'); setBusy(false); }
  };

  const publish = async () => {
    if (!window.KlipzyFirebase) { go('brand', { tab: 'panel' }); return; }
    if (overBudget) { setErr('Budžets + 1% maksa pārsniedz pieejamos līdzekļus.'); return; }
    if (underMin) { setErr('Minimālais kampaņas budžets ir €10 (ar komisiju).'); return; }
    if (endTooLong) { setErr('Kampaņa nedrīkst būt garāka par 30 dienām.'); return; }
    setBusy(true); setErr('');
    try {
      const payload = {
        brandUid, brandName, brandLogo: (user && user.profile && user.profile.photoURL) || '',
        name: f.name, niche: f.niche, desc: f.desc,
        rate: +f.rate, budget: +f.budget, minViews: (+f.minViews > 0 ? Math.max(1000, +f.minViews) : 1000), maxPerClip: Math.min(200, +f.maxPerClip || 0), platforms: f.platforms,
        dos: f.dos.map((s) => s.trim()).filter(Boolean),
        donts: f.donts.map((s) => s.trim()).filter(Boolean),
        start: f.start, end: f.end, assetsLink: (f.assetsLinks.find((s) => s.trim()) || '').trim(), assetsLinks: f.assetsLinks.map((s) => s.trim()).filter(Boolean), assets: (f.assets || []).map((a) => ({ name: a.name, url: a.url })),
        createFee: fee,
      };
      if (editId) await window.KlipzyFirebase.publishDraft(editId, payload);
      else await window.KlipzyFirebase.createCampaign(payload);
      discardDraft();
      go('brand', { tab: 'panel', created: f.name || 'Jauna kampaņa' });
    } catch (e) {
      setErr('Neizdevās publicēt kampaņu. Mēģini vēlreiz.');
      setBusy(false);
    }
  };

  return (
    <div className="fade-in">
      <TopBar title={T('Izveidot kampaņu')} subtitle={T('Iestati kampaņu — klipotāji to redzēs tirgū.')}>
        <button className="btn btn-ghost" onClick={saveDraft}>{T('Saglabāt kā melnrakstu')}</button>
        {editId && <button className="btn btn-ghost" style={{ color: 'var(--red)' }} onClick={() => setConfirmDel(true)}><Icon d={I.trash} size={16} /> {T('Dzēst melnrakstu')}</button>}
      </TopBar>
      {confirmDel && ReactDOM.createPortal(
        <div style={{ position: 'fixed', inset: 0, zIndex: 200, background: 'rgba(15,23,42,.5)', display: 'grid', placeItems: 'center', padding: 20 }} onClick={() => setConfirmDel(false)}>
          <div className="card" style={{ maxWidth: 380, width: '100%', padding: 24 }} onClick={(e) => e.stopPropagation()}>
            <h3 style={{ fontSize: 17, margin: 0 }}>{T('Dzēst melnrakstu?')}</h3>
            <p className="muted" style={{ fontSize: 13.5, marginTop: 8, lineHeight: 1.5 }}>{T('Šo darbību nevar atsaukt.')}</p>
            <div style={{ display: 'flex', gap: 10, justifyContent: 'flex-end', marginTop: 18 }}>
              <button className="btn btn-secondary" onClick={() => setConfirmDel(false)}>{T('Atcelt')}</button>
              <button className="btn btn-primary" style={{ background: 'var(--red)', borderColor: 'var(--red)' }} onClick={async () => { if (window.KlipzyFirebase) { try { await window.KlipzyFirebase.deleteDraft(editId); } catch (_) {} } try { sessionStorage.setItem('klipzy_toast', T('Melnraksts dzēsts.')); } catch (_) {} go('brand', { tab: 'campaigns' }); }}>{T('Dzēst')}</button>
            </div>
          </div>
        </div>, document.body)}
      <div style={{ padding: '28px 32px 60px', maxWidth: 820, margin: '0 auto', width: '100%' }}>
        {/* stepper */}
        <div className="create-stepper" style={{ display: 'flex', alignItems: 'center', marginBottom: 30 }}>
          {steps.map((s, i) => (
            <React.Fragment key={s}>
              <div style={{ display: 'flex', alignItems: 'center', gap: 9 }}>
                <span style={{
                  width: 28, height: 28, borderRadius: 999, display: 'grid', placeItems: 'center', flex: 'none',
                  fontSize: 13, fontWeight: 600, transition: 'all .2s',
                  background: i < step ? 'var(--accent)' : i === step ? 'var(--accent-tint)' : '#F1F5F9',
                  color: i < step ? '#fff' : i === step ? 'var(--accent-700)' : 'var(--muted-2)',
                  border: i === step ? '1.5px solid var(--accent)' : '1.5px solid transparent',
                }}>{i < step ? <Icon d={I.check} size={15} stroke="#fff" sw={2.6} /> : i + 1}</span>
                <span className="stepper-label" style={{ fontSize: 13.5, fontWeight: i === step ? 560 : 500, color: i <= step ? 'var(--text)' : 'var(--muted-2)' }}>{s}</span>
              </div>
              {i < steps.length - 1 && <div className="stepper-line" style={{ flex: 1, height: 1.5, background: i < step ? 'var(--accent)' : 'var(--border)', margin: '0 14px', transition: 'background .2s' }} />}
            </React.Fragment>
          ))}
        </div>

        <div className="card" style={{ padding: 28 }}>
          {step === 0 && (
            <div className="fade-in" style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
              <div className="field required"><label>{T('Kampaņas nosaukums')}</label><input className="input" placeholder={T('piem. Rīga Energy — Vasara 2026')} value={f.name} onChange={(e) => set('name', e.target.value)} /></div>
              <div className="field required">
                <label>{T('Niša')}</label>
                <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
                  {ALL_NICHES.map((n) => (
                    <button key={n} onClick={() => set('niche', n)} className="pill" style={{ height: 36, padding: '0 16px', cursor: 'pointer', background: f.niche === n ? 'var(--accent-tint)' : '#fff', borderColor: f.niche === n ? 'var(--accent)' : 'var(--border)', color: f.niche === n ? 'var(--accent-700)' : 'var(--text-2)', fontWeight: f.niche === n ? 560 : 500 }}>{T(n)}</button>
                  ))}
                </div>
              </div>
              <div className="field required"><label>{T('Apraksts')}</label><textarea className="textarea" rows="4" placeholder={T('Ko tu sagaidi no klipotājiem? Apraksti zīmola toni, mērķi un vēlamo saturu…')} value={f.desc} onChange={(e) => set('desc', e.target.value)} /></div>
            </div>
          )}

          {step === 1 && (
            <div className="fade-in" style={{ display: 'flex', flexDirection: 'column', gap: 22 }}>
              <div className="r-grid2" style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 18 }}>
                <div className="field required">
                  <label>{T('Cena par 1 000 skatījumiem (€)')}</label>
                  <div style={{ position: 'relative' }}>
                    <span style={{ position: 'absolute', left: 13, top: '50%', transform: 'translateY(-50%)', color: 'var(--muted)', fontWeight: 540 }}>€</span>
                    <input className="input tnum" style={{ paddingLeft: 26 }} type="number" step="0.05" min="0" onKeyDown={(e) => { if (e.key === '-' || e.key === 'e') e.preventDefault(); }} value={f.rate} onChange={(e) => { const n = +e.target.value || 0; set('rate', String(n <= 0 ? 0 : n)); }} />
                  </div>
                </div>
                <div className="field required">
                  <label className="spread" style={{ alignItems: 'baseline' }}>
                    <span>{T('Kopējais budžets (€)')}</span>
                    <span style={{ fontSize: 12.5, fontWeight: 500, color: overBudget ? 'var(--red)' : 'var(--muted-2)' }}>{T('Pieejams:')} <span className="tnum">{eur0(available)}</span> <button type="button" onClick={() => set('budget', String(Math.max(0, Math.floor((available / (1 + CREATE_FEE_PCT)) * 100) / 100)))} style={{ marginLeft: 6, border: 'none', background: 'var(--accent-tint)', color: 'var(--accent-700)', fontWeight: 600, fontSize: 12, borderRadius: 6, padding: '2px 8px', cursor: 'pointer' }}>{T('Visu')}</button></span>
                  </label>
                  <div style={{ position: 'relative' }}>
                    <span style={{ position: 'absolute', left: 13, top: '50%', transform: 'translateY(-50%)', color: 'var(--muted)', fontWeight: 540 }}>€</span>
                    <input className="input tnum" style={{ paddingLeft: 26, borderColor: overBudget ? 'var(--red)' : undefined }} type="number" step="100" min="0" onKeyDown={(e) => { if (e.key === '-' || e.key === 'e') e.preventDefault(); }} value={f.budget} onChange={(e) => { const n = +e.target.value || 0; set('budget', String(n <= 0 ? 0 : n)); }} />
                  </div>
                  {overBudget && <span style={{ fontSize: 12.5, color: 'var(--red)', marginTop: 2 }}>{T('Budžets pārsniedz pieejamos līdzekļus.')} <a href="#" onClick={(e) => { e.preventDefault(); go('brand', { tab: 'payments' }); }} style={{ color: 'var(--red)', textDecoration: 'underline', fontWeight: 600 }}>{T('Pievieno līdzekļus sadaļā Maksājumi.')}</a></span>}
                  {underMin && !overBudget && <span style={{ fontSize: 12.5, color: 'var(--red)', marginTop: 2 }}>{T('Minimālais kampaņas budžets ir €10 (ar komisiju).')}</span>}
                </div>
              </div>

              {+f.budget > 0 && +f.rate > 0 && (
              <div style={{ background: 'var(--accent-tint)', borderRadius: 12, padding: '16px 18px', display: 'flex', alignItems: 'center', gap: 16 }}>
                <span style={{ color: 'var(--accent)' }}><Icon d={I.spark} size={22} /></span>
                <div style={{ fontSize: 14, color: 'var(--accent-700)', lineHeight: 1.5 }}>
                  {T('Ar šo budžetu tu vari iegūt līdz')} <strong className="tnum">{numLv(+f.budget / +f.rate * 1000)} {T('skatījumiem')}</strong>.
                </div>
              </div>
              )}

              <div className="field">
                <label>{T('Minimālais skatījumu slieksnis izmaksai (nav obligāti)')}</label>
                <div style={{ position: 'relative' }}>
                  <input className="input tnum" type="number" step="500" min="1000" max="10000" placeholder={T('piem. 10000')} value={f.minViews} onKeyDown={(e) => { if (e.key === '-' || e.key === 'e') e.preventDefault(); }} onChange={(e) => set('minViews', e.target.value.replace(/^0+(?=\d)/, ''))} onBlur={(e) => { let n = +e.target.value || 0; if (n <= 0) { set('minViews', ''); return; } n = Math.round(n / 500) * 500; set('minViews', String(Math.min(10000, Math.max(1000, n)))); }} />
                </div>
                <span style={{ fontSize: 12.5, color: 'var(--muted)', marginTop: 2, lineHeight: 1.45 }}>
                  {+f.minViews > 0
                    ? <>{T('Klipotājs saņem izmaksu, kad klips sasniedz')} <strong className="tnum">{numLv(+f.minViews)}</strong> {T('skatījumus, un pēc tam par katriem nākamajiem skatījumiem. Maksimums 10 000.')}</>
                    : <>{T('Atstāj tukšu, lai klipotāji saņemtu izmaksu jau no pirmajiem 1 000 skatījumiem. Maksimums 10 000.')}</>}
                </span>
              </div>
              <div className="field">
                <label>{T('Maksimālā izmaksa par klipu (nav obligāti)')}</label>
                <div style={{ position: 'relative' }}>
                  <span style={{ position: 'absolute', left: 13, top: '50%', transform: 'translateY(-50%)', color: 'var(--muted)', fontWeight: 540 }}>€</span>
                  <input className="input tnum" style={{ paddingLeft: 26 }} type="number" step="10" min="0" max="200" placeholder={T('piem. 50')} value={f.maxPerClip} onChange={(e) => { const n = +e.target.value || 0; set('maxPerClip', String(n <= 0 ? 0 : Math.min(200, n))); }} />
                </div>
                <span style={{ fontSize: 12.5, color: 'var(--muted)', marginTop: 2, lineHeight: 1.45 }}>
                  {+f.maxPerClip > 0
                    ? <>{T('Klips beigs pelnīt, kad sasniegs')} <strong className="tnum">{eur(+f.maxPerClip)}</strong>{T(', un tiks atzīmēts kā pabeigts.')} {T('Maksimums €200.')}</>
                    : <>{T('Atstāj tukšu, lai klipam nebūtu maksimālā izmaksas limita.')} {T('Maksimums €200.')}</>}
                </span>
              </div>

              <div className="field required">
                <label>{T('Atļautās platformas')}</label>
                <div style={{ display: 'flex', gap: 10 }}>
                  {ALL_PLATFORMS.map((p) => {
                    const on = f.platforms.includes(p);
                    return (
                      <button key={p} onClick={() => togglePlat(p)} className="btn" style={{ flex: 1, height: 46, border: '1px solid ' + (on ? 'var(--accent)' : 'var(--border-strong)'), background: on ? 'var(--accent-tint)' : '#fff', color: on ? 'var(--accent-700)' : 'var(--text-2)', fontWeight: 540, gap: 8 }}>
                        {on && <Icon d={I.check} size={16} sw={2.4} />}{p}
                      </button>
                    );
                  })}
                </div>
              </div>
            </div>
          )}

          {step === 2 && (
            <div className="fade-in" style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
              <GuidelineList label={T("Ieteicams (do's)")} color="var(--green)" items={f.dos} onChange={(v) => set('dos', v)} addLabel={T('Pievienot vēl')} placeholder={T('piem. Rādi produktu pirmajās 3 sekundēs')} lang={lang} />
              <GuidelineList label={T("Izvairies (don'ts)")} color="var(--red)" items={f.donts} onChange={(v) => set('donts', v)} addLabel={T('Pievienot vēl')} placeholder={T('piem. Neizmanto rupjus vārdus')} lang={lang} />
              <div className="r-grid2" style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 18 }}>
                <div className="field required"><label>{T('Sākuma datums')}</label><input className="input" type="date" value={f.start} onChange={(e) => set('start', e.target.value)} /></div>
                <div className="field required"><label>{T('Beigu datums')} <span className="muted" style={{ fontWeight: 400 }}>{T('(maks. 30 dienas)')}</span></label><input className="input" type="date" value={f.end} max={maxEnd || undefined} onChange={(e) => set('end', e.target.value)} /></div>
              </div>
              {endTooLong && <div style={{ background: '#FEF2F2', border: '1px solid #FECACA', color: '#B91C1C', borderRadius: 'var(--r)', padding: '10px 13px', fontSize: 13 }}>{T('Kampaņa var ilgt ne vairāk kā 30 dienas.')}</div>}
              <div className="field required">
                <label>{T('Materiāli / brand assets')} <span className="muted" style={{ fontWeight: 400 }}>{T('(maks. 3 faili, 20 MB katrs)')}</span></label>
                <AssetUploader lang={lang} uid={brandUid} assets={f.assets || []} onChange={(a) => set('assets', a)} />
              </div>
              <GuidelineList label={T('Materiālu saite')} color="var(--text)" items={f.assetsLinks} onChange={(v) => set('assetsLinks', v)} addLabel={T('Pievienot vēl')} placeholder="https://drive.google.com/..." lang={lang} />
            </div>
          )}

          {step === 3 && (
            <div className="fade-in">
              <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 22 }}>
                <BrandLogo initials={(brandName || '?').slice(0, 2).toUpperCase()} grad={['#F43F5E', '#FB7185']} size={52} />
                <div>
                  <h3 style={{ fontSize: 19 }}>{f.name || T('Jauna kampaņa')}</h3>
                  <p className="muted" style={{ fontSize: 14 }}>{f.niche || '—'}</p>
                </div>
              </div>
              <div className="r-grid2" style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginBottom: 18 }}>
                <ReviewCell label={T('Cena / 1 000')} value={eur(+f.rate)} accent />
                <ReviewCell label={T('Budžets')} value={eur0(+f.budget)} />
                <ReviewCell label={T('Min. slieksnis')} value={+f.minViews > 0 ? numLv(+f.minViews) + ' skat.' : T('Nav (no 1 000)')} />
                <ReviewCell label={T('Maks. par klipu')} value={+f.maxPerClip > 0 ? eur(+f.maxPerClip) : T('Nav limita')} />
                <ReviewCell label={T('Platformas')} value={f.platforms.join(', ') || '—'} />
                <ReviewCell label={T('Periods')} value={(f.start || '—') + ' → ' + (f.end || '—')} />
                <ReviewCell label={T('Izveides komisija (1%)')} value={eur(fee)} />
                <ReviewCell label={T('Kopā no konta')} value={eur0(totalCost)} accent />
              </div>
              <div style={{ background: '#F8FAFC', borderRadius: 12, padding: 18 }}>
                <div className="eyebrow" style={{ marginBottom: 8 }}>{T('Apraksts')}</div>
                <p style={{ fontSize: 14, color: 'var(--text-2)', lineHeight: 1.5 }}>{f.desc || T('Nav apraksta.')}</p>
              </div>
            </div>
          )}

          {/* nav */}
          <div className="spread" style={{ marginTop: 28, paddingTop: 20, borderTop: '1px solid var(--border)' }}>
            <button className="btn btn-ghost" onClick={() => step === 0 ? (discardDraft(), setTab('panel')) : setStep(step - 1)}>
              <Icon d={I.arrowL} size={16} /> {step === 0 ? T('Atcelt') : T('Atpakaļ')}
            </button>
            {step < 3 ? (
              <button className="btn btn-primary" disabled={!canNext()} onClick={() => setStep(step + 1)}>{T('Tālāk')} <Icon d={I.arrowR} size={16} /></button>
            ) : (
              <button className="btn btn-primary" disabled={busy} onClick={publish}>{busy ? T('Publicē…') : T('Publicēt kampaņu')} <Icon d={I.check} size={16} sw={2.4} /></button>
            )}
          </div>
          {err && <div style={{ marginTop: 12, background: '#FEF2F2', border: '1px solid #FECACA', color: '#B91C1C', borderRadius: 'var(--r)', padding: '10px 13px', fontSize: 13.5 }}>{err}</div>}
        </div>
      </div>
    </div>
  );
}
function ReviewCell({ label, value, accent }) {
  return (
    <div style={{ border: '1px solid var(--border)', borderRadius: 10, padding: '12px 14px' }}>
      <div className="eyebrow" style={{ fontSize: 10 }}>{label}</div>
      <div className="tnum" style={{ fontSize: 16, fontWeight: 600, marginTop: 4, color: accent ? 'var(--accent-700)' : 'var(--text)' }}>{value}</div>
    </div>
  );
}

/* Campaign brand-asset uploader: up to 3 files, 20 MB each. Uploads
   immediately on selection to Storage (campaign-assets/{uid}/…) and reports
   {name,url} pairs back to the parent form. */
function AssetUploader({ lang, uid, assets, onChange }) {
  const T = (s) => tr(s, lang);
  const [busy, setBusy] = useState(false);
  const [err, setErr] = useState('');
  const inputRef = React.useRef(null);
  const MAX_FILES = 3;
  const MAX_BYTES = 20 * 1024 * 1024;
  const pick = async (e) => {
    const files = Array.from(e.target.files || []);
    e.target.value = '';
    if (!files.length) return;
    setErr('');
    if (assets.length + files.length > MAX_FILES) { setErr(T('Maksimums 3 faili.')); return; }
    const oversized = files.find((f) => f.size > MAX_BYTES);
    if (oversized) { setErr(T('Fails ir par lielu. Maksimālais izmērs 20 MB.')); return; }
    setBusy(true);
    try {
      const uploaded = [];
      for (const file of files) {
        const res = await window.KlipzyFirebase.uploadCampaignAsset(uid, file);
        uploaded.push({ name: file.name, url: res.url });
      }
      onChange([...assets, ...uploaded]);
    } catch (ex) {
      setErr(T('Neizdevās augšupielādēt failu.'));
    }
    setBusy(false);
  };
  const remove = (i) => onChange(assets.filter((_, idx) => idx !== i));
  return (
    <div>
      <div onClick={() => assets.length < MAX_FILES && inputRef.current && inputRef.current.click()}
        style={{ border: '1.5px dashed var(--border-strong)', borderRadius: 12, padding: '28px 20px', textAlign: 'center', background: '#FAFBFC', cursor: assets.length < MAX_FILES ? 'pointer' : 'not-allowed', opacity: assets.length < MAX_FILES ? 1 : 0.6 }}>
        <div style={{ color: 'var(--muted-2)', marginBottom: 8 }}><Icon d={I.upload} size={26} /></div>
        <div style={{ fontSize: 14, fontWeight: 540 }}>{busy ? T('Augšupielādē…') : T('Velc failus šeit vai pārlūko')}</div>
        <div className="muted" style={{ fontSize: 12.5, marginTop: 3 }}>{T('Logo, produkta foto, vadlīnijas · PNG, PDF, ZIP')}</div>
      </div>
      <input ref={inputRef} type="file" multiple accept="image/*,.pdf,.zip" onChange={pick} style={{ display: 'none' }} />
      {err && <div style={{ fontSize: 12.5, color: 'var(--red)', marginTop: 6 }}>{err}</div>}
      {assets.length > 0 && (
        <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 10 }}>
          {assets.map((a, i) => (
            <div key={a.url || i} className="spread" style={{ background: '#F8FAFC', borderRadius: 9, padding: '9px 12px', fontSize: 13 }}>
              <a href={a.url} target="_blank" rel="noopener noreferrer" style={{ color: 'var(--accent-700)', textDecoration: 'none', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{a.name}</a>
              <button className="btn btn-ghost btn-sm" style={{ color: 'var(--red)', padding: 4 }} onClick={() => remove(i)}><Icon d={I.x} size={14} /></button>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

function GuidelineList({ label, color, items, onChange, addLabel, placeholder, lang }) {
  const list = (items && items.length) ? items : [''];
  const setAt = (i, v) => { const next = list.slice(); next[i] = v; onChange(next); };
  const add = () => { if (list.length < 5) onChange([...list, '']); };
  const remove = (i) => { const next = list.filter((_, j) => j !== i); onChange(next.length ? next : ['']); };
  return (
    <div className="field">
      <label style={{ color }}>{label}</label>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
        {list.map((v, i) => (
          <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
            <input className="input" style={{ flex: 1 }} placeholder={placeholder} value={v} onChange={(e) => setAt(i, e.target.value)} />
            {list.length > 1 && <button type="button" className="btn btn-ghost btn-sm" style={{ padding: 6, color: 'var(--muted)' }} onClick={() => remove(i)}><Icon d={I.x} size={16} /></button>}
          </div>
        ))}
      </div>
      {list.length < 5 && <button type="button" className="btn btn-ghost btn-sm" style={{ marginTop: 8, color: 'var(--accent-700)', alignSelf: 'flex-start' }} onClick={add}><Icon d={I.plus} size={15} /> {addLabel}</button>}
    </div>
  );
}

Object.assign(window, { CreateCampaign });
