// Jobs view: list, new, and detail (Kanban + Form builder + Landing + Settings)

function JobsView({ state, go, openCandidate, candidates, updateCandidate, reloadData }) {
  const { JOBS } = window.TalentirData;
  if (state.subview === 'new') return <NewJobView go={go} reloadData={reloadData}/>;
  if (state.jobId) {
    const job = JOBS.find(j => j.id === state.jobId);
    if (!job) return <div className="view"><div className="empty">Lowongan tidak ditemukan.</div></div>;
    return <JobDetailView job={job} state={state} go={go} candidates={candidates} openCandidate={openCandidate} updateCandidate={updateCandidate} reloadData={reloadData}/>;
  }
  return <JobsListView go={go} candidates={candidates}/>;
}

// ====== JOBS LIST ======
function JobsListView({ go, candidates }) {
  const { JOBS } = window.TalentirData;
  const [filter, setFilter] = useState('Semua');
  const [showFilter, setShowFilter] = useState(false);
  const [dept, setDept] = useState('all');
  const [query, setQuery] = useState('');
  const [waOnly, setWaOnly] = useState(false);

  const depts = [...new Set(JOBS.map(j => j.dept).filter(Boolean))];
  const q = query.trim().toLowerCase();
  const filtered = JOBS.filter(j => {
    if (filter !== 'Semua' && j.status !== filter) return false;
    if (dept !== 'all' && j.dept !== dept) return false;
    if (waOnly && !j.wa) return false;
    if (q && ![j.title, j.dept, j.loc, j.type].filter(Boolean).join(' ').toLowerCase().includes(q)) return false;
    return true;
  });
  const activeCount = (dept !== 'all' ? 1 : 0) + (waOnly ? 1 : 0) + (q ? 1 : 0);
  const resetFilters = () => { setDept('all'); setQuery(''); setWaOnly(false); };

  return (
    <div className="view">
      <div className="view-head">
        <div>
          <div className="title">Lowongan</div>
          <div className="subtitle">Kelola posisi yang sedang dibuka, lengkap dengan landing page kustom dan pipeline kandidatnya.</div>
        </div>
        <div className="row-flex">
          <Btn icon="filter" kind={showFilter || activeCount ? 'accent' : undefined} onClick={() => setShowFilter(v => !v)}>
            Filter{activeCount ? ` (${activeCount})` : ''}
          </Btn>
          <Btn kind="primary" icon="plus" onClick={() => go({ view: 'jobs', subview: 'new' })}>Buat Posisi Baru</Btn>
        </div>
      </div>

      <div className="tabs">
        {['Semua', 'Buka', 'Tutup'].map(f => (
          <button key={f} className={'tab ' + (filter === f ? 'active' : '')} onClick={() => setFilter(f)}>
            {f} <span style={{ color: 'var(--muted)', marginLeft: 4 }}>{f === 'Semua' ? JOBS.length : JOBS.filter(j => j.status === f).length}</span>
          </button>
        ))}
      </div>

      {showFilter && (
        <div className="row-flex" style={{ gap: 10, margin: '12px 0', padding: '12px 14px', background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10, flexWrap: 'wrap' }}>
          <div className="row-flex" style={{ gap: 6, flex: 1, minWidth: 200, background: 'var(--bg-soft)', border: '1px solid var(--border)', borderRadius: 8, padding: '6px 10px' }}>
            <Icon name="search" size={14}/>
            <input style={{ border: 0, outline: 0, background: 'transparent', flex: 1, fontSize: 13 }}
                   placeholder="Cari judul, departemen, lokasi…" value={query} onChange={(e) => setQuery(e.target.value)}/>
          </div>
          <select className="select" style={{ width: 'auto' }} value={dept} onChange={(e) => setDept(e.target.value)}>
            <option value="all">Semua departemen</option>
            {depts.map(d => <option key={d} value={d}>{d}</option>)}
          </select>
          <label className="row-flex" style={{ gap: 6, fontSize: 12.5, cursor: 'pointer', userSelect: 'none' }}>
            <input type="checkbox" checked={waOnly} onChange={(e) => setWaOnly(e.target.checked)} style={{ accentColor: 'var(--accent)' }}/>
            WA Bot saja
          </label>
          {activeCount > 0 && <button className="btn ghost sm" onClick={resetFilters}><Icon name="x" size={12}/>Reset</button>}
        </div>
      )}

      {filtered.length === 0 && (
        <div style={{ padding: '24px 0', color: 'var(--muted)', fontSize: 13 }}>Tidak ada lowongan yang cocok dengan filter.</div>
      )}

      <div className="job-grid">
        {filtered.map(job => {
          const cs = candidates.filter(c => c.jobId === job.id);
          const newOnes = cs.filter(c => c.status === 'baru').length;
          return (
            <div key={job.id} className="card job-card" onClick={() => go({ view: 'jobs', jobId: job.id })}>
              <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                <Badge kind={job.status === 'Buka' ? 'good' : ''}>
                  <span className="dot"/>
                  {job.status}
                </Badge>
                {job.wa && <Badge kind="wa"><Icon name="message" size={10}/>WA Bot</Badge>}
                <div style={{ flex: 1 }}/>
                <span style={{ color: 'var(--faint)', fontSize: 11 }} className="mono">{job.published}</span>
              </div>
              <div className="title">{job.title}</div>
              <div style={{ color: 'var(--muted)', fontSize: 12.5 }}>
                {job.dept} · {job.loc} · {job.type}
              </div>
              <div className="stats">
                <div>
                  <div className="v tnum">{cs.length}</div>
                  <div className="l">Pelamar</div>
                </div>
                <div>
                  <div className="v tnum" style={{ color: 'var(--accent)' }}>{newOnes}</div>
                  <div className="l">Baru</div>
                </div>
                <div>
                  <div className="v tnum" style={{ color: 'oklch(0.45 0.13 155)' }}>{cs.filter(c => c.score >= 80).length}</div>
                  <div className="l">Skor ≥80</div>
                </div>
              </div>
            </div>
          );
        })}
        {/* Add new tile */}
        <div className="card job-card" onClick={() => go({ view: 'jobs', subview: 'new' })}
             style={{ border: '1.5px dashed var(--border-strong)', background: 'transparent', display: 'grid', placeItems: 'center', minHeight: 220, color: 'var(--muted)' }}>
          <div style={{ textAlign: 'center' }}>
            <Icon name="plus" size={24}/>
            <div style={{ fontWeight: 700, marginTop: 6, color: 'var(--ink-2)' }}>Buat Posisi Baru</div>
            <div style={{ fontSize: 12 }}>Otomatis generate landing page & link</div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ====== JOB DETAIL ======
function JobDetailView({ job, state, go, candidates, openCandidate, updateCandidate, addCandidate, reloadData }) {
  const tab = state.tab || 'kandidat';
  const set = (t) => go({ ...state, tab: t });
  const [showEdit, setShowEdit] = useState(false);

  const delJob = async () => {
    if (!window.confirm(`Hapus lowongan "${job.title}"? Semua kandidatnya ikut terhapus.`)) return;
    try {
      await fetch(window.TalentirAPI.base + '/api/jobs/' + job.id, { method: 'DELETE', credentials: 'include' });
      if (reloadData) await reloadData();
      go({ view: 'jobs' });
    } catch (e) { console.error('Gagal menghapus lowongan:', e); }
  };

  return (
    <div className="view">
      <div style={{ marginBottom: 12 }}>
        <button className="btn ghost sm" onClick={() => go({ view: 'jobs' })}>
          <Icon name="arrowL" size={12}/> Semua Lowongan
        </button>
      </div>
      <div className="view-head">
        <div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
            <Badge kind={job.status === 'Buka' ? 'good' : ''}><span className="dot"/>{job.status}</Badge>
            {job.wa && <Badge kind="wa"><Icon name="message" size={10}/>WA Bot Aktif</Badge>}
          </div>
          <div className="title" style={{ marginTop: 6 }}>{job.title}</div>
          <div className="subtitle">{job.dept} · {job.loc} · {job.type} · {job.salary}</div>
        </div>
        <div className="row-flex">
          <Btn icon="pencil" size="sm" kind="accent" onClick={() => setShowEdit(true)}>Edit</Btn>
          <Btn icon="trash" size="sm" onClick={delJob}>Hapus</Btn>
        </div>
      </div>

      {showEdit && <JobEditModal job={job} onClose={() => setShowEdit(false)} reloadData={reloadData}/>}

      <div className="tabs">
        {[
          ['kandidat',  'Kandidat',  candidates.filter(c => c.jobId === job.id).length],
          ['form',      'Form Assessment'],
          ['landing',   'Landing Page'],
          ['wa',        'WA Bot Setting'],
        ].map(([id, lbl, ct]) => (
          <button key={id} className={'tab ' + (tab === id ? 'active' : '')} onClick={() => set(id)}>
            {lbl}{ct ? <span style={{ color: 'var(--muted)', marginLeft: 5, fontWeight: 500 }}>{ct}</span> : null}
          </button>
        ))}
      </div>

      {tab === 'kandidat' && <KanbanBoard job={job} candidates={candidates.filter(c => c.jobId === job.id)} openCandidate={openCandidate} updateCandidate={updateCandidate} addCandidate={addCandidate}/>}
      {tab === 'form'     && <FormBuilder job={job}/>}
      {tab === 'landing'  && <LandingSettings job={job} go={go}/>}
      {tab === 'wa'       && <WASettings job={job} go={go} reloadData={reloadData}/>}
    </div>
  );
}

// ====== EDIT JOB MODAL ======
function JobEditModal({ job, onClose, reloadData }) {
  const DEPARTEMEN = ['Operasional', 'Marketing', 'HRD', 'FAT'];
  const POPULAR_BENEFITS = ['Tunjangan Hari Raya', 'Jenjang Karir', 'Uang Makan', 'Uang Transport', 'Bonus Kinerja', 'Pelatihan/Sertifikasi', 'BPJS Kesehatan', 'BPJS Tenaga Kerja', 'Komisi Penjualan', 'Asuransi Kesehatan'];
  const fmtNum = (v) => { const d = String(v).replace(/\D/g, ''); return d ? Number(d).toLocaleString('id-ID') : ''; };
  const parts = (job.salary || '').split(/[—–-]/);
  const [form, setForm] = useState({
    title: job.title || '', dept: job.dept || '', type: job.type || 'Full-time', status: job.status || 'Buka',
    workSystem: job.workSystem || 'onsite', country: job.country || 'Indonesia', officeAddress: job.officeAddress || '',
    salaryMin: (parts[0] || '').replace(/\D/g, ''), salaryMax: (parts[1] || '').replace(/\D/g, ''),
    description: job.description || '',
  });
  const [reqs, setReqs] = useState(job.requirements?.length ? [...job.requirements] : ['']);
  const [benefits, setBenefits] = useState(job.benefits || []);
  const [benefitDraft, setBenefitDraft] = useState('');
  const [saving, setSaving] = useState(false);
  const f = (k) => (e) => setForm(s => ({ ...s, [k]: e.target.value }));
  const setSalary = (k) => (e) => setForm(s => ({ ...s, [k]: e.target.value.replace(/\D/g, '') }));
  const setReq = (i, v) => setReqs(rs => rs.map((r, idx) => idx === i ? v : r));
  const addReq = () => setReqs(rs => [...rs, '']);
  const removeReq = (i) => setReqs(rs => rs.length > 1 ? rs.filter((_, idx) => idx !== i) : rs);
  const addBenefit = (b) => { const v = (b || '').trim(); if (v && benefits.length < 10 && !benefits.includes(v)) setBenefits(bs => [...bs, v]); setBenefitDraft(''); };
  const removeBenefit = (b) => setBenefits(bs => bs.filter(x => x !== b));

  const save = async () => {
    setSaving(true);
    const { salaryMin, salaryMax } = form;
    const salary = salaryMin && salaryMax ? `Rp ${fmtNum(salaryMin)} — ${fmtNum(salaryMax)}`
      : salaryMin ? `Rp ${fmtNum(salaryMin)}` : salaryMax ? `Rp ${fmtNum(salaryMax)}` : '';
    const sysLabel = form.workSystem === 'remote' ? 'Remote' : form.workSystem === 'hybrid' ? 'Hybrid' : 'On-site';
    const loc = [form.officeAddress, sysLabel].filter(Boolean).join(' — ');
    try {
      await window.TalentirAPI.patch('/api/jobs/' + job.id, {
        title: form.title.trim() || job.title, dept: form.dept, type: form.type, status: form.status,
        loc, workSystem: form.workSystem, country: form.country, officeAddress: form.officeAddress,
        salary, description: form.description,
        requirements: reqs.map(s => s.trim()).filter(Boolean), benefits,
      });
      if (reloadData) await reloadData();
      onClose();
    } catch (e) { console.error('Gagal menyimpan lowongan:', e); setSaving(false); }
  };

  return (
    <div className="modal-scrim" onClick={onClose}>
      <div className="modal" style={{ width: 640, maxHeight: '90vh', display: 'flex', flexDirection: 'column' }} onClick={(e) => e.stopPropagation()}>
        <div className="modal-head">
          <h3 style={{ margin: 0, fontSize: 16, letterSpacing: '-0.01em' }}>Edit Lowongan</h3>
          <div style={{ flex: 1 }}/>
          <button className="btn icon ghost" onClick={onClose}><Icon name="x" size={14}/></button>
        </div>
        <div className="modal-body" style={{ overflow: 'auto' }}>
          <div className="col-flex" style={{ gap: 14 }}>
            <div className="field"><label>Judul posisi</label><input className="input" value={form.title} onChange={f('title')}/></div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 12 }}>
              <div className="field"><label>Departemen</label>
                <select className="select" value={form.dept} onChange={f('dept')}>
                  <option value="">Pilih…</option>
                  {DEPARTEMEN.map(d => <option key={d} value={d}>{d}</option>)}
                  {form.dept && !DEPARTEMEN.includes(form.dept) && <option value={form.dept}>{form.dept}</option>}
                </select>
              </div>
              <div className="field"><label>Tipe</label>
                <select className="select" value={form.type} onChange={f('type')}><option>Full-time</option><option>Part-time</option><option>Kontrak</option><option>Magang</option></select>
              </div>
              <div className="field"><label>Status</label>
                <select className="select" value={form.status} onChange={f('status')}><option>Buka</option><option>Tutup</option></select>
              </div>
            </div>

            <div className="field" style={{ border: '1px solid var(--border)', borderRadius: 10, padding: 14 }}>
              <label style={{ fontWeight: 700 }}>Lokasi</label>
              <div style={{ fontSize: 11.5, color: 'var(--muted)', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.06em', margin: '8px 0 6px' }}>Sistem Kerja</div>
              <div className="row-flex" style={{ gap: 18, flexWrap: 'wrap' }}>
                {[['onsite', 'Di Kantor'], ['remote', 'Remote/Dari Rumah'], ['hybrid', 'Hybrid']].map(([v, lbl]) => (
                  <label key={v} className="row-flex" style={{ gap: 6, cursor: 'pointer' }}>
                    <input type="radio" name="editworksys" checked={form.workSystem === v} onChange={() => setForm(s => ({ ...s, workSystem: v }))} style={{ accentColor: 'var(--accent)' }}/>
                    <span style={{ fontSize: 13 }}>{lbl}</span>
                  </label>
                ))}
              </div>
              <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginTop: 12 }}>
                <div className="field" style={{ margin: 0 }}><label>Negara</label><input className="input" value={form.country} onChange={f('country')}/></div>
                <div className="field" style={{ margin: 0 }}><label>Alamat Kantor</label><input className="input" value={form.officeAddress} onChange={f('officeAddress')} placeholder="Mis. Tapos, Depok"/></div>
              </div>
            </div>

            <div className="field"><label>Range gaji (per bulan)</label>
              <div className="row-flex" style={{ gap: 6, maxWidth: 380 }}>
                {['salaryMin', 'salaryMax'].map((k, idx) => (
                  <React.Fragment key={k}>
                    {idx === 1 && <span style={{ color: 'var(--muted)' }}>—</span>}
                    <div className="row-flex" style={{ gap: 4, flex: 1, border: '1px solid var(--border)', borderRadius: 8, padding: '0 8px', background: 'var(--surface)' }}>
                      <span style={{ color: 'var(--muted)', fontSize: 12.5 }}>Rp</span>
                      <input style={{ border: 0, outline: 0, background: 'transparent', flex: 1, minWidth: 0, fontSize: 13, padding: '8px 0' }} inputMode="numeric" placeholder={idx === 0 ? '5.000.000' : '7.000.000'} value={fmtNum(form[k])} onChange={setSalary(k)}/>
                    </div>
                  </React.Fragment>
                ))}
              </div>
            </div>

            <div className="field"><label>Deskripsi singkat</label><textarea className="textarea" value={form.description} onChange={f('description')}/></div>

            <div className="field">
              <label>Kriteria utama <span style={{ color: 'var(--muted)', fontWeight: 500 }}>— 1 per baris</span></label>
              <div className="col-flex" style={{ gap: 6 }}>
                {reqs.map((r, i) => (
                  <div key={i} className="row-flex" style={{ gap: 6 }}>
                    <input className="input" style={{ flex: 1 }} value={r} onChange={e => setReq(i, e.target.value)} placeholder="Kriteria…"/>
                    <button className="btn ghost sm" style={{ padding: 7 }} onClick={() => removeReq(i)} disabled={reqs.length === 1}><Icon name="x" size={13}/></button>
                  </div>
                ))}
                <button className="btn ghost sm" style={{ alignSelf: 'flex-start' }} onClick={addReq}><Icon name="plus" size={12}/> Tambah kriteria</button>
              </div>
            </div>

            <div className="field">
              <label>Benefit & Fasilitas Kerja <span style={{ color: 'var(--muted)', fontWeight: 500 }}>— maks. 10</span></label>
              <div className="row-flex" style={{ gap: 6, flexWrap: 'wrap', border: '1px solid var(--border)', borderRadius: 8, padding: 8, background: 'var(--surface)', minHeight: 40 }}>
                {benefits.map(b => (
                  <span key={b} className="badge" style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>
                    {b}<button className="btn ghost" style={{ padding: 0, lineHeight: 1, height: 'auto' }} onClick={() => removeBenefit(b)}><Icon name="x" size={11}/></button>
                  </span>
                ))}
                {benefits.length < 10 && (
                  <input style={{ border: 0, outline: 0, background: 'transparent', flex: 1, minWidth: 130, fontSize: 13 }}
                         placeholder={benefits.length ? 'Tambah lagi…' : 'Ketik benefit lalu Enter…'}
                         value={benefitDraft} onChange={e => setBenefitDraft(e.target.value)}
                         onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); addBenefit(benefitDraft); } }}/>
                )}
              </div>
              <div style={{ marginTop: 10 }}>
                <div style={{ fontSize: 11.5, color: 'var(--muted)', fontWeight: 700, marginBottom: 6 }}>Terpopuler</div>
                <div className="row-flex" style={{ gap: 6, flexWrap: 'wrap' }}>
                  {POPULAR_BENEFITS.filter(b => !benefits.includes(b)).map(b => (
                    <button key={b} className="btn ghost sm" onClick={() => addBenefit(b)} disabled={benefits.length >= 10}>{b} <Icon name="plus" size={11}/></button>
                  ))}
                </div>
              </div>
            </div>
          </div>
        </div>
        <div className="modal-foot">
          <Btn onClick={onClose}>Batal</Btn>
          <Btn kind="accent" icon="check" onClick={save} disabled={saving}>{saving ? 'Menyimpan…' : 'Simpan Perubahan'}</Btn>
        </div>
      </div>
    </div>
  );
}

