// branding.jsx — Quản trị hệ thống: logo · nhóm màu · tên gọi · mô tả · liên hệ + thông tin cty chứng từ.
// Admin chỉnh trong "Quản trị hệ thống"; lưu Supabase app_settings['branding'] (JSON, DÙNG CHUNG
// toàn hệ thống, RLS chỉ admin ghi) qua p.saveBranding; localStorage (usePersist 'brandingv2',
// hoist main.jsx) = cache hiển thị tức thì + màn đăng nhập. Áp toàn cục: token màu phái sinh từ primary/accent
// (set CSS var trên <html>) + document.title. Tải TRƯỚC shell.jsx (BrandLogo dùng chung).

const DEFAULT_BRANDING = {
  name: 'My S.W.O',
  logo: '/favicon-v2.svg',  // logo mặc định = mark SWO trong .design/icons (đã deploy ở root); đặt '' để dùng mark chữ
  logoText: 'SWO',
  primary: '#1466E0',
  accent: '#12C5C0',        // cyan thương hiệu theo logo SWO Mark (v4)
  description: '',          // rỗng = dùng mô tả mặc định (i18n login.heroSub)
  contactEmail: 'support@swo.vn',
  contactPhone: '',
  contactAddress: '',
  copyright: '© 2026 S.W.O Technology · Smart Works · Optimal & Simple',
  // ---- thông tin công ty cho chứng từ (báo giá / hợp đồng / đề nghị thanh toán) ----
  contactWeb: 'swo.vn',
  companyName: '',          // rỗng = dùng `name`; tên pháp lý hiện trên chứng từ
  companyAddr: '',          // rỗng = dùng `contactAddress`
  docLogo: '',              // logo riêng cho chứng từ; rỗng = dùng ký hiệu chữ
  docFont: 'Cambria',       // font chữ trên chứng từ (báo giá / hợp đồng / đề nghị thanh toán)
  mst: '0315378557',
  bankName: 'Vietcombank — CN TP. Hồ Chí Minh',
  bankAcc: '0071 0000 20289',
};

// "Nhóm màu" dựng sẵn (primary + accent). Tùy chọn "Tùy chỉnh" cho phép chọn màu tự do.
const BRAND_THEMES = [
  { id:'swo',     name:{vi:'S.W.O (mặc định)',en:'S.W.O (default)'}, primary:'#1466E0', accent:'#12C5C0' },
  { id:'indigo',  name:{vi:'Chàm',en:'Indigo'},      primary:'#4F46E5', accent:'#06B6D4' },
  { id:'violet',  name:{vi:'Tím',en:'Violet'},       primary:'#7C3AED', accent:'#EC4899' },
  { id:'emerald', name:{vi:'Lục bảo',en:'Emerald'},  primary:'#059669', accent:'#14B8A6' },
  { id:'amber',   name:{vi:'Hổ phách',en:'Amber'},   primary:'#D97706', accent:'#0FB0AB' },
  { id:'rose',    name:{vi:'Hồng',en:'Rose'},        primary:'#E11D48', accent:'#F59E0B' },
  { id:'slate',   name:{vi:'Xám đá',en:'Slate'},     primary:'#475569', accent:'#0EA5E9' },
];

/* ---- color helpers (phái sinh ramp từ 1 màu seed) ---- */
function _hexToRgb(h) {
  const s = (h || '').replace('#', '').trim();
  const v = s.length === 3 ? s.split('').map(c => c + c).join('') : s.slice(0, 6).padEnd(6, '0');
  const n = parseInt(v, 16) || 0;
  return { r:(n >> 16) & 255, g:(n >> 8) & 255, b:n & 255 };
}
function _toHex(r, g, b) {
  const h = x => Math.max(0, Math.min(255, Math.round(x))).toString(16).padStart(2, '0');
  return '#' + h(r) + h(g) + h(b);
}
function _mix(hex, target, ratio) {
  const a = _hexToRgb(hex), b = _hexToRgb(target);
  return _toHex(a.r + (b.r - a.r) * ratio, a.g + (b.g - a.g) * ratio, a.b + (b.b - a.b) * ratio);
}
const _BLACK = '#000000', _WHITE = '#ffffff';

