// namecard.jsx — Chữ ký email dạng NAMECARD + QR vCard.
// QR THẬT (qrcode-generator CDN) mã hoá vCard 3.0 (UTF-8) → quét bằng camera lưu thẳng danh bạ.
// Quản lý trong Hồ sơ user (Cài đặt) + chèn ở trình soạn email. Lưu per-account ở localStorage
// (key theo user id) — đồng bộ DB (profiles.meta) là follow-up. Tái dùng docCompany (branding).

const NAMECARD_ACCENTS = [
  { id:'brand', label:{ vi:'Xanh thương hiệu', en:'Brand blue' }, color:'#1466E0' },
  { id:'cyan',  label:{ vi:'Cyan', en:'Cyan' },                   color:'#12C5C0' },
  { id:'navy',  label:{ vi:'Navy', en:'Navy' },                   color:'#0A1730' },
];
function accentColor(id){ const a = NAMECARD_ACCENTS.find(x => x.id === id); return a ? a.color : NAMECARD_ACCENTS[0].color; }

// Giá trị mặc định namecard suy từ hồ sơ user + thông tin công ty trên chứng từ (branding).
function defaultNamecard(me, branding){
  const co = window.docCompany ? docCompany(branding) : {};
  return {
    name:(me && me.name) || '', title:(me && me.title) || '', dept:(me && me.dept) || '',
    phone:co.phone || '', mobile:'', email:(me && me.email) || '', accent:'brand', greeting:'Trân trọng,',
  };
}
function mergeNamecard(saved, me, branding){ return Object.assign(defaultNamecard(me, branding), saved || {}); }

/* ---- lưu/đọc per-account (localStorage; key theo user id) ---- */
function namecardKey(me){ return 'swo-portal-namecard-' + ((me && (me.id || me.email)) || 'me'); }
function loadNamecard(me, branding){
  // Ưu tiên DB (profiles.meta.namecard, đồng bộ đa máy) → cache localStorage → mặc định từ hồ sơ.
  let saved = (me && me.meta && me.meta.namecard) || null;
  if (!saved) { try { saved = JSON.parse(localStorage.getItem(namecardKey(me)) || 'null'); } catch (e) {} }
  return mergeNamecard(saved, me, branding);
}
function saveNamecard(me, card){ try { localStorage.setItem(namecardKey(me), JSON.stringify(card)); } catch (e) {} }

/* ---- vCard 3.0 (UTF-8) ---- */
// c = thông tin cá nhân; co = thông tin TỔ CHỨC (lấy từ thiết lập công ty: name/web/addr).
// opts.lean = bỏ TITLE + ADR (cho QR) → ít byte → QR thưa module hơn, quét tốt ở cỡ nhỏ. Mặc định đầy đủ (cho .vcf).
function buildVCard(c, co, opts){
  co = co || {}; opts = opts || {};
  const esc = (s) => String(s == null ? '' : s).replace(/\\/g, '\\\\').replace(/\n/g, '\\n').replace(/,/g, '\\,').replace(/;/g, '\\;');
  const L = ['BEGIN:VCARD', 'VERSION:3.0'];
  L.push('N;CHARSET=UTF-8:' + esc(c.name) + ';;;;');
  L.push('FN;CHARSET=UTF-8:' + esc(c.name));
  if (co.name) L.push('ORG;CHARSET=UTF-8:' + esc(co.name));
  if (!opts.lean && (c.title || c.dept)) L.push('TITLE;CHARSET=UTF-8:' + esc([c.title, c.dept].filter(Boolean).join(' · ')));
  if (c.phone) L.push('TEL;TYPE=WORK,VOICE:' + esc(c.phone));
  if (c.mobile) L.push('TEL;TYPE=CELL:' + esc(c.mobile));
  if (c.email) L.push('EMAIL;TYPE=WORK:' + esc(c.email));
  if (co.web) L.push('URL:' + (/^https?:/i.test(co.web) ? co.web : 'https://' + co.web));
  if (!opts.lean && co.addr) L.push('ADR;TYPE=WORK;CHARSET=UTF-8:;;' + esc(co.addr) + ';;;;');
  L.push('END:VCARD');
  return L.join('\r\n');
}