// ====== KANBAN ======
function KanbanBoard({ job, candidates, openCandidate, updateCandidate, addCandidate }) {
  const { STATUSES, HR_USERS } = window.TalentirData;
  const [dragging, setDragging] = useState(null);
  const [hover, setHover] = useState(null);
  const [filterHR, setFilterHR] = useState('all'); // 'all' | 'unassigned' | hrId
  const [showDist, setShowDist] = useState(false);
  const [showAdd, setShowAdd] = useState(false);
  // Bulk re-screen progress for the "Disaring AI" column. null = idle,
  // { done, total } while it's running.
  const [rescreenProgress, setRescreenProgress] = useState(null);

  // Re-run AI analysis for every candidate currently in the given list,
  // sequentially. Each call updates the candidate (new score + aiSummary)
  // through the same path the drawer uses, so the card re-renders live.
  const rescreenAll = async (items) => {
    if (!items.length) return;
    if (!window.confirm(`Nilai ulang ${items.length} kandidat dengan AI? Ini akan menimpa skor & ringkasan AI mereka.`)) return;
    setRescreenProgress({ done: 0, total: items.length });
    for (let i = 0; i < items.length; i++) {
      const c = items[i];
      try {
        const r = await window.TalentirAPI.post('/api/candidates/' + c.id + '/rescreen', {});
        // Merge the full candidate response — backend may have auto-staged this
        // row (status change) based on the recruiter's score thresholds.
        updateCandidate({ ...c, ...(r.candidate || {}), score: r.score, aiSummary: r.summary });
      } catch (err) { console.error('rescreen failed for', c.id, err); }
      setRescreenProgress({ done: i + 1, total: items.length });
    }
    setTimeout(() => setRescreenProgress(null), 1500);
  };

  const onDragStart = (c) => (e) => { setDragging(c.id); e.dataTransfer.effectAllowed = 'move'; };
  const onDragEnd = () => { setDragging(null); setHover(null); };
  const onDragOver = (sid) => (e) => { e.preventDefault(); setHover(sid); };
  const onDrop = (sid) => (e) => {
    e.preventDefault();
    const c = candidates.find(x => x.id === dragging);
    if (c && c.status !== sid) updateCandidate({ ...c, status: sid });
    setDragging(null); setHover(null);
  };

  const filtered = candidates.filter(c => {
    if (filterHR === 'all') return true;
    if (filterHR === 'unassigned') return !c.assignedTo;
    return c.assignedTo === filterHR;
  });

  const unassignedCt = candidates.filter(c => !c.assignedTo).length;

  return (
    <div>
      <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 14, flexWrap: 'wrap' }}>
        {/* HR Filter */}
        <div style={{ display: 'flex', gap: 4, padding: 3, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 8 }}>
          <FilterChip active={filterHR === 'all'} onClick={() => setFilterHR('all')}>Semua <span style={{ color: 'var(--muted)', marginLeft: 4 }}>{candidates.length}</span></FilterChip>
          <FilterChip active={filterHR === 'unassigned'} onClick={() => setFilterHR('unassigned')}>
            <span style={{ width: 6, height: 6, borderRadius: 99, background: 'oklch(0.6 0.18 25)', display: 'inline-block', marginRight: 4 }}/>
            Belum dibagi <span style={{ color: 'var(--muted)', marginLeft: 4 }}>{unassignedCt}</span>
          </FilterChip>
          {HR_USERS.filter(h => !h.isOwner).map(hr => {
            const ct = candidates.filter(c => c.assignedTo === hr.id).length;
            if (ct === 0) return null;
            return (
              <FilterChip key={hr.id} active={filterHR === hr.id} onClick={() => setFilterHR(hr.id)}>
                <HRAvatar hr={hr} size={14}/>
                {hr.name.split(' ')[0]}
                <span style={{ color: 'var(--muted)', marginLeft: 2 }}>{ct}</span>
              </FilterChip>
            );
          })}
        </div>
        <div style={{ flex: 1 }}/>
        {unassignedCt > 0 && (
          <Btn kind="accent" icon="users" size="sm" onClick={() => setShowDist(true)}>
            Bagikan {unassignedCt} kandidat ke HR
          </Btn>
        )}
        <Btn icon="plus" size="sm" onClick={() => setShowAdd(true)}>Tambah Kandidat</Btn>
        <div style={{ fontSize: 12, color: 'var(--muted)', width: '100%', marginTop: 4 }}>
          <Icon name="grip" size={11}/> Drag kartu antar kolom untuk ubah status. Klik avatar HR untuk ubah penugasan.
        </div>
      </div>

      <div className="kanban">
        {STATUSES.map(s => {
          const items = filtered.filter(c => c.status === s.id).sort((a,b) => b.score - a.score);
          return (
            <div key={s.id}
                 className={'kcol ' + (hover === s.id ? 'drag-over' : '')}
                 onDragOver={onDragOver(s.id)}
                 onDragLeave={() => setHover(null)}
                 onDrop={onDrop(s.id)}>
              <div className="kcol-head">
                <span className="swatch" style={{ background: s.color }}/>
                <span className="name">{s.name}</span>
                <span className="ct mono">{items.length}</span>
                {/* Re-screen all candidates in this column with AI. Shown only
                    on "Disaring AI" since that's where mis-imported candidates
                    typically sit and need a re-run. */}
                {s.id === 'ai' && items.length > 0 && (
                  <button
                    className="btn ghost sm"
                    style={{ padding: '2px 7px', fontSize: 11 }}
                    onClick={() => rescreenAll(items)}
                    disabled={Boolean(rescreenProgress)}
                    title="Nilai ulang semua kandidat di kolom ini dengan AI"
                  >
                    <Icon name="sparkles" size={11}/>
                    {rescreenProgress
                      ? `Menilai ${rescreenProgress.done}/${rescreenProgress.total}…`
                      : 'Nilai ulang AI'}
                  </button>
                )}
              </div>
              <div className="kcol-body">
                {items.map(c => (
                  <div key={c.id} className={'kcard ' + (dragging === c.id ? 'dragging' : '')}
                       draggable
                       onDragStart={onDragStart(c)} onDragEnd={onDragEnd}
                       onClick={() => openCandidate(c)}>
                    <div className="row">
                      <Avatar name={c.name} size="sm"/>
                      <div style={{ minWidth: 0, flex: 1 }}>
                        <div className="name">{c.name}</div>
                        <div className="sub">{c.experience} · {c.location}</div>
                      </div>
                      <ScoreNumber value={c.score} size={15}/>
                    </div>
                    <ScoreBar value={c.score}/>
                    <div className="tags">
                      <Source src={c.source}/>
                      {c.tags.slice(0, 1).map(t => <Badge key={t}>{t}</Badge>)}
                      {c.hasWA && <Badge kind="wa"><Icon name="message" size={9}/>WA</Badge>}
                      <div style={{ marginLeft: 'auto' }}><AssigneePip hrId={c.assignedTo}/></div>
                    </div>
                  </div>
                ))}
                {items.length === 0 && (
                  <div className="empty" style={{ padding: '24px 8px' }}>
                    <Icon name="layout" size={20}/>
                    <div style={{ marginTop: 6 }}>Kosong</div>
                  </div>
                )}
              </div>
            </div>
          );
        })}
      </div>

      {showDist && <DistributeModal
        candidates={candidates.filter(c => !c.assignedTo)}
        job={job}
        onClose={() => setShowDist(false)}
        onApply={(assignments) => {
          assignments.forEach(({ candidateId, hrId }) => {
            const c = candidates.find(x => x.id === candidateId);
            if (c) updateCandidate({ ...c, assignedTo: hrId });
          });
          setShowDist(false);
        }}/>}

      {showAdd && <AddCandidateModal job={job} onClose={() => setShowAdd(false)} onAdded={addCandidate}/>}
    </div>
  );
}