// Trả về map các CSS var phái sinh từ primary + accent (đủ để re-skin nhất quán).
function deriveBrandVars(primary, accent) {
  const p = /^#?[0-9a-fA-F]{3,6}$/.test(primary || '') ? primary : DEFAULT_BRANDING.primary;
  const a = /^#?[0-9a-fA-F]{3,6}$/.test(accent || '') ? accent : DEFAULT_BRANDING.accent;
  const c = _hexToRgb(p);
  return {
    '--primary': p,
    '--primary-hover': _mix(p, _BLACK, 0.16),
    '--primary-active': _mix(p, _BLACK, 0.30),
    '--primary-light': _mix(p, _WHITE, 0.90),
    '--primary-light-2': _mix(p, _WHITE, 0.82),
    '--accent': a,
    '--accent-light': _mix(a, _WHITE, 0.88),
    '--info': p,
    '--info-bg': _mix(p, _WHITE, 0.90),
    '--ring': `0 0 0 3px rgba(${c.r},${c.g},${c.b},.16)`,
  };
}

// Áp branding ra toàn cục (gọi từ effect trong main.jsx mỗi khi branding đổi).
function applyBranding(b) {
  const br = Object.assign({}, DEFAULT_BRANDING, b || {});
  const root = document.documentElement;
  const vars = deriveBrandVars(br.primary, br.accent);
  Object.keys(vars).forEach(k => root.style.setProperty(k, vars[k]));
  // Tiêu đề = ĐÚNG tên trong Quản trị hệ thống (branding.name), không nối hậu tố.
  document.title = br.name || DEFAULT_BRANDING.name;
}

/* ---- Brand mark: logo ảnh (nếu có) hoặc mark chữ ".swo-mark" ---- */
function BrandLogo({ branding, size = 26, fontSize = 10, className = '' }) {
  const b = Object.assign({}, DEFAULT_BRANDING, branding || {});
  if (b.logo) return <img src={b.logo} alt={b.name || 'logo'} className={'brand-img ' + className} style={{ width:size, height:size }} />;
  return <span className={'swo-mark ' + className} style={{ width:size, height:size, fontSize }}>{b.logoText || 'SWO'}</span>;
}