/* ---- QR vCard → { url, size } để hiển thị 1:1 (KHÔNG thu nhỏ). null nếu lib chưa tải → caller fallback.
   LƯU Ý quét được: QR vCard tiếng Việt khá DÀY module; nếu ép hiển thị nhỏ (vd 96px = thu nhỏ ảnh) thì
   KHÔNG quét được. Sinh ở cell 2px + vùng yên (quiet zone) 4 module, rồi hiển thị đúng `size` px (1:1). ---- */
function qrSig(text){
  if (!window.qrcode) return null;
  try {
    const qr = window.qrcode(0, 'M');
    qr.addData(unescape(encodeURIComponent(text)), 'Byte');   // mỗi ký tự = 1 byte UTF-8
    qr.make();
    const cell = 2, quiet = 4, margin = cell * quiet;
    return { url: qr.createDataURL(cell, margin), size: qr.getModuleCount() * cell + margin * 2 };
  } catch (e) { console.warn('[qrSig]', e && e.message); return null; }
}

/* ---- HTML namecard email-safe (nested tables, inline style, KHÔNG flex/emoji) dùng CHUNG cho xem trước + chèn email ----
   Bố cục: lời chào → kẻ mảnh → [QR trái · Tên|Chức danh + dòng M/E/W là link] → kẻ phân cách → [Công ty + slogan · logo phải].
   Chữ HOA đặt sẵn trong JS (toUpperCase) để chắc ăn trên Outlook (không hỗ trợ text-transform). */
function namecardEmailHTML(c, branding){
  const co = window.docCompany ? docCompany(branding) : {};
  const company = co.name || (branding && branding.name) || 'S.W.O';
  const tagline = co.tagline || '';
  const accent = accentColor(c.accent);
  const qrObj = window.qrSig ? qrSig(buildVCard(c, co, { lean:true })) : null;   // lean vCard + hiển thị 1:1 → quét được
  const qrPx = qrObj ? qrObj.size : 120;
  const esc = (s) => String(s == null ? '' : s).replace(/[&<>]/g, m => ({ '&':'&amp;', '<':'&lt;', '>':'&gt;' }[m]));
  // Làm nổi (in đậm) 3 chữ S·W·O — viết tắt logo — ở đầu Smart/Works/Optimal trong slogan. Nhận chuỗi ĐÃ escape.
  const emphSWO = (s) => s.replace(/\b(Smart|Works|Optimal)\b/g, w => '<b style="font-weight:700">' + w[0] + '</b>' + w.slice(1));
  const hair = '#E3E6EC';
  const greeting = c.greeting || '';
  const webUrl = co.web ? (/^https?:/i.test(co.web) ? co.web : 'https://' + co.web) : '';
  const mobile = c.mobile || c.phone || '';
  const office = (c.mobile && c.phone) ? c.phone : '';   // chỉ hiện số bàn nếu khác di động
  const link = (href, text) => '<a href="' + href + '" style="color:' + accent + ';text-decoration:underline">' + esc(text) + '</a>';
  const crow = (lbl, inner) => inner ? '<tr><td style="padding:2px 9px 2px 0;font-size:12px;font-weight:700;color:#0A1730;white-space:nowrap;vertical-align:top">' + lbl + '</td><td style="padding:2px 0;font-size:12.5px;color:#54657F">' + inner + '</td></tr>' : '';
  const titleStr = [c.title, c.dept].filter(Boolean).join(' · ');
  const nameDisp = c.name ? esc(String(c.name).toUpperCase()) : '—';
  const nameLine = '<span style="font-weight:800;font-size:15px;color:#0A1730;letter-spacing:.2px">' + nameDisp + '</span>'
    + (titleStr ? ' <span style="color:#C2CAD6;font-weight:400">|</span> <span style="font-weight:600;font-size:12.5px;color:#0A1730">' + esc(titleStr) + '</span>' : '');
  const logoImg = co.logo ? '<img src="' + co.logo + '" height="38" style="height:38px;max-width:220px;display:inline-block" alt="' + esc(company) + '">' : '';
  const qrCell = qrObj
    ? '<img src="' + qrObj.url + '" width="' + qrPx + '" height="' + qrPx + '" alt="vCard QR" style="display:block;border:1px solid ' + hair + '">'
    : '<div style="width:120px;height:120px;background:#F1F4F9;border:1px solid ' + hair + '"></div>';
  const lineRow = '<tr><td style="border-bottom:1px solid ' + hair + ';font-size:1px;line-height:1px;height:1px">&nbsp;</td></tr>';

  return '<table cellpadding="0" cellspacing="0" border="0" style="border-collapse:collapse;font-family:\'Be Vietnam Pro\',Arial,Helvetica,sans-serif;max-width:560px;color:#0A1730">'
    + (greeting ? '<tr><td style="font-size:13px;color:#54657F;padding:0 0 8px">' + esc(greeting) + '</td></tr>' + lineRow : '')
    + '<tr><td style="padding:12px 0">'
    +   '<table cellpadding="0" cellspacing="0" border="0" width="100%" style="border-collapse:collapse"><tr>'
    +     '<td valign="top" width="' + qrPx + '" style="width:' + qrPx + 'px;padding-right:16px">' + qrCell + '</td>'
    +     '<td valign="top">'
    +       '<div style="margin-bottom:7px;line-height:1.35">' + nameLine + '</div>'
    +       '<table cellpadding="0" cellspacing="0" border="0">'
    +         crow('M :', mobile ? link('tel:' + String(mobile).replace(/[^0-9+]/g, ''), mobile) : '')
    +         crow('T :', office ? link('tel:' + String(office).replace(/[^0-9+]/g, ''), office) : '')
    +         crow('E :', c.email ? link('mailto:' + c.email, c.email) : '')
    +         crow('W :', webUrl ? link(webUrl, co.web) : '')
    +       '</table>'
    +     '</td>'
    +   '</tr></table>'
    + '</td></tr>'
    + lineRow
    + '<tr><td style="padding:9px 0 0">'
    +   '<table cellpadding="0" cellspacing="0" border="0" width="100%" style="border-collapse:collapse"><tr>'
    +     '<td valign="middle">'
    +       '<div style="font-weight:800;font-size:13px;color:#0A1730;letter-spacing:.3px">' + esc(String(company).toUpperCase()) + '</div>'
    +       (tagline ? '<div style="font-size:11px;color:#98A2B3">' + emphSWO(esc(tagline)) + '</div>' : '')
    +     '</td>'
    +     '<td valign="middle" align="right">' + logoImg + '</td>'
    +   '</tr></table>'
    + '</td></tr>'
    + '</table>';
}