// ====== Add candidate manually ======
function AddCandidateModal({ job, onClose, onAdded }) {
  const { STATUSES } = window.TalentirData;
  const V = window.TalentirValidate;
  const [f, setF] = useState({ name: '', email: '', phone: '', location: '', experience: '', status: 'baru', tags: '' });
  const [saving, setSaving] = useState(false);
  const [error, setError] = useState(null);
  const set = (k) => (e) => { setF(s => ({ ...s, [k]: e.target.value })); setError(null); };

  // Live-validation: name is required, email & phone are optional but must be
  // well-formed when present (so we don't store junk like "iya" as a phone).
  const emailBad = f.email.trim() && !V.email(f.email);
  const phoneBad = f.phone.trim() && !V.phone(f.phone);
  const formValid = f.name.trim() && !emailBad && !phoneBad;

  const save = async () => {
    if (!formValid) return;
    setSaving(true); setError(null);
    try {
      const r = await window.TalentirAPI.post('/api/candidates', {
        jobId: job.id,
        name: f.name.trim(), email: f.email || null, phone: f.phone || null,
        location: f.location || null, experience: f.experience || null,
        status: f.status, source: 'manual',
        tags: f.tags.split(',').map(t => t.trim()).filter(Boolean),
        hasCv: true,
      });
      onAdded && onAdded(window.TalentirAPI.mapCandidate(r));
      onClose();
    } catch (e) { console.error('Gagal tambah kandidat:', e); setError(e?.message || 'Gagal menambah kandidat. Coba lagi.'); setSaving(false); }
  };

  return (
    <div className="modal-scrim" onClick={onClose}>
      <div className="modal" style={{ width: 480 }} onClick={(e) => e.stopPropagation()}>
        <div className="modal-head">
          <h3 style={{ margin: 0, fontSize: 16 }}>Tambah Kandidat — {job.title}</h3>
          <div style={{ flex: 1 }}/>
          <button className="btn icon ghost" onClick={onClose}><Icon name="x" size={14}/></button>
        </div>
        <div className="modal-body col-flex" style={{ gap: 12 }}>
          <div className="field">
            <label>Nama lengkap</label>
            <input className="input" value={f.name} onChange={set('name')} placeholder="Nama kandidat"
                   autoCapitalize="words" autoComplete="name"/>
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>
            <div className="field">
              <label>Email</label>
              <input className="input" type="email" value={f.email} onChange={set('email')} placeholder="nama@email.com"
                     inputMode="email" autoComplete="email" autoCapitalize="off" autoCorrect="off"/>
              {emailBad && <span className="hint" style={{ color: 'oklch(0.55 0.18 25)' }}>Format email tidak valid.</span>}
            </div>
            <div className="field">
              <label>No. WhatsApp</label>
              <input className="input" type="tel" value={f.phone} onChange={set('phone')} placeholder="+62…"
                     inputMode="tel" autoComplete="tel"/>
              {phoneBad && <span className="hint" style={{ color: 'oklch(0.55 0.18 25)' }}>Nomor minimal 9 digit, format Indonesia.</span>}
            </div>
            <div className="field"><label>Lokasi</label><input className="input" value={f.location} onChange={set('location')} placeholder="Jakarta" autoCapitalize="words"/></div>
            <div className="field"><label>Pengalaman</label><input className="input" value={f.experience} onChange={set('experience')} placeholder="3th" inputMode="numeric"/></div>
          </div>
          {error && <div style={{ background: 'oklch(0.96 0.04 25)', border: '1px solid oklch(0.78 0.12 25)', color: 'oklch(0.4 0.15 25)', padding: '8px 12px', borderRadius: 7, fontSize: 12 }}>{error}</div>}
          <div className="field"><label>Skill / tags (pisahkan koma)</label><input className="input" value={f.tags} onChange={set('tags')} placeholder="Excel, Figma"/></div>
          <div className="field"><label>Masuk ke kolom</label>
            <select className="select" value={f.status} onChange={set('status')}>
              {STATUSES.map(s => <option key={s.id} value={s.id}>{s.name}</option>)}
            </select>
          </div>
        </div>
        <div className="modal-foot">
          <Btn onClick={onClose}>Batal</Btn>
          <Btn kind="accent" icon="check" onClick={save} disabled={saving || !formValid}>{saving ? 'Menyimpan…' : 'Tambah'}</Btn>
        </div>
      </div>
    </div>
  );
}