/* ===================== Quản trị hệ thống (admin) ===================== */
function SystemAdminPanel() {
  const p = usePortal();
  const { t, tt, lang } = useLang();
  const toast = useToast();
  const isAdmin = p.role === 'admin';
  const [d, setD] = React.useState(() => Object.assign({}, DEFAULT_BRANDING, p.branding));
  const set = (k, v) => setD(s => ({ ...s, [k]:v }));
  const fileRef = React.useRef();
  const docFileRef = React.useRef();

  const dirty = JSON.stringify(d) !== JSON.stringify(Object.assign({}, DEFAULT_BRANDING, p.branding));

  // Đọc tệp ảnh → data-URL, gán vào khóa branding (logo app hoặc docLogo chứng từ).
  const readImage = (e, key) => {
    const f = e.target.files && e.target.files[0];
    e.target.value = '';
    if (!f) return;
    if (!/^image\//.test(f.type)) { toast(lang === 'vi' ? 'Vui lòng chọn tệp ảnh' : 'Please choose an image file', 'error'); return; }
    if (f.size > 512 * 1024) { toast(lang === 'vi' ? 'Ảnh quá lớn (tối đa 512KB)' : 'Image too large (max 512KB)', 'error'); return; }
    const rd = new FileReader();
    rd.onload = () => set(key, rd.result);
    rd.readAsDataURL(f);
  };
  const onUpload = (e) => readImage(e, 'logo');
  const save = () => { p.saveBranding(Object.assign({}, DEFAULT_BRANDING, d)); toast(lang === 'vi' ? 'Đã lưu — đồng bộ toàn hệ thống' : 'Saved — synced system-wide', 'success'); };
  const resetAll = () => { setD(Object.assign({}, DEFAULT_BRANDING)); };
  const applyTheme = (th) => setD(s => ({ ...s, primary:th.primary, accent:th.accent }));
  const activeTheme = BRAND_THEMES.find(th => th.primary.toLowerCase() === (d.primary || '').toLowerCase() && th.accent.toLowerCase() === (d.accent || '').toLowerCase());

  if (!isAdmin) {
    return <div className="card" style={{ marginTop:14 }}><div className="card-body"><EmptyState icon="bi-shield-lock" text={lang === 'vi' ? 'Chỉ quản trị viên mới truy cập mục này.' : 'Admins only.'} /></div></div>;
  }

  const previewVars = deriveBrandVars(d.primary, d.accent);

  return (
    <div style={{ marginTop:14 }}>
      {/* Thanh lưu cố định trên đầu — luôn thao tác được, không phải cuộn */}
      <div className="flex justify-between items-center wrap g8" style={{ marginBottom:12 }}>
        <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}><i className="bi bi-info-circle" style={{ marginRight:4 }}></i>{t('sys.note')} · {lang === 'vi' ? 'Lưu sẽ áp dụng cho TOÀN hệ thống (mọi máy & người dùng).' : 'Saving applies system-wide (all machines & users).'}</div>
        <div className="flex g8 items-center">
          {dirty && <span className="subtle" style={{ fontSize:'var(--fs-sm)' }}><i className="bi bi-dot"></i>{t('sys.unsaved')}</span>}
          <button className="btn" onClick={resetAll}><i className="bi bi-arrow-counterclockwise"></i>{t('sys.reset')}</button>
          <button className="btn btn-primary" onClick={save} disabled={!dirty && !!p.appSettings.branding}><i className="bi bi-check-lg"></i>{t('sys.save')}</button>
        </div>
      </div>
      {/* Bố trí theo nhóm: Nhận diện & giao diện · Thông tin doanh nghiệp · Chính sách hệ thống */}
      <div className="col" style={{ gap:18 }}>

        {/* ===== Nhóm 1: Nhận diện & giao diện ===== */}
        <div className="col g8">
          <div className="sys-sec-title"><i className="bi bi-palette"></i>{lang === 'vi' ? 'Nhận diện & giao diện' : 'Identity & appearance'}</div>
          <div className="settings-grid">
            {/* Nhận diện: logo + tên + mô tả */}
            <div className="card">
              <div className="card-head"><h3>{t('sys.identity')}</h3></div>
              <div className="card-body col g16">
                <div className="flex g16 items-center wrap">
                  <BrandLogo branding={d} size={56} fontSize={18} />
                  <div className="col g8">
                    <div className="flex g8 wrap">
                      <button className="btn btn-sm" onClick={() => fileRef.current && fileRef.current.click()}><i className="bi bi-upload"></i>{t('sys.upload')}</button>
                      {d.logo && <button className="btn btn-sm btn-ghost" onClick={() => set('logo', '')}><i className="bi bi-arrow-counterclockwise"></i>{t('sys.useMark')}</button>}
                    </div>
                    <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}>{t('sys.logoHint')}</div>
                    <input ref={fileRef} type="file" accept="image/*" onChange={onUpload} style={{ display:'none' }} />
                  </div>
                </div>
                {!d.logo && (
                  <Field label={t('sys.markText')} hint={t('sys.markHint')}>
                    <input className="input" maxLength={4} value={d.logoText} onChange={e => set('logoText', e.target.value)} style={{ maxWidth:140 }} />
                  </Field>
                )}
                <Field label={t('sys.name')}>
                  <input className="input" value={d.name} onChange={e => set('name', e.target.value)} placeholder="My S.W.O" />
                </Field>
                <Field label={t('sys.desc')} hint={t('sys.descHint')}>
                  <textarea className="textarea" rows={2} value={d.description} onChange={e => set('description', e.target.value)} placeholder={t('login.heroSub')} />
                </Field>
              </div>
            </div>

            {/* Nhóm màu */}
            <div className="card">
              <div className="card-head"><h3>{t('sys.colors')}</h3></div>
              <div className="card-body col g16">
                <div className="swatches">
                  {BRAND_THEMES.map(th => (
                    <button key={th.id} className={'swatch' + (activeTheme && activeTheme.id === th.id ? ' is-active' : '')} onClick={() => applyTheme(th)} title={tt(th.name)}>
                      <span className="sw-dots"><i style={{ background:th.primary }}></i><i style={{ background:th.accent }}></i></span>
                      <span className="sw-name">{tt(th.name)}</span>
                    </button>
                  ))}
                </div>
                <div className="flex g16 wrap">
                  <Field label={t('sys.primary')}>
                    <span className="color-pick"><input type="color" value={d.primary} onChange={e => set('primary', e.target.value)} /><span className="mono">{d.primary}</span></span>
                  </Field>
                  <Field label={t('sys.accent')}>
                    <span className="color-pick"><input type="color" value={d.accent} onChange={e => set('accent', e.target.value)} /><span className="mono">{d.accent}</span></span>
                  </Field>
                </div>
              </div>
            </div>

            {/* Xem trước */}
            <div className="card sys-preview-card" style={previewVars}>
              <div className="card-head"><h3>{t('sys.preview')}</h3></div>
              <div className="card-body col g16">
                <div className="sys-pv-bar">
                  <BrandLogo branding={d} size={26} fontSize={10} />
                  <span style={{ fontWeight:700, letterSpacing:'-.01em' }}>{d.name || 'My S.W.O'}</span>
                </div>
                <div className="sys-pv-hero">
                  <BrandLogo branding={d} size={40} fontSize={13} />
                  <div className="col" style={{ gap:2 }}>
                    <strong>{d.name || 'My S.W.O'}</strong>
                    <span className="muted" style={{ fontSize:'var(--fs-base)' }}>{d.description || t('login.heroSub')}</span>
                  </div>
                </div>
                <div className="flex g8 items-center wrap">
                  <button className="btn btn-primary btn-sm">{t('c.create')}</button>
                  <button className="btn btn-accent btn-sm">{t('c.save')}</button>
                  <span className="badge badge-info">Info</span>
                  <span className="badge badge-accent">Accent</span>
                </div>
                <div className="subtle col" style={{ fontSize:'var(--fs-sm)', gap:2 }}>
                  {d.contactEmail && <span><i className="bi bi-envelope"></i> {d.contactEmail}</span>}
                  {d.contactPhone && <span><i className="bi bi-telephone"></i> {d.contactPhone}</span>}
                  {d.contactAddress && <span><i className="bi bi-geo-alt"></i> {d.contactAddress}</span>}
                  <span style={{ marginTop:4 }}>{d.copyright}</span>
                </div>
              </div>
            </div>
          </div>
        </div>

        {/* ===== Nhóm 2: Thông tin doanh nghiệp ===== */}
        <div className="col g8">
          <div className="sys-sec-title"><i className="bi bi-building"></i>{lang === 'vi' ? 'Thông tin doanh nghiệp' : 'Company info'}</div>
          <div className="settings-grid">
            {/* Liên hệ */}
            <div className="card">
              <div className="card-head"><h3>{t('sys.contact')}</h3></div>
              <div className="card-body col g16">
                <div className="flex g16 wrap">
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.email')}><input className="input" type="email" value={d.contactEmail} onChange={e => set('contactEmail', e.target.value)} placeholder="support@swo.vn" /></Field></div>
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.phone')}><input className="input" value={d.contactPhone} onChange={e => set('contactPhone', e.target.value)} placeholder="+84 …" /></Field></div>
                </div>
                <Field label={t('sys.address')}><input className="input" value={d.contactAddress} onChange={e => set('contactAddress', e.target.value)} /></Field>
                <Field label={t('sys.footer')}><input className="input" value={d.copyright} onChange={e => set('copyright', e.target.value)} /></Field>
              </div>
            </div>

            {/* Thông tin công ty cho chứng từ (báo giá / hợp đồng / đề nghị thanh toán) */}
            <div className="card">
              <div className="card-head"><h3>{t('sys.company')}</h3></div>
              <div className="card-body col g16">
                <div className="subtle" style={{ fontSize:'var(--fs-sm)', marginTop:-4 }}>{t('sys.companyHint')}</div>
                <div className="flex g16 items-center wrap">
                  {d.docLogo
                    ? <img src={d.docLogo} alt="doc logo" style={{ width:56, height:56, objectFit:'contain', border:'1px solid var(--border)', borderRadius:'var(--r-md)', background:'#fff', padding:4 }} />
                    : <span className="swo-mark" style={{ width:56, height:56, fontSize:16 }}>{(d.companyName || d.name || 'SWO').replace(/[^A-Za-zÀ-ỹ]/g, '').slice(0, 3).toUpperCase()}</span>}
                  <div className="col g8">
                    <div className="flex g8 wrap">
                      <button className="btn btn-sm" onClick={() => docFileRef.current && docFileRef.current.click()}><i className="bi bi-upload"></i>{t('sys.docLogo')}</button>
                      {d.docLogo && <button className="btn btn-sm btn-ghost" onClick={() => set('docLogo', '')}><i className="bi bi-trash"></i>{t('c.delete')}</button>}
                    </div>
                    <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}>{t('sys.docLogoHint')}</div>
                    <input ref={docFileRef} type="file" accept="image/*" onChange={e => readImage(e, 'docLogo')} style={{ display:'none' }} />
                  </div>
                </div>
                <Field label={t('sys.companyName')}><input className="input" value={d.companyName} onChange={e => set('companyName', e.target.value)} placeholder={d.name || 'CÔNG TY TNHH …'} /></Field>
                <Field label={t('sys.companyAddr')}><input className="input" value={d.companyAddr} onChange={e => set('companyAddr', e.target.value)} placeholder={d.contactAddress || '…'} /></Field>
                <div className="flex g16 wrap">
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.docFont')}>
                    <select className="select" value={d.docFont} onChange={e => set('docFont', e.target.value)} style={{ fontFamily:"'" + (d.docFont || 'Cambria') + "',serif" }}>
                      {['Cambria', 'Times New Roman', 'Calibri', 'Arial', 'Tahoma', 'Be Vietnam Pro'].map(fn => <option key={fn} value={fn} style={{ fontFamily:"'" + fn + "',serif" }}>{fn}</option>)}
                    </select>
                  </Field></div>
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.mst')}><input className="input mono" value={d.mst} onChange={e => set('mst', e.target.value)} placeholder="0300000000" /></Field></div>
                </div>
                <div className="flex g16 wrap">
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.bankName')}><input className="input" value={d.bankName} onChange={e => set('bankName', e.target.value)} placeholder="Vietcombank — CN …" /></Field></div>
                  <div style={{ flex:1, minWidth:180 }}><Field label={t('sys.bankAcc')}><input className="input mono" value={d.bankAcc} onChange={e => set('bankAcc', e.target.value)} placeholder="0071 0000 …" /></Field></div>
                </div>
              </div>
            </div>
          </div>
        </div>

        {/* ===== Nhóm 3: Chính sách hệ thống ===== */}
        <div className="col g8">
          <div className="sys-sec-title"><i className="bi bi-sliders"></i>{lang === 'vi' ? 'Chính sách hệ thống' : 'System policies'}</div>
          <div className="settings-grid">
            {/* Quyền xem giá vốn & lợi nhuận */}
            <div className="card">
              <div className="card-head"><h3>{lang === 'vi' ? 'Quyền xem giá vốn & lợi nhuận' : 'Cost & profit visibility'}</h3></div>
              <div className="card-body col g12">
                <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}>{lang === 'vi' ? 'Ai được nhìn cột giá vốn / biên lợi nhuận (Sản phẩm, Báo giá, Hợp đồng, Thương vụ).' : 'Who can see cost / profit-margin columns (Products, Quotes, Contracts, Deals).'}</div>
                <div className="seg">
                  {[['admin', lang === 'vi' ? 'Chỉ Admin' : 'Admin only'], ['manager', lang === 'vi' ? 'Admin + Quản lý' : 'Admin + Manager'], ['all', lang === 'vi' ? 'Tất cả' : 'Everyone']].map(([k, lbl]) => (
                    <button key={k} className={(p.appSettings.costVisibility || 'manager') === k ? 'is-active' : ''} onClick={() => p.setSetting('costVisibility', k)}>{lbl}</button>
                  ))}
                </div>
                <div className="subtle flex g6 items-start" style={{ fontSize:'var(--fs-sm)' }}><i className="bi bi-info-circle" style={{ marginTop:2 }}></i><span>{lang === 'vi' ? 'Lưu ngay khi chọn. Ngoại lệ theo từng người: mở module Người dùng → chọn một người → đặt "Quyền xem giá vốn".' : 'Saved instantly. Per-user exceptions: Users module → open a user.'}</span></div>
              </div>
            </div>

            {/* Định dạng ngày mặc định hệ thống */}
            <div className="card">
              <div className="card-head"><h3>{lang === 'vi' ? 'Định dạng ngày (mặc định)' : 'Date format (default)'}</h3></div>
              <div className="card-body col g12">
                <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}>{lang === 'vi' ? 'Định dạng ngày mặc định cho cả hệ thống. Người dùng có thể đổi riêng trong Cài đặt của họ.' : 'Default date format for everyone. Each user can override in their own Settings.'}</div>
                <div className="seg">
                  {[['dmy', 'DD/MM/YYYY'], ['mdy', 'MM/DD/YYYY']].map(([k, lbl]) => (
                    <button key={k} className={(p.appSettings.dateFormat || 'dmy') === k ? 'is-active' : ''} onClick={() => p.setSetting('dateFormat', k)}>{lbl}</button>
                  ))}
                </div>
                <div className="subtle" style={{ fontSize:'var(--fs-sm)' }}>{lang === 'vi' ? 'Lưu ngay. Ví dụ hôm nay: ' : 'Saved instantly. Today: '}<span className="mono">{fmtDate(TODAY)}</span></div>
              </div>
            </div>
          </div>
        </div>

      </div>
    </div>
  );
}

Object.assign(window, { DEFAULT_BRANDING, BRAND_THEMES, deriveBrandVars, applyBranding, BrandLogo, SystemAdminPanel });