/* ---- Khung xem trước (render HTML chung) ---- */
function SignatureCard({ card, branding }){
  const html = React.useMemo(() => namecardEmailHTML(card, branding), [card, branding]);
  // Nền preview LUÔN trắng (giống email người nhận thấy) — cố định màu, không theo theme sáng/tối.
  return <div style={{ background:'#fff', color:'#0A1730', border:'1px solid #E3E6EC', borderRadius:'var(--r-md)', padding:16, overflowX:'auto' }}>
    <div dangerouslySetInnerHTML={{ __html:html }} />
  </div>;
}

/* ---- Trình quản lý namecard (đặt trong Hồ sơ user + Cài đặt Email) ---- */
function NamecardEditor(){
  const p = usePortal();
  const { tt, lang } = useLang();
  const toast = useToast();
  const me = p.me || {};
  const [c, setC] = React.useState(() => loadNamecard(me, p.branding));
  const set = (k, v) => setC(s => ({ ...s, [k]:v }));
  const co = window.docCompany ? docCompany(p.branding) : {};
  const L = (vi, en) => lang === 'vi' ? vi : en;
  const roleLabel = { admin:L('Quản trị viên', 'Admin'), manager:L('Quản lý', 'Manager'), staff:L('Nhân viên', 'Staff') }[p.role] || p.role;

  const onSave = () => { if (p.saveMyNamecard) p.saveMyNamecard(c); else saveNamecard(me, c); toast(L('Đã lưu chữ ký namecard (đồng bộ tài khoản)', 'Namecard signature saved (synced)'), 'success'); };
  const onReset = () => setC(defaultNamecard(me, p.branding));
  const onCopy = () => {
    const html = namecardEmailHTML(c, p.branding);
    if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(html).then(() => toast(L('Đã sao chép HTML chữ ký', 'Signature HTML copied'), 'success'), () => toast(L('Không sao chép được', 'Copy failed'), 'error'));
    else toast(L('Trình duyệt không hỗ trợ sao chép', 'Clipboard not supported'), 'error');
  };
  const onVcf = () => {
    const blob = new Blob([buildVCard(c, co)], { type:'text/vcard;charset=utf-8' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a'); a.href = url; a.download = (c.name || 'contact').replace(/\s+/g, '_') + '.vcf';
    document.body.appendChild(a); a.click(); a.remove(); setTimeout(() => URL.revokeObjectURL(url), 1000);
  };
  const cell = (label, key, ph, type) => <div style={{ flex:'1 1 180px' }}><Field label={label}><input className="input" type={type || 'text'} value={c[key] || ''} onChange={e => set(key, e.target.value)} placeholder={ph || ''} /></Field></div>;

  return (
    <div className="card">
      <div className="card-head"><h3><i className="bi bi-person-badge" style={{ marginRight:6 }}></i>{L('Hồ sơ & chữ ký email', 'Profile & email signature')}</h3><span className="badge badge-info">vCard QR</span></div>
      <div className="card-body col g14">
        <div className="flex g12 items-center">
          <Avatar name={me.name || me.email} size={44} />
          <div style={{ minWidth:0 }}><div style={{ fontWeight:600 }}>{me.name || '—'}</div>
            <div className="subtle mono truncate" style={{ fontSize:'var(--fs-sm)' }}>{me.email || '—'}</div>
            <span className="badge badge-info" style={{ marginTop:2 }}>{roleLabel}</span></div>
        </div>
        <div className="hr"></div>
        <SignatureCard card={c} branding={p.branding} />
        <div className="flex g12 wrap items-start">
          <div style={{ flex:'1 1 100%' }}><Field label={L('Lời chào mở đầu', 'Greeting')}><input className="input" value={c.greeting || ''} onChange={e => set('greeting', e.target.value)} placeholder={L('Trân trọng, (để trống nếu không cần)', 'e.g. Best regards, (blank to omit)')} /></Field></div>
        </div>
        <div className="flex g12 wrap items-start">
          {cell(L('Họ và tên', 'Full name'), 'name', 'Phạm Quốc Bảo')}
          {cell(L('Chức danh', 'Title'), 'title', L('Quản trị hệ thống', 'System admin'))}
          {cell(L('Phòng ban', 'Department'), 'dept', L('Kinh doanh', 'Sales'))}
        </div>
        <div className="flex g12 wrap items-start">
          {cell(L('Điện thoại', 'Phone'), 'phone', '08888 202 89')}
          {cell(L('Di động', 'Mobile'), 'mobile', '09xx xxx xxx')}
          {cell(L('Email', 'Email'), 'email', 'ten@swo.vn', 'email')}
        </div>
        <div className="subtle flex g6 items-start" style={{ fontSize:'var(--fs-sm)' }}><i className="bi bi-building" style={{ marginTop:2 }}></i><span>{L('Tên công ty, website & địa chỉ trên thẻ lấy trực tiếp từ Quản trị hệ thống → Thông tin công ty (không sửa ở đây).', 'Company name, website & address come straight from Admin → Company info.')}</span></div>
        <div className="flex g12 items-center wrap" style={{ padding:'8px 0', marginTop:2 }}>
          <span style={{ fontWeight:500, fontSize:'var(--fs-base)' }}>{L('Màu nhấn', 'Accent')}</span>
          <div className="flex g8 wrap">
            {NAMECARD_ACCENTS.map(a => (
              <button key={a.id} type="button" className={'btn btn-sm' + (c.accent === a.id ? ' btn-primary' : '')} onClick={() => set('accent', a.id)}>
                <span style={{ display:'inline-block', width:12, height:12, borderRadius:3, background:a.color, marginRight:6, verticalAlign:'-1px' }}></span>{tt(a.label)}
              </button>
            ))}
          </div>
        </div>
        <div className="hr"></div>
        <div className="flex g8 justify-end wrap" style={{ padding:'8px 0 4px' }}>
          <button className="btn btn-sm" onClick={onCopy}><i className="bi bi-clipboard"></i>{L('Sao chép HTML', 'Copy HTML')}</button>
          <button className="btn btn-sm" onClick={onVcf}><i className="bi bi-download"></i>{L('Tải .vcf', 'Download .vcf')}</button>
          <button className="btn btn-sm btn-ghost" onClick={onReset}><i className="bi bi-arrow-counterclockwise"></i>{L('Mặc định', 'Reset')}</button>
          <button className="btn btn-sm btn-primary" onClick={onSave}><i className="bi bi-check-lg"></i>{L('Lưu chữ ký', 'Save signature')}</button>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { NAMECARD_ACCENTS, accentColor, defaultNamecard, mergeNamecard, loadNamecard, saveNamecard, buildVCard, qrSig, namecardEmailHTML, SignatureCard, NamecardEditor });