const FilterChip = ({ active, onClick, children }) => (
  <button
    onClick={onClick}
    style={{
      padding: '5px 10px',
      borderRadius: 6,
      background: active ? 'var(--ink)' : 'transparent',
      color: active ? 'var(--bg)' : 'var(--ink-2)',
      fontSize: 12.5, fontWeight: 600,
      display: 'inline-flex', alignItems: 'center', gap: 5,
      whiteSpace: 'nowrap',
    }}>
    {children}
  </button>
);

// ====== Distribute Modal ======
function DistributeModal({ candidates, job, onClose, onApply }) {
  const { HR_USERS } = window.TalentirData;
  const eligibleHRs = HR_USERS.filter(h => !h.isOwner);
  const [strategy, setStrategy] = useState('roundrobin');
  const [selectedHRs, setSelectedHRs] = useState(eligibleHRs.map(h => h.id));

  // Compute assignments preview
  const assignments = useMemo(() => {
    const pickedHRs = eligibleHRs.filter(h => selectedHRs.includes(h.id));
    if (pickedHRs.length === 0) return [];

    return candidates.map((c, i) => {
      let hr;
      if (strategy === 'roundrobin') {
        hr = pickedHRs[i % pickedHRs.length];
      } else if (strategy === 'location') {
        // Match by candidate location to HR branch
        const byLoc = pickedHRs.find(h => h.branch.toLowerCase().includes(c.location.toLowerCase())) || pickedHRs[i % pickedHRs.length];
        hr = byLoc;
      } else if (strategy === 'score') {
        // High score → first picked HR, etc. Sort & distribute.
        // Simpler: same as roundrobin sorted by score
        hr = pickedHRs[i % pickedHRs.length];
      }
      return { candidateId: c.id, hrId: hr.id };
    });
  }, [candidates, strategy, selectedHRs]);

  const summary = useMemo(() => {
    const counts = {};
    assignments.forEach(a => { counts[a.hrId] = (counts[a.hrId] || 0) + 1; });
    return counts;
  }, [assignments]);

  const toggleHR = (id) => {
    setSelectedHRs(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]);
  };

  return (
    <div className="modal-scrim" onClick={onClose}>
      <div className="modal" style={{ width: 720 }} onClick={(e) => e.stopPropagation()}>
        <div className="modal-head">
          <div>
            <h3 style={{ margin: 0, fontSize: 16, letterSpacing: '-0.01em' }}>Bagikan {candidates.length} kandidat ke HR</h3>
            <div style={{ fontSize: 12, color: 'var(--muted)', marginTop: 2 }}>Lowongan: {job.title}</div>
          </div>
          <div style={{ flex: 1 }}/>
          <button className="btn icon ghost" onClick={onClose}><Icon name="x" size={14}/></button>
        </div>

        <div className="modal-body">
          {/* Strategy */}
          <div>
            <div className="section-title" style={{ marginBottom: 10 }}>1. Strategi pembagian</div>
            <div className="dist-strategy">
              {[
                { id: 'roundrobin', ttl: 'Round-robin (rata)', desc: 'Bagi sama rata ke semua HR yang dipilih. Cepat & adil untuk volume besar.' },
                { id: 'location',   ttl: 'Berdasarkan cabang terdekat', desc: 'Kandidat dialokasikan ke HR di cabang yang sama dengan lokasinya. Cocok untuk F&B multi-cabang.' },
                { id: 'score',      ttl: 'Skor tertinggi ke HR senior', desc: 'Kandidat dengan skor AI ≥80 diprioritaskan ke HR senior pertama yang dipilih.' },
              ].map(s => (
                <div key={s.id} className={'opt ' + (strategy === s.id ? 'selected' : '')} onClick={() => setStrategy(s.id)}>
                  <div className="rd"/>
                  <div className="body">
                    <div className="ttl">{s.ttl}</div>
                    <div className="desc">{s.desc}</div>
                  </div>
                </div>
              ))}
            </div>
          </div>

          {/* Choose HRs */}
          <div>
            <div className="section-title" style={{ marginBottom: 10 }}>2. Pilih HR yang terlibat</div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>
              {eligibleHRs.map(hr => (
                <label key={hr.id}
                       style={{
                         display: 'flex', gap: 10, alignItems: 'center',
                         padding: '8px 12px',
                         border: '1px solid ' + (selectedHRs.includes(hr.id) ? 'var(--accent)' : 'var(--border)'),
                         background: selectedHRs.includes(hr.id) ? 'var(--accent-2)' : 'var(--surface)',
                         borderRadius: 8, cursor: 'pointer',
                       }}>
                  <input type="checkbox" checked={selectedHRs.includes(hr.id)} onChange={() => toggleHR(hr.id)}
                         style={{ accentColor: 'var(--accent)' }}/>
                  <HRAvatar hr={hr} size={26}/>
                  <div style={{ minWidth: 0, flex: 1 }}>
                    <div style={{ fontWeight: 700, fontSize: 13 }}>{hr.name}</div>
                    <div style={{ fontSize: 11, color: 'var(--muted)' }}>{hr.branch}</div>
                  </div>
                </label>
              ))}
            </div>
          </div>

          {/* Preview */}
          <div>
            <div className="section-title" style={{ marginBottom: 10 }}>3. Preview pembagian</div>
            <div style={{ border: '1px solid var(--border)', borderRadius: 9, background: 'var(--surface)' }}>
              {Object.entries(summary).map(([hrId, ct]) => {
                const hr = HR_USERS.find(h => h.id === hrId);
                return (
                  <div key={hrId} className="preview-row">
                    <HRAvatar hr={hr} size={22}/>
                    <div>
                      <div style={{ fontWeight: 700, fontSize: 13 }}>{hr.name}</div>
                      <div style={{ fontSize: 11, color: 'var(--muted)' }}>{hr.branch}</div>
                    </div>
                    <div className="ct">+{ct} kandidat</div>
                  </div>
                );
              })}
              {Object.keys(summary).length === 0 && (
                <div className="empty" style={{ padding: 20 }}>Pilih minimal 1 HR untuk melihat preview</div>
              )}
            </div>
          </div>

          <div className="ai-block">
            <div className="lbl"><Icon name="message" size={12}/>Notifikasi otomatis</div>
            <div className="body" style={{ fontSize: 12.5 }}>
              Setiap HR akan mendapat <b>notifikasi WhatsApp & dashboard</b> berisi daftar kandidat baru yang ditugaskan, lengkap dengan ringkasan AI dan link langsung ke profil.
            </div>
          </div>
        </div>

        <div className="modal-foot">
          <Btn onClick={onClose}>Batal</Btn>
          <Btn kind="accent" icon="check" onClick={() => onApply(assignments)} disabled={selectedHRs.length === 0}>
            Bagikan {assignments.length} kandidat
          </Btn>
        </div>
      </div>
    </div>
  );
}

// ====== FORM BUILDER ======
function FormBuilder({ job }) {
  const initial = [
    { type: 'short', q: 'Berapa tahun pengalaman Anda di posisi yang relevan?' },
    { type: 'mc',    q: 'Kapan Anda bisa mulai bekerja?', opts: ['Segera (immediate)', '2 minggu', '1 bulan', 'Lebih dari 1 bulan'] },
    { type: 'short', q: 'Berapa ekspektasi gaji bulanan Anda? (Rp)' },
    { type: 'mc',    q: 'Mana yang paling Anda kuasai? (pilih satu utama)', opts: ['Excel & Google Sheets', 'Notion / Airtable', 'Zendesk / Freshdesk', 'Tidak satupun'] },
    { type: 'essay', q: 'Ceritakan situasi tersulit yang pernah Anda tangani di pekerjaan terakhir.' },
  ];
  const [qs, setQs] = useState(initial);
  const [scoring, setScoring] = useState({ essayWeight: 35, passThreshold: 65, autoRejectBelow: 25 });
  const [saving, setSaving] = useState(false);
  const [saved, setSaved] = useState(false);
  const [sugg, setSugg] = useState([]);
  const [suggesting, setSuggesting] = useState(false);

  const askAI = async () => {
    setSuggesting(true);
    try {
      const r = await window.TalentirAPI.post('/api/jobs/' + job.id + '/suggest-questions', { existing: qs.map(q => q.q) });
      setSugg(r.questions || []);
    } catch (err) { console.error('Gagal meminta saran AI:', err); }
    setSuggesting(false);
  };
  const acceptSugg = (idx) => {
    const s = sugg[idx];
    if (s) setQs(prev => [...prev, s]);
    setSugg(prev => prev.filter((_, i) => i !== idx));
  };

  // Load saved assessment form from the backend (falls back to defaults).
  useEffect(() => {
    window.TalentirAPI.get('/api/jobs/' + job.id + '/config')
      .then(cfg => {
        if (cfg.assessmentForm?.questions) setQs(cfg.assessmentForm.questions);
        if (cfg.assessmentForm?.scoring) setScoring(cfg.assessmentForm.scoring);
      })
      .catch(err => console.error('Gagal memuat form:', err));
  }, [job.id]);

  const addQ = (type) => setQs([...qs, { type, q: 'Pertanyaan baru…', opts: type === 'mc' ? ['Opsi A', 'Opsi B'] : undefined }]);
  const removeQ = (i) => setQs(qs.filter((_, idx) => idx !== i));
  const updateQ = (i, patch) => setQs(qs.map((q, idx) => idx === i ? { ...q, ...patch } : q));

  const save = async () => {
    setSaving(true); setSaved(false);
    try {
      await window.TalentirAPI.put('/api/jobs/' + job.id + '/config', { assessmentForm: { questions: qs, scoring } });
      setSaved(true);
    } catch (err) { console.error('Gagal menyimpan form:', err); }
    setSaving(false);
  };

  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1.6fr 1fr', gap: 20, alignItems: 'start' }}>
      <div className="col-flex">
        <div className="row-flex" style={{ marginBottom: 6 }}>
          <strong>{qs.length} pertanyaan</strong>
          <span style={{ color: 'var(--muted)', fontSize: 12.5 }}>· Diestimasi AI: 5–7 menit untuk diselesaikan</span>
          <div style={{ flex: 1 }}/>
          <Btn size="sm" icon="sparkles" onClick={askAI} disabled={suggesting}>{suggesting ? 'Meminta…' : 'Saran AI'}</Btn>
          {saved && <span style={{ fontSize: 12, color: 'oklch(0.55 0.13 155)', fontWeight: 600 }}><Icon name="check" size={12} stroke={2.5}/> Tersimpan</span>}
          <Btn size="sm" kind="accent" icon="check" onClick={save} disabled={saving}>{saving ? 'Menyimpan…' : 'Simpan'}</Btn>
        </div>

        {qs.map((q, i) => (
          <div key={i} className="builder-q">
            <div className="head">
              <span className="grip"><Icon name="grip" size={14}/></span>
              <span className="num">Q{i+1}</span>
              <select className="select" value={q.type} onChange={(e) => updateQ(i, { type: e.target.value, opts: e.target.value === 'mc' ? (q.opts || ['Opsi A', 'Opsi B']) : undefined })} style={{ width: 160 }}>
                <option value="short">Jawaban singkat</option>
                <option value="essay">Esai panjang</option>
                <option value="mc">Pilihan ganda</option>
              </select>
              <div style={{ flex: 1 }}/>
              <button className="btn ghost sm" onClick={() => removeQ(i)}><Icon name="trash" size={13}/></button>
            </div>
            <input className="input" value={q.q} onChange={(e) => updateQ(i, { q: e.target.value })}/>
            {q.type === 'mc' && (
              <div className="col-flex" style={{ gap: 6, marginTop: 4 }}>
                {q.opts.map((o, j) => (
                  <div key={j} className="opt-row">
                    <span className="dot"/>
                    <input className="input" style={{ padding: '5px 9px', fontSize: 13 }} value={o}
                           onChange={(e) => { const opts = [...q.opts]; opts[j] = e.target.value; updateQ(i, { opts }); }}/>
                    <button className="btn ghost sm" onClick={() => updateQ(i, { opts: q.opts.filter((_, k) => k !== j) })}><Icon name="x" size={12}/></button>
                  </div>
                ))}
                <button className="btn ghost sm" style={{ alignSelf: 'flex-start', marginTop: 2 }}
                        onClick={() => updateQ(i, { opts: [...q.opts, 'Opsi baru'] })}>
                  <Icon name="plus" size={11}/> Tambah opsi
                </button>
              </div>
            )}
          </div>
        ))}

        <div className="row-flex" style={{ marginTop: 4 }}>
          <Btn size="sm" icon="plus" onClick={() => addQ('short')}>Jawaban singkat</Btn>
          <Btn size="sm" icon="plus" onClick={() => addQ('essay')}>Esai</Btn>
          <Btn size="sm" icon="plus" onClick={() => addQ('mc')}>Pilihan ganda</Btn>
        </div>
      </div>

      {/* Side panel */}
      <div className="col-flex">
        <div className="card card-pad">
          <div className="section-title" style={{ marginBottom: 12 }}>Pengaturan AI Scoring</div>
          <div className="col-flex" style={{ gap: 14 }}>
            <div className="row-flex" style={{ justifyContent: 'space-between' }}>
              <div>
                <div style={{ fontWeight: 600 }}>Bobot esai pada skor</div>
                <div style={{ fontSize: 11.5, color: 'var(--muted)' }}>AI menilai kedalaman jawaban esai</div>
              </div>
              <strong className="mono">{scoring.essayWeight}%</strong>
            </div>
            <div className="row-flex" style={{ justifyContent: 'space-between' }}>
              <div>
                <div style={{ fontWeight: 600 }}>Threshold lolos otomatis</div>
                <div style={{ fontSize: 11.5, color: 'var(--muted)' }}>Skor min. untuk dipindah ke "Disaring AI"</div>
              </div>
              <strong className="mono">{scoring.passThreshold}</strong>
            </div>
            <div className="row-flex" style={{ justifyContent: 'space-between' }}>
              <div>
                <div style={{ fontWeight: 600 }}>Auto-reject di bawah</div>
                <div style={{ fontSize: 11.5, color: 'var(--muted)' }}>Pesan penolakan halus dikirim otomatis</div>
              </div>
              <strong className="mono">{scoring.autoRejectBelow}</strong>
            </div>
          </div>
        </div>

        <div className="ai-block">
          <div className="lbl"><Icon name="sparkles" size={12}/>Saran AI</div>
          <div className="body" style={{ fontSize: 13 }}>
            {sugg.length === 0 ? (
              <>Untuk posisi <b>{job.title}</b>, AI bisa menyarankan pertanyaan tambahan yang relevan. Klik <b>Saran AI</b> di atas untuk membuatnya.</>
            ) : (
              <div className="col-flex" style={{ gap: 8 }}>
                {sugg.map((s, i) => (
                  <div key={i} style={{ padding: '8px 10px', background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 7 }}>
                    <div style={{ fontSize: 12.5, marginBottom: 6 }}><Badge>{s.type === 'mc' ? 'Pilihan ganda' : s.type === 'essay' ? 'Esai' : 'Singkat'}</Badge> {s.q}</div>
                    <Btn size="sm" kind="accent" icon="plus" onClick={() => acceptSugg(i)}>Tambahkan</Btn>
                  </div>
                ))}
              </div>
            )}
          </div>
        </div>
      </div>
    </div>
  );
}

// ====== Landing Settings ======
function LandingSettings({ job, go }) {
  // Real, reachable link served by the frontend at /lowongan/<id>-<slug>.
  const slug = job.title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
  const fullUrl = `${window.location.origin}/lowongan/${job.id}-${slug}`;
  const url = fullUrl.replace(/^https?:\/\//, '');
  const [copied, setCopied] = useState(false);
  const copyLink = async () => {
    try { await navigator.clipboard.writeText(fullUrl); setCopied(true); setTimeout(() => setCopied(false), 1500); }
    catch (e) { console.error('Gagal menyalin link:', e); }
  };
  const [landing, setLanding] = useState({ headline: `Kami mencari ${job.title}`, description: job.description || '', showSalary: true, allowWhatsAppApply: true });
  const [saving, setSaving] = useState(false);
  const [saved, setSaved] = useState(false);
  const setL = (k, v) => setLanding(s => ({ ...s, [k]: v }));

  useEffect(() => {
    window.TalentirAPI.get('/api/jobs/' + job.id + '/config')
      .then(cfg => { if (cfg.landing) setLanding(cfg.landing); })
      .catch(err => console.error('Gagal memuat landing:', err));
  }, [job.id]);

  const save = async () => {
    setSaving(true); setSaved(false);
    try {
      await window.TalentirAPI.put('/api/jobs/' + job.id + '/config', { landing });
      setSaved(true);
    } catch (err) { console.error('Gagal menyimpan landing:', err); }
    setSaving(false);
  };

  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 1.4fr', gap: 20 }}>
      <div className="col-flex">
        <div className="card card-pad">
          <div className="section-title" style={{ marginBottom: 12 }}>Link Publik</div>
          <div className="field">
            <div className="row-flex" style={{ background: 'var(--bg-soft)', border: '1px solid var(--border)', borderRadius: 7, padding: '8px 12px' }}>
              <Icon name="link" size={14}/>
              <a href={fullUrl} target="_blank" rel="noopener" className="mono" style={{ fontSize: 12.5, flex: 1, color: 'var(--ink-2)', textDecoration: 'none', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title="Buka di tab baru">{url}</a>
              <button className="btn ghost sm" onClick={copyLink}><Icon name={copied ? 'check' : 'copy'} size={12}/>{copied ? 'Tersalin' : 'Salin'}</button>
              <a className="btn ghost sm" href={fullUrl} target="_blank" rel="noopener"><Icon name="globe" size={12}/>Buka</a>
            </div>
            <span className="hint">Bagikan ke media sosial atau portal lowongan eksternal. Setiap submit otomatis masuk ke kanban.</span>
          </div>
        </div>

        <div className="card card-pad">
          <div className="section-title" style={{ marginBottom: 12 }}>Tampilan</div>
          <div className="col-flex" style={{ gap: 12 }}>
            <div className="field">
              <label>Headline halaman</label>
              <input className="input" value={landing.headline} onChange={(e) => setL('headline', e.target.value)}/>
            </div>
            <div className="field">
              <label>Deskripsi singkat (1 paragraf)</label>
              <textarea className="textarea" value={landing.description} onChange={(e) => setL('description', e.target.value)}/>
            </div>
            <div className="row-flex">
              <Toggle on={landing.showSalary} onChange={(v) => setL('showSalary', v)}/>
              <div>
                <div style={{ fontWeight: 600, fontSize: 13 }}>Tampilkan range gaji</div>
                <div style={{ fontSize: 11.5, color: 'var(--muted)' }}>{job.salary}</div>
              </div>
            </div>
            <div className="row-flex" style={{ justifyContent: 'flex-end' }}>
              {saved && <span style={{ fontSize: 12, color: 'oklch(0.55 0.13 155)', fontWeight: 600 }}><Icon name="check" size={12} stroke={2.5}/> Tersimpan</span>}
              <Btn size="sm" kind="accent" icon="check" onClick={save} disabled={saving}>{saving ? 'Menyimpan…' : 'Simpan tampilan'}</Btn>
            </div>
          </div>
        </div>

        <div className="card card-pad">
          <div className="section-title" style={{ marginBottom: 10 }}>Landing Page Assessment Khusus</div>
          <div style={{ fontSize: 12.5, color: 'var(--ink-2)', marginBottom: 10 }}>
            Halaman ringkas untuk kandidat dari job portal eksternal — fokus pada form assessment, tanpa deskripsi pekerjaan panjang.
          </div>
          <div className="row-flex" style={{ background: 'var(--bg-soft)', border: '1px solid var(--border)', borderRadius: 7, padding: '8px 12px' }}>
            <Icon name="link" size={14}/>
            <span className="mono" style={{ fontSize: 12, flex: 1, color: 'var(--ink-2)' }}>{url}/assess</span>
            <button className="btn ghost sm"><Icon name="copy" size={12}/></button>
          </div>
        </div>
      </div>

      {/* Preview */}
      <div>
        <div className="row-flex" style={{ marginBottom: 10, justifyContent: 'space-between' }}>
          <div className="section-title">Preview Landing</div>
          <Btn size="sm" icon="eye" onClick={() => go({ view: 'public', jobId: job.id })}>Buka halaman</Btn>
        </div>
        <div className="preview-frame">
          <div className="preview-bar">
            <div className="dot"/><div className="dot"/><div className="dot"/>
            <div className="url">{url}</div>
          </div>
          <div className="preview-canvas" style={{ maxHeight: 540, overflow: 'hidden' }}>
            <div style={{ transform: 'scale(0.78)', transformOrigin: 'top left', width: '128%' }}>
              <LandingContent job={job} compact/>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ====== WA Bot settings ======
function WASettings({ job, go, reloadData }) {
  const { WA_NUMBERS, HR_USERS } = window.TalentirData;
  const [enabled, setEnabled] = useState(job.wa);
  const linkedNumber = WA_NUMBERS.find(n => n.assignedJobs.includes(job.id)) || WA_NUMBERS[0] || null;
  const [selectedNumberId, setSelectedNumberId] = useState(linkedNumber?.id || '');
  const [saving, setSaving] = useState(false);
  const [saved, setSaved] = useState(false);
  const [triggers, setTriggers] = useState([
    { label: 'Kandidat baru mendaftar', desc: 'Kirim ucapan terima kasih + link assessment', on: true },
    { label: 'Tidak ada respon 24 jam', desc: 'Kirim reminder ringan', on: true },
    { label: 'Skor AI ≥ 75', desc: 'Tawarkan slot wawancara live', on: true },
    { label: 'Skor AI < 25', desc: 'Kirim pesan penolakan halus', on: true },
  ]);
  const sel = WA_NUMBERS.find(n => n.id === selectedNumberId);
  const selHR = HR_USERS.find(h => h.id === sel?.assignedHR);

  useEffect(() => {
    window.TalentirAPI.get('/api/jobs/' + job.id + '/config')
      .then(cfg => { if (cfg.waTriggers) setTriggers(cfg.waTriggers); })
      .catch(err => console.error('Gagal memuat trigger WA:', err));
  }, [job.id]);

  const save = async () => {
    setSaving(true); setSaved(false);
    try {
      await window.TalentirAPI.patch('/api/jobs/' + job.id, { waBotEnabled: enabled, waNumberId: selectedNumberId });
      await window.TalentirAPI.put('/api/jobs/' + job.id + '/config', { waTriggers: triggers });
      if (reloadData) await reloadData();
      setSaved(true);
    } catch (err) { console.error('Gagal menyimpan pengaturan WA:', err); }
    setSaving(false);
  };

  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 20 }}>
      <div className="col-flex">
        <div className="card card-pad">
          <div className="row-flex">
            <Toggle on={enabled} onChange={setEnabled}/>
            <div>
              <div style={{ fontWeight: 700 }}>WhatsApp AI Bot {enabled ? 'aktif' : 'nonaktif'}</div>
              <div style={{ fontSize: 12, color: 'var(--muted)' }}>Bot menghubungi kandidat, menggali jawaban, dan menilai otomatis.</div>
            </div>
          </div>
          <div className="divider"/>
          <div className="field">
            <label>Nomor pengirim untuk lowongan ini</label>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
              {WA_NUMBERS.map(n => {
                const hr = HR_USERS.find(h => h.id === n.assignedHR);
                return (
                  <label key={n.id}
                         style={{
                           display: 'flex', gap: 12, alignItems: 'center',
                           padding: '10px 12px',
                           border: '1px solid ' + (selectedNumberId === n.id ? 'var(--ink)' : 'var(--border)'),
                           background: selectedNumberId === n.id ? 'var(--bg-soft)' : 'var(--surface)',
                           borderRadius: 8, cursor: n.status === 'online' ? 'pointer' : 'not-allowed',
                           opacity: n.status === 'online' ? 1 : 0.55,
                         }}>
                    <input type="radio" name="wanum" checked={selectedNumberId === n.id}
                           onChange={() => n.status === 'online' && setSelectedNumberId(n.id)}
                           disabled={n.status !== 'online'}
                           style={{ accentColor: 'var(--ink)' }}/>
                    <span className={'wa-status-dot ' + n.status}/>
                    <div style={{ flex: 1, minWidth: 0 }}>
                      <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
                        <strong style={{ fontSize: 13 }}>{n.label}</strong>
                        {n.isDefault && <Badge>Default</Badge>}
                      </div>
                      <div className="mono" style={{ fontSize: 11.5, color: 'var(--muted)' }}>{n.phone} · {n.msgToday}/{n.rateLimit.limit} pesan hari ini</div>
                    </div>
                    {hr && <HRAvatar hr={hr} size={22}/>}
                  </label>
                );
              })}
            </div>
            <span className="hint">Tidak online? <a style={{ color: 'var(--accent)', fontWeight: 600, cursor: 'pointer' }} onClick={() => go({ view: 'whatsapp' })}>Reconnect di halaman WhatsApp Bot →</a></span>
          </div>

          <div className="row-flex" style={{ justifyContent: 'flex-end', marginTop: 4 }}>
            {saved && <span style={{ fontSize: 12.5, color: 'oklch(0.55 0.13 155)', fontWeight: 600 }}><Icon name="check" size={12} stroke={2.5}/> Tersimpan</span>}
            <Btn kind="accent" icon="check" onClick={save} disabled={saving}>{saving ? 'Menyimpan…' : 'Simpan pengaturan'}</Btn>
          </div>

          <div className="divider"/>
          <div className="field">
            <label>Trigger otomatis</label>
            <div className="col-flex" style={{ gap: 8, fontSize: 13 }}>
              {triggers.map((tr, i) => (
                <div key={i} className="row-flex" style={{ padding: 8, border: '1px solid var(--border)', borderRadius: 7 }}>
                  <Toggle on={tr.on} onChange={(v) => setTriggers(ts => ts.map((x, idx) => idx === i ? { ...x, on: v } : x))}/>
                  <div>
                    <div style={{ fontWeight: 600 }}>{tr.label}</div>
                    <div style={{ fontSize: 11.5, color: 'var(--muted)' }}>{tr.desc}</div>
                  </div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
      <div className="col-flex">
        <div className="card card-pad">
          <div className="section-title" style={{ marginBottom: 10 }}>Nomor terpilih: {sel.label}</div>
          {selHR && (
            <div className="row-flex" style={{ marginBottom: 12, padding: 10, background: 'var(--bg-soft)', borderRadius: 7 }}>
              <HRAvatar hr={selHR} size={26}/>
              <div>
                <div style={{ fontWeight: 700, fontSize: 13 }}>{selHR.name}</div>
                <div style={{ fontSize: 11, color: 'var(--muted)' }}>HR pengelola · {selHR.branch}</div>
              </div>
            </div>
          )}
          <div className="section-title" style={{ marginBottom: 10 }}>Skrip Interview AI</div>
          <div style={{ fontSize: 12.5, color: 'var(--muted)', marginBottom: 10 }}>5 pertanyaan utama yang akan ditanyakan bot.</div>
          <ol style={{ paddingLeft: 18, margin: 0, color: 'var(--ink-2)', fontSize: 13, lineHeight: 1.7 }}>
            <li>Pengalaman terakhir di posisi mirip {job.title}.</li>
            <li>Studi kasus situasional sesuai requirement utama.</li>
            <li>Tools / metode yang paling sering digunakan.</li>
            <li>Pendekatan saat menghadapi konflik / tekanan.</li>
            <li>Ekspektasi mulai kerja & gaji.</li>
          </ol>
          <div className="divider"/>
          <Btn size="sm" icon="pencil">Edit skrip</Btn>
        </div>
        <div className="ai-block">
          <div className="lbl"><Icon name="sparkles" size={12}/>Strategi multi-nomor</div>
          <div className="body" style={{ fontSize: 12.5 }}>
            Untuk operasional <b>F&B multi-cabang</b>, satu lowongan boleh pakai 1 nomor utama. Tapi jika 1 lowongan menjangkau &gt; 200 kandidat/hari, sebaiknya distribusikan antar 2-3 nomor untuk hindari rate-limit WhatsApp.
            <div style={{ marginTop: 8 }}>
              <Btn size="sm" kind="accent" icon="message" onClick={() => go({ view: 'whatsapp' })}>Atur load balancing →</Btn>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ====== NEW JOB ======
function NewJobView({ go, reloadData }) {
  const [step, setStep] = useState(1);
  const [form, setForm] = useState({ title: '', dept: '', type: 'Full-time', workSystem: 'onsite', country: 'Indonesia', officeAddress: '', salaryMin: '', salaryMax: '', description: '' });
  const [reqs, setReqs] = useState(['']);
  const [benefits, setBenefits] = useState([]);
  const [benefitDraft, setBenefitDraft] = useState('');
  const POPULAR_BENEFITS = ['Tunjangan Hari Raya', 'Jenjang Karir', 'Uang Makan', 'Uang Transport', 'Bonus Kinerja', 'Pelatihan/Sertifikasi', 'BPJS Kesehatan', 'BPJS Tenaga Kerja', 'Komisi Penjualan', 'Asuransi Kesehatan'];
  const addBenefit = (b) => { const v = (b || '').trim(); if (v && benefits.length < 10 && !benefits.includes(v)) setBenefits(bs => [...bs, v]); setBenefitDraft(''); };
  const removeBenefit = (b) => setBenefits(bs => bs.filter(x => x !== b));
  const [waBot, setWaBot] = useState(true);
  const [saving, setSaving] = useState(false);
  const f = (k) => (e) => setForm(s => ({ ...s, [k]: e.target.value }));

  const DEPARTEMEN = ['Operasional', 'Marketing', 'HRD', 'FAT'];
  // Format a digit string with Indonesian thousand separators ("5000000" → "5.000.000").
  const fmtNum = (v) => { const d = String(v).replace(/\D/g, ''); return d ? Number(d).toLocaleString('id-ID') : ''; };
  const setSalary = (k) => (e) => setForm(s => ({ ...s, [k]: e.target.value.replace(/\D/g, '') }));
  const setReq = (i, v) => setReqs(rs => rs.map((r, idx) => idx === i ? v : r));
  const addReq = () => setReqs(rs => [...rs, '']);
  const removeReq = (i) => setReqs(rs => rs.length > 1 ? rs.filter((_, idx) => idx !== i) : rs);

  const [genDesc, setGenDesc] = useState(false);
  const generateDesc = async () => {
    setGenDesc(true);
    try {
      const r = await window.TalentirAPI.post('/api/jobs/generate-description', {
        title: form.title, dept: form.dept, type: form.type, loc: form.officeAddress,
        requirements: reqs.map(s => s.trim()).filter(Boolean),
      });
      if (r.description) setForm(s => ({ ...s, description: r.description }));
    } catch (err) { console.error('Gagal generate deskripsi:', err); }
    setGenDesc(false);
  };

  const publish = async () => {
    setSaving(true);
    const { salaryMin, salaryMax } = form;
    const salary = salaryMin && salaryMax ? `Rp ${fmtNum(salaryMin)} — ${fmtNum(salaryMax)}`
      : salaryMin ? `Rp ${fmtNum(salaryMin)}` : salaryMax ? `Rp ${fmtNum(salaryMax)}` : '';
    try {
      await window.TalentirAPI.post('/api/jobs', {
        title: form.title.trim() || 'Posisi Baru',
        dept: form.dept, type: form.type, salary,
        workSystem: form.workSystem, country: form.country, officeAddress: form.officeAddress,
        benefits,
        description: form.description,
        requirements: reqs.map(s => s.trim()).filter(Boolean),
        waBotEnabled: waBot,
      });
      if (reloadData) await reloadData();
      go({ view: 'jobs' });
    } catch (err) {
      console.error('Gagal membuat lowongan:', err);
      setSaving(false);
    }
  };

  return (
    <div className="view">
      <button className="btn ghost sm" onClick={() => go({ view: 'jobs' })} style={{ marginBottom: 12 }}>
        <Icon name="arrowL" size={12}/> Batalkan
      </button>
      <div className="view-head">
        <div>
          <div className="title">Buat Posisi Baru</div>
          <div className="subtitle">3 langkah singkat — landing page, form assessment & WA bot akan otomatis disiapkan.</div>
        </div>
      </div>

      <div style={{ display: 'flex', gap: 10, marginBottom: 18 }}>
        {[1,2,3].map(n => (
          <div key={n} style={{ flex: 1, padding: 10, border: '1px solid var(--border)', borderRadius: 8, display: 'flex', gap: 10, alignItems: 'center', background: step === n ? 'var(--surface)' : 'transparent' }}>
            <div style={{ width: 24, height: 24, borderRadius: 99, background: step >= n ? 'var(--ink)' : 'var(--surface-2)', color: step >= n ? 'var(--bg)' : 'var(--muted)', display: 'grid', placeItems: 'center', fontWeight: 700, fontSize: 12 }}>{n}</div>
            <div>
              <div style={{ fontSize: 11, color: 'var(--muted)', textTransform: 'uppercase', letterSpacing: '0.08em', fontWeight: 700 }}>Langkah {n}</div>
              <div style={{ fontWeight: 700, fontSize: 13 }}>{n === 1 ? 'Detail Posisi' : n === 2 ? 'Form Assessment' : 'Publikasi'}</div>
            </div>
          </div>
        ))}
      </div>

      <div className="card card-pad" style={{ maxWidth: 720 }}>
        {step === 1 && (
          <div className="col-flex" style={{ gap: 14 }}>
            <div className="field"><label>Judul posisi</label><input className="input" placeholder="Contoh: Staff Admin Operasional" value={form.title} onChange={f('title')}/></div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>
              <div className="field"><label>Departemen</label>
                <select className="select" value={form.dept} onChange={f('dept')}>
                  <option value="">Pilih departemen…</option>
                  {DEPARTEMEN.map(d => <option key={d} value={d}>{d}</option>)}
                </select>
              </div>
              <div className="field"><label>Tipe</label>
                <select className="select" value={form.type} onChange={f('type')}><option>Full-time</option><option>Part-time</option><option>Kontrak</option><option>Magang</option></select>
              </div>
            </div>

            {/* Lokasi */}
            <div className="field" style={{ border: '1px solid var(--border)', borderRadius: 10, padding: 14 }}>
              <label style={{ fontWeight: 700 }}>Lokasi</label>
              <div style={{ fontSize: 11.5, color: 'var(--muted)', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.06em', margin: '8px 0 6px' }}>Sistem Kerja</div>
              <div className="row-flex" style={{ gap: 18, flexWrap: 'wrap' }}>
                {[['onsite', 'Di Kantor'], ['remote', 'Remote/Dari Rumah'], ['hybrid', 'Hybrid']].map(([v, lbl]) => (
                  <label key={v} className="row-flex" style={{ gap: 6, cursor: 'pointer' }}>
                    <input type="radio" name="worksys" checked={form.workSystem === v} onChange={() => setForm(s => ({ ...s, workSystem: v }))} style={{ accentColor: 'var(--accent)' }}/>
                    <span style={{ fontSize: 13 }}>{lbl}</span>
                  </label>
                ))}
              </div>
              <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginTop: 12 }}>
                <div className="field" style={{ margin: 0 }}><label>Negara</label><input className="input" value={form.country} onChange={f('country')} placeholder="Indonesia"/></div>
                <div className="field" style={{ margin: 0 }}>
                  <label>Alamat Kantor {form.workSystem === 'remote' && <span style={{ color: 'var(--muted)', fontWeight: 500 }}>(opsional)</span>}</label>
                  <input className="input" value={form.officeAddress} onChange={f('officeAddress')} placeholder="Mis. Tapos, Depok, Jabodetabek"/>
                </div>
              </div>
            </div>

            {/* Range gaji */}
            <div className="field"><label>Range gaji (per bulan)</label>
              <div className="row-flex" style={{ gap: 6, maxWidth: 380 }}>
                {['salaryMin', 'salaryMax'].map((k, idx) => (
                  <React.Fragment key={k}>
                    {idx === 1 && <span style={{ color: 'var(--muted)' }}>—</span>}
                    <div className="row-flex" style={{ gap: 4, flex: 1, border: '1px solid var(--border)', borderRadius: 8, padding: '0 8px', background: 'var(--surface)' }}>
                      <span style={{ color: 'var(--muted)', fontSize: 12.5 }}>Rp</span>
                      <input style={{ border: 0, outline: 0, background: 'transparent', flex: 1, minWidth: 0, fontSize: 13, padding: '8px 0' }}
                             inputMode="numeric" placeholder={idx === 0 ? '5.000.000' : '7.000.000'}
                             value={fmtNum(form[k])} onChange={setSalary(k)}/>
                    </div>
                  </React.Fragment>
                ))}
              </div>
            </div>
            <div className="field">
              <div className="row-flex" style={{ justifyContent: 'space-between', marginBottom: 4 }}>
                <label style={{ margin: 0 }}>Deskripsi singkat</label>
                <button className="btn ghost sm" onClick={generateDesc} disabled={genDesc || !form.title.trim()}
                        title={!form.title.trim() ? 'Isi judul posisi dulu' : 'Buat draf deskripsi dengan AI'}>
                  <Icon name="sparkles" size={12}/>{genDesc ? 'Menyusun…' : 'Generate AI'}
                </button>
              </div>
              <textarea className="textarea" placeholder="2–4 kalimat tentang scope pekerjaan. Atau klik “Generate AI”." value={form.description} onChange={f('description')}/>
            </div>
            <div className="field">
              <label>Kriteria utama <span style={{ color: 'var(--muted)', fontWeight: 500 }}>— 1 per baris, AI akan pakai ini untuk scoring</span></label>
              <div className="col-flex" style={{ gap: 6 }}>
                {reqs.map((r, i) => (
                  <div key={i} className="row-flex" style={{ gap: 6 }}>
                    <input className="input" style={{ flex: 1 }}
                           placeholder={['Min. D3', 'Pengalaman 1+ tahun admin', 'Mahir Excel'][i] || 'Kriteria lainnya…'}
                           value={r} onChange={e => setReq(i, e.target.value)}/>
                    <button className="btn ghost sm" style={{ padding: 7 }} onClick={() => removeReq(i)} disabled={reqs.length === 1} title="Hapus baris"><Icon name="x" size={13}/></button>
                  </div>
                ))}
                <button className="btn ghost sm" style={{ alignSelf: 'flex-start' }} onClick={addReq}><Icon name="plus" size={12}/> Tambah kriteria</button>
              </div>
            </div>

            {/* Benefit & Fasilitas Kerja */}
            <div className="field">
              <label>Benefit & Fasilitas Kerja <span style={{ color: 'var(--muted)', fontWeight: 500 }}>— maks. 10</span></label>
              <div className="row-flex" style={{ gap: 6, flexWrap: 'wrap', border: '1px solid var(--border)', borderRadius: 8, padding: 8, background: 'var(--surface)', minHeight: 40 }}>
                {benefits.map(b => (
                  <span key={b} className="badge" style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>
                    {b}<button className="btn ghost" style={{ padding: 0, lineHeight: 1, height: 'auto' }} onClick={() => removeBenefit(b)}><Icon name="x" size={11}/></button>
                  </span>
                ))}
                {benefits.length < 10 && (
                  <input style={{ border: 0, outline: 0, background: 'transparent', flex: 1, minWidth: 130, fontSize: 13 }}
                         placeholder={benefits.length ? 'Tambah lagi…' : 'Ketik benefit lalu tekan Enter…'}
                         value={benefitDraft} onChange={e => setBenefitDraft(e.target.value)}
                         onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); addBenefit(benefitDraft); } }}/>
                )}
              </div>
              <div style={{ marginTop: 10 }}>
                <div style={{ fontSize: 11.5, color: 'var(--muted)', fontWeight: 700, marginBottom: 6 }}>Terpopuler</div>
                <div className="row-flex" style={{ gap: 6, flexWrap: 'wrap' }}>
                  {POPULAR_BENEFITS.filter(b => !benefits.includes(b)).map(b => (
                    <button key={b} className="btn ghost sm" onClick={() => addBenefit(b)} disabled={benefits.length >= 10}>{b} <Icon name="plus" size={11}/></button>
                  ))}
                </div>
              </div>
            </div>
            <div className="row-flex" style={{ justifyContent: 'flex-end' }}>
              <Btn kind="primary" icon="arrow" onClick={() => setStep(2)} disabled={!form.title.trim()}>Lanjut</Btn>
            </div>
          </div>
        )}
        {step === 2 && (
          <div className="col-flex" style={{ gap: 14 }}>
            <div className="ai-block">
              <div className="lbl"><Icon name="sparkles" size={12}/>AI Suggestion</div>
              <div className="body">Berdasarkan judul & kriteria yang Anda masukkan, AI sudah menyiapkan <b>5 pertanyaan default</b>. Anda bisa mengubahnya di tahap setelah publikasi.</div>
            </div>
            <div className="row-flex" style={{ justifyContent: 'space-between' }}>
              <button className="btn ghost sm" onClick={() => setStep(1)}><Icon name="arrowL" size={12}/>Kembali</button>
              <Btn kind="primary" icon="arrow" onClick={() => setStep(3)}>Gunakan default, lanjut</Btn>
            </div>
          </div>
        )}
        {step === 3 && (
          <div className="col-flex" style={{ gap: 14 }}>
            <div className="row-flex">
              <Toggle on={waBot} onChange={setWaBot}/>
              <div>
                <div style={{ fontWeight: 700 }}>Aktifkan WhatsApp AI Bot</div>
                <div style={{ fontSize: 12, color: 'var(--muted)' }}>Bot otomatis menghubungi & menyaring kandidat.</div>
              </div>
            </div>
            <div className="row-flex">
              <Toggle on={true} onChange={()=>{}}/>
              <div>
                <div style={{ fontWeight: 700 }}>Buat Landing Page Assessment Khusus</div>
                <div style={{ fontSize: 12, color: 'var(--muted)' }}>Untuk kandidat dari job portal eksternal.</div>
              </div>
            </div>
            <div className="row-flex" style={{ justifyContent: 'space-between' }}>
              <button className="btn ghost sm" onClick={() => setStep(2)} disabled={saving}><Icon name="arrowL" size={12}/>Kembali</button>
              <Btn kind="accent" icon="check" onClick={publish} disabled={saving}>{saving ? 'Menerbitkan…' : 'Terbitkan Sekarang'}</Btn>
            </div>
          </div>
        )}
      </div>
    </div>
  );
}

window.JobsView = JobsView;
