// crm-accounts.jsx — Accounts + Contacts
// ACT_ICONS and ACT_TYPES are defined in crm-leads.jsx (loaded first)
const { useState, useEffect, useCallback } = React;

function Accounts({ user, showToast, quickAdd, openAccountId, onOpenedAccount }) {
  const [accounts,       setAccounts]       = useState([]);
  const [selected,       setSelected]       = useState(null);
  const [showAdd,        setShowAdd]        = useState(false);
  const [showImport,     setShowImport]     = useState(false);
  const [loading,        setLoading]        = useState(false);
  const [statusFilter,   setStatusFilter]   = useState('active');  // active | closed | all
  const [search,         setSearch]         = useState('');
  const [industryFilter, setIndustryFilter] = useState('');
  const [repFilter,      setRepFilter]      = useState('');
  const [sortCol,        setSortCol]        = useState('companyName');
  const [sortDir,        setSortDir]        = useState('asc');
  const [emailAcc,       setEmailAcc]       = useState(null);  // { id, toEmail, toName }

  useEffect(() => {
    if (!quickAdd) return;
    if (quickAdd.type === 'account') setShowAdd(true);
    if (quickAdd.type === 'sale') showToast('Open an account and go to the Sales tab to record a sale.', 'default');
  }, [quickAdd]);

  const load = useCallback(async () => {
    setLoading(true);
    try {
      const filters = user.role === 'rep' && !user.isAdmin ? { repId: user.id } : {};
      if (statusFilter !== 'active') filters.showClosed = true;
      const all = await CRM.AccountsAPI.getAll(filters);
      setAccounts(all);
    } catch (e) {
      showToast('Failed to load accounts: ' + e.message, 'error');
    } finally { setLoading(false); }
  }, [user, statusFilter]);

  useEffect(() => { load(); }, [load]);

  // Deep-link from the dashboard widgets: open a specific account's detail
  // once the list has loaded.
  useEffect(() => {
    if (!openAccountId || accounts.length === 0) return;
    const acc = accounts.find(a => a.id === openAccountId);
    if (acc) setSelected(acc);
    else showToast('Account not found (it may be closed or outside your assignments).', 'default');
    onOpenedAccount?.();
  }, [openAccountId, accounts]);

  const reps       = CRM.UsersAPI.getAll().filter(u => u.role === 'rep');
  const industries = [...new Set(accounts.map(a => a.industry).filter(Boolean))].sort();

  // ── Client-side filtering ──────────────────────────────────
  let displayed = accounts;
  if (search) {
    const s = search.toLowerCase();
    displayed = displayed.filter(a =>
      a.companyName?.toLowerCase().includes(s) ||
      a.industry?.toLowerCase().includes(s) ||
      a.address?.toLowerCase().includes(s)
    );
  }
  if (statusFilter === 'closed') displayed = displayed.filter(a => a.isActive === false);
  if (industryFilter) displayed = displayed.filter(a => a.industry === industryFilter);
  if (repFilter)      displayed = displayed.filter(a =>
    a.assignedRepId === repFilter || a.assignedRep?.id === repFilter);

  // ── Client-side sorting ────────────────────────────────────
  const toggleSort = col => {
    if (sortCol === col) setSortDir(d => d === 'asc' ? 'desc' : 'asc');
    else { setSortCol(col); setSortDir('asc'); }
  };

  displayed = [...displayed].sort((a, b) => {
    let av, bv;
    if (sortCol === 'rep') {
      av = (a.assignedRep || CRM.UsersAPI.getById(a.assignedRepId))?.name || '';
      bv = (b.assignedRep || CRM.UsersAPI.getById(b.assignedRepId))?.name || '';
    } else {
      av = a[sortCol] ?? '';
      bv = b[sortCol] ?? '';
    }
    if (typeof av === 'number' && typeof bv === 'number')
      return sortDir === 'asc' ? av - bv : bv - av;
    return sortDir === 'asc'
      ? String(av).localeCompare(String(bv))
      : String(bv).localeCompare(String(av));
  });

  // Paged render — "all statuses" can include thousands of accounts;
  // mounting every row crashes the tab (renderer OOM). 100 per page with
  // ‹ › arrows in the status bar above the table.
  const PAGE_SIZE = 100;
  const [page, setPage] = useState(0);
  useEffect(() => { setPage(0); }, [statusFilter, search, industryFilter, repFilter]);
  const pageCount = Math.max(1, Math.ceil(displayed.length / PAGE_SIZE));
  const safePage = Math.min(page, pageCount - 1);
  const shownAccounts = displayed.slice(safePage * PAGE_SIZE, (safePage + 1) * PAGE_SIZE);
  const rangeFrom = displayed.length === 0 ? 0 : safePage * PAGE_SIZE + 1;
  const rangeTo = Math.min(displayed.length, (safePage + 1) * PAGE_SIZE);

  // ── Sortable column header ─────────────────────────────────
  const Th = ({ col, label, style }) => {
    const active = sortCol === col;
    return (
      <th onClick={() => toggleSort(col)}
        style={{cursor:'pointer', userSelect:'none', whiteSpace:'nowrap', ...style}}>
        {label}
        <span style={{marginLeft:4, fontSize:9, opacity: active ? 0.85 : 0.18}}>
          {active && sortDir === 'asc' ? ' ▲' : ' ▼'}
        </span>
      </th>
    );
  };

  // Expiring within 90 days
  const isExpiringSoon = dateStr => {
    if (!dateStr) return false;
    const diff = (new Date(dateStr) - new Date()) / 86400000;
    return diff >= 0 && diff <= 90;
  };

  const active  = accounts.filter(a => a.isActive !== false);
  const closed  = accounts.filter(a => a.isActive === false);
  const hasFilters = search || industryFilter || repFilter;

  const quickEmail = async (e, acc) => {
    e.stopPropagation();
    try {
      const contacts = await CRM.ContactsAPI.getByAccount(acc.id);
      const primary  = contacts.find(c => c.isPrimary) || contacts[0];
      setEmailAcc({ id: acc.id, toEmail: primary?.email || '', toName: primary?.name || acc.companyName });
    } catch {
      setEmailAcc({ id: acc.id, toEmail: '', toName: acc.companyName });
    }
  };

  return (
    <div>
      {/* Filter bar */}
      <div className="search-bar">
        <input className="search-input" placeholder="🔍  Search company, industry, address…"
          value={search} onChange={e => setSearch(e.target.value)} />

        <select className="search-input" style={{flex:'unset',width:160}}
          value={industryFilter} onChange={e => setIndustryFilter(e.target.value)}>
          <option value="">All Industries</option>
          {industries.map(i => <option key={i} value={i}>{i}</option>)}
        </select>

        {user.isAdmin && (
          <select className="search-input" style={{flex:'unset',width:148}}
            value={repFilter} onChange={e => setRepFilter(e.target.value)}>
            <option value="">All Reps</option>
            {reps.map(r => <option key={r.id} value={r.id}>{r.name}</option>)}
          </select>
        )}

        <select className="search-input" style={{flex:'unset',width:120}}
          value={statusFilter} onChange={e => setStatusFilter(e.target.value)}>
          <option value="active">Active</option>
          <option value="closed">Closed</option>
          <option value="all">All Status</option>
        </select>

        <button className="btn btn-ghost btn-sm" onClick={() => setShowImport(true)}>⬆ Import</button>
        <button className="btn btn-primary btn-sm" onClick={() => setShowAdd(true)}>+ Add Account</button>
      </div>

      {/* Count + clear filters */}
      <div style={{fontSize:12,color:'var(--g400)',marginBottom:12,display:'flex',alignItems:'center',gap:10}}>
        {loading ? 'Loading…'
          : `${displayed.length}${displayed.length !== accounts.length ? ` of ${active.length}` : ''} active account${active.length!==1?'s':''}${closed.length>0?`, ${closed.length} closed`:''}`}
        {hasFilters && (
          <button onClick={() => { setSearch(''); setIndustryFilter(''); setRepFilter(''); }}
            style={{fontSize:11,color:'var(--red)',background:'none',border:'1px solid var(--red)',borderRadius:4,cursor:'pointer',padding:'1px 7px'}}>
            ✕ Clear filters
          </button>
        )}
      </div>

      {/* Table */}
      <div className="card" style={{overflow:'hidden',padding:0}}>
        {/* Pager status bar */}
        <div style={{display:'flex',alignItems:'center',gap:10,padding:'8px 14px',borderBottom:'1px solid var(--g200)',background:'var(--off)'}}>
          <span style={{fontSize:12,fontWeight:600,color:'var(--g600)'}}>
            Showing {rangeFrom.toLocaleString()}–{rangeTo.toLocaleString()} of {displayed.length.toLocaleString()}
          </span>
          <div style={{marginLeft:'auto',display:'flex',alignItems:'center',gap:6}}>
            <button className="btn btn-ghost btn-xs" disabled={safePage === 0} title="Previous 100"
              style={{fontSize:15,lineHeight:1,padding:'2px 10px',opacity: safePage === 0 ? .35 : 1}}
              onClick={() => setPage(p => Math.max(0, p - 1))}>‹</button>
            <span style={{fontSize:12,color:'var(--g400)'}}>Page {safePage + 1} of {pageCount}</span>
            <button className="btn btn-ghost btn-xs" disabled={safePage >= pageCount - 1} title="Next 100"
              style={{fontSize:15,lineHeight:1,padding:'2px 10px',opacity: safePage >= pageCount - 1 ? .35 : 1}}
              onClick={() => setPage(p => Math.min(pageCount - 1, p + 1))}>›</button>
          </div>
        </div>
        <div style={{overflowX:'auto'}}>
          <table className="tbl">
            <thead>
              <tr>
                <Th col="companyName"         label="Company" />
                <Th col="industry"            label="Industry" />
                <Th col="contractValue"       label="Contract Value"  style={{textAlign:'right'}} />
                <Th col="singlePurchaseValue" label="Single Purchase" style={{textAlign:'right'}} />
                <Th col="contractEnd"         label="Contract End" />
                <Th col="rep"                 label="Rep" />
                <th style={{width:80}}>Status</th>
                <th style={{width:44}}></th>
              </tr>
            </thead>
            <tbody>
              {loading && (
                <tr><td colSpan={8} style={{textAlign:'center',padding:'40px',color:'var(--g400)',fontWeight:'normal'}}>Loading…</td></tr>
              )}
              {!loading && displayed.length === 0 && (
                <tr><td colSpan={8} style={{textAlign:'center',padding:'40px',color:'var(--g400)',fontWeight:'normal'}}>
                  {accounts.length === 0 ? 'No accounts yet. Won deals can be converted to accounts.' : 'No accounts match your filters.'}
                </td></tr>
              )}
              {shownAccounts.map(acc => {
                const rep      = acc.assignedRep || CRM.UsersAPI.getById(acc.assignedRepId);
                const isClosed = acc.isActive === false;
                const expiring = !isClosed && isExpiringSoon(acc.contractEnd);
                return (
                  <tr key={acc.id} onClick={() => setSelected(acc)} style={{opacity: isClosed ? 0.65 : 1}}>
                    <td>
                      <div style={{display:'flex',alignItems:'center',gap:10}}>
                        <div style={{
                          width:32, height:32, borderRadius:6, flexShrink:0,
                          background: isClosed ? 'var(--g400)' : 'var(--navy)',
                          color:'white', display:'flex', alignItems:'center',
                          justifyContent:'center', fontSize:14, fontWeight:800,
                        }}>
                          {acc.companyName.charAt(0)}
                        </div>
                        <div>
                          <div style={{fontWeight:700,color:'var(--navy)'}}>{acc.companyName}</div>
                          {(acc.city || acc.state || acc.address) && (
                            <div style={{fontSize:11,color:'var(--g400)',fontWeight:'normal'}}>
                              {(acc.city || acc.state)
                                ? [acc.city, acc.state].filter(Boolean).join(', ')
                                : acc.address.split(',').slice(-2).join(',').trim()}
                            </div>
                          )}
                        </div>
                      </div>
                    </td>
                    <td style={{fontWeight:'normal'}}>{acc.industry||'—'}</td>
                    <td style={{fontWeight:700,color:'var(--green)',textAlign:'right'}}>
                      {acc.contractValue ? '$'+Number(acc.contractValue).toLocaleString() : '—'}
                    </td>
                    <td style={{fontWeight:'normal',color:'var(--navy)',textAlign:'right'}}>
                      {acc.singlePurchaseValue ? '$'+Number(acc.singlePurchaseValue).toLocaleString() : '—'}
                    </td>
                    <td style={{fontWeight:'normal',whiteSpace:'nowrap',color: expiring ? '#B45309' : 'var(--g600)'}}>
                      {acc.contractEnd || '—'}
                      {expiring && <span style={{marginLeft:4}} title="Expiring within 90 days">⚠️</span>}
                    </td>
                    <td style={{fontWeight:'normal'}}>{rep?.name||'—'}</td>
                    <td>
                      {isClosed
                        ? <span className="badge badge-gray">Closed</span>
                        : <span className="badge badge-green">Active</span>}
                    </td>
                    <td onClick={e => e.stopPropagation()} style={{padding:'0 8px'}}>
                      <button
                        onClick={e => quickEmail(e, acc)}
                        title="Send email"
                        style={{background:'none',border:'none',cursor:'pointer',fontSize:15,padding:'4px 6px',borderRadius:5,opacity:.45,lineHeight:1,display:'block'}}
                        onMouseEnter={e => e.currentTarget.style.opacity = 1}
                        onMouseLeave={e => e.currentTarget.style.opacity = .45}>
                        ✉
                      </button>
                    </td>
                  </tr>
                );
              })}
            </tbody>
          </table>
        </div>
      </div>

      {selected && (
        <AccountDetailModal account={selected} user={user}
          onClose={() => { setSelected(null); load(); }}
          showToast={showToast} />
      )}
      {showImport && (
        <ImportModal type="accounts" onClose={() => setShowImport(false)}
          onDone={() => { load(); showToast('Accounts imported successfully!', 'success'); }} />
      )}
      {showAdd && (
        <AddAccountModal user={user} onClose={() => setShowAdd(false)}
          onSave={async data => {
            try {
              await CRM.AccountsAPI.create(data);
              await load();
              setShowAdd(false);
              showToast('Account created!', 'success');
            } catch (e) { showToast('Failed to create account: ' + e.message, 'error'); }
          }} />
      )}
      {emailAcc && (
        <SendEmailModal
          toEmail={emailAcc.toEmail}
          toName={emailAcc.toName}
          accountId={emailAcc.id}
          onClose={() => setEmailAcc(null)}
          showToast={showToast}
        />
      )}
    </div>
  );
}

function AccountDetailModal({ account: initialAcc, user, onClose, showToast }) {
  const [acc, setAcc] = useState(initialAcc);
  const [tab, setTab] = useState('overview');
  const [contacts, setContacts] = useState([]);
  const [tickets, setTickets] = useState([]);
  const [ticketCap, setTicketCap] = useState(25);   // bound rendered ticket rows
  const [contactCap, setContactCap] = useState(50); // bound rendered contact cards
  const [actCap, setActCap] = useState(30);         // bound rendered activity timeline
  const [files, setFiles] = useState([]);
  const [sales, setSales] = useState([]);
  const [activities, setActivities] = useState([]);
  const [syncedEmails, setSyncedEmails] = useState([]);
  const [orders,    setOrders]    = useState([]);
  const [proposals, setProposals] = useState([]);
  const [actType, setActType] = useState('note');
  const [actText, setActText] = useState('');
  const [aodUsage, setAodUsage]   = useState([]);
  const [aodLoaded, setAodLoaded] = useState(false);
  const [uploading, setUploading] = useState(false);
  const [editing, setEditing] = useState(false);
  const [saleForm, setSaleForm] = useState({ amount: '', description: '', saleDate: new Date().toISOString().split('T')[0], isSinglePurchase: false });
  const [addingSale, setAddingSale] = useState(false);
  const [savingSale, setSavingSale] = useState(false);
  const [editingSale, setEditingSale] = useState(null);   // sale id being edited
  const [editSaleForm, setEditSaleForm] = useState({});
  const [savingEditSale, setSavingEditSale] = useState(false);
  const [form, setForm] = useState({...initialAcc});
  const [showAddContact, setShowAddContact] = useState(false);
  const [contactForm, setContactForm] = useState({ name:'', title:'', email:'', phone:'', primary:false });
  const [editingContactId, setEditingContactId] = useState(null);
  const [editContactForm,  setEditContactForm]  = useState({ name:'', title:'', email:'', phone:'', primary:false });
  const [saving, setSaving] = useState(false);
  const [actioning, setActioning] = useState(false);
  const [emailing,  setEmailing]  = useState(false);
  const [analyzing, setAnalyzing] = useState(false);

  const closeAccount = async () => {
    if (!confirm(`Mark "${acc.companyName}" as closed? It will be hidden from the main list.`)) return;
    setActioning(true);
    try {
      const updated = await CRM.AccountsAPI.close(acc.id);
      setAcc(updated);
      showToast('Account closed.', 'success');
    } catch (e) { showToast('Failed to close account: ' + e.message, 'error'); }
    finally { setActioning(false); }
  };

  const reopenAccount = async () => {
    setActioning(true);
    try {
      const updated = await CRM.AccountsAPI.reopen(acc.id);
      setAcc(updated);
      showToast('Account reopened!', 'success');
    } catch (e) { showToast('Failed to reopen account: ' + e.message, 'error'); }
    finally { setActioning(false); }
  };

  const deleteAccount = async () => {
    if (!confirm(`Permanently delete "${acc.companyName}"? This cannot be undone.`)) return;
    setActioning(true);
    try {
      await CRM.AccountsAPI.delete(acc.id);
      showToast('Account deleted.', 'success');
      onClose();
    } catch (e) {
      showToast('Failed to delete account: ' + e.message, 'error');
      setActioning(false);
    }
  };

  const loadAod = async () => {
    if (aodLoaded) return;
    try {
      const rows = await CRM.AodAPI.getByAccount(acc.id);
      setAodUsage(rows);
      setAodLoaded(true);
    } catch (e) { showToast('Failed to load AoD usage.', 'error'); }
  };

  const loadActivities = async () => {
    try {
      const acts = await CRM.ActivitiesAPI.getByAccountId(acc.id);
      setActivities(acts);
    } catch (e) { showToast('Failed to load activities.', 'error'); }
  };

  const addActivity = async () => {
    if (!actText.trim()) return;
    try {
      await CRM.ActivitiesAPI.createForAccount(acc.id, { type: actType, content: actText });
      setActText('');
      await loadActivities();
      showToast('Activity logged!', 'success');
    } catch (e) { showToast('Failed to log activity.', 'error'); }
  };

  const load = async () => {
    // Each API independently catches so a single failure doesn't blank the tab.
    const failed = [];
    const safe = async (label, fn, setter, fallback) => {
      try { setter(await fn()); }
      catch (e) { failed.push(`${label}: ${e.message}`); setter(fallback); }
    };
    await Promise.all([
      safe('contacts',   () => CRM.ContactsAPI.getByAccount(acc.id),       setContacts,   []),
      safe('tickets',    () => CRM.TicketsAPI.getAll({ accountId: acc.id, limit: 500 }), setTickets,    []),
      safe('files',      () => CRM.FilesAPI.getByAccount(acc.id),           setFiles,      []),
      safe('sales',      () => CRM.AccountSalesAPI.getByAccount(acc.id),    setSales,      []),
      safe('activities', () => CRM.ActivitiesAPI.getByAccountId(acc.id),    setActivities, []),
      safe('orders',     () => CRM.OrderFormsAPI.getByAccount(acc.id),      setOrders,     []),
      safe('proposals',  () => CRM.ProposalFormsAPI.getByAccount(acc.id),   setProposals,  []),
      // Synced M365 email — silently empty if Graph sync is disabled/unavailable
      CRM.GraphAPI.accountEmails(acc.id).catch(() => []).then(setSyncedEmails),
    ]);
    if (failed.length) {
      console.warn('Account load partial failure:', failed);
      // Full first error — "tickets: <why>" beats a silent empty tab
      showToast('Some account data failed to load — ' + failed[0], 'error');
    }
  };
  useEffect(() => { load(); }, [acc.id]);

  const uploadFile = async (e) => {
    const file = e.target.files[0];
    if (!file) return;
    e.target.value = '';
    setUploading(true);
    try {
      await CRM.FilesAPI.uploadForAccount(acc.id, file);
      const fls = await CRM.FilesAPI.getByAccount(acc.id);
      setFiles(fls);
      showToast('File uploaded!', 'success');
    } catch (err) {
      showToast('Upload failed: ' + err.message, 'error');
    } finally { setUploading(false); }
  };

  const deleteFile = async (id, name) => {
    if (!confirm(`Delete "${name}"?`)) return;
    try {
      await CRM.FilesAPI.delete(id);
      setFiles(f => f.filter(x => x.id !== id));
      showToast('File deleted.');
    } catch (e) { showToast('Failed to delete file.', 'error'); }
  };

  const set = (k,v) => setForm(f => ({...f,[k]:v}));
  const setC = (k,v) => setContactForm(f => ({...f,[k]:v}));

  const save = async () => {
    setSaving(true);
    try {
      const updated = await CRM.AccountsAPI.update(acc.id, form);
      setAcc(updated);
      setEditing(false);
      showToast('Account updated!', 'success');
    } catch (e) {
      showToast('Failed to save: ' + e.message, 'error');
    } finally { setSaving(false); }
  };

  const addContact = async () => {
    if (!contactForm.name) return;
    try {
      await CRM.ContactsAPI.create({ ...contactForm, accountId: acc.id });
      setContactForm({ name:'', title:'', email:'', phone:'', primary:false });
      setShowAddContact(false);
      await load();
      showToast('Contact added!', 'success');
    } catch (e) { showToast('Failed to add contact: ' + e.message, 'error'); }
  };

  const removeContact = async (id) => {
    if (!confirm('Remove this contact?')) return;
    try {
      await CRM.ContactsAPI.delete(id);
      await load();
      showToast('Contact removed.');
    } catch (e) { showToast('Failed to remove contact.', 'error'); }
  };

  const startEditContact = c => {
    setEditingContactId(c.id);
    setEditContactForm({
      name: c.name || '', title: c.title || '',
      email: c.email || '', phone: c.phone || '',
      primary: !!c.isPrimary,
    });
  };
  const cancelEditContact = () => { setEditingContactId(null); };
  const setEC = (k, v) => setEditContactForm(f => ({ ...f, [k]: v }));
  const saveEditContact = async () => {
    if (!editContactForm.name.trim()) return showToast('Name is required.', 'error');
    try {
      await CRM.ContactsAPI.update(editingContactId, editContactForm);
      setEditingContactId(null);
      await load();
      showToast('Contact updated.', 'success');
    } catch (e) { showToast('Failed to update contact: ' + e.message, 'error'); }
  };

  const makePrimary = async (id) => {
    try {
      await CRM.ContactsAPI.update(id, { primary: true });
      await load();
      showToast('Primary contact updated.', 'success');
    } catch (e) { showToast('Failed to update primary contact.', 'error'); }
  };

  const reps = CRM.UsersAPI.getAll().filter(u => u.role === 'rep');
  const openTickets = tickets.filter(t => t.status !== 'closed');

  const recordSale = async () => {
    if (!saleForm.amount || parseFloat(saleForm.amount) <= 0) return;
    setSavingSale(true);
    try {
      const s = await CRM.AccountSalesAPI.create(acc.id, saleForm);
      setSales(prev => [s, ...prev]);
      setSaleForm({ amount: '', description: '', saleDate: new Date().toISOString().split('T')[0], isSinglePurchase: false });
      setAddingSale(false);
      showToast('Sale recorded!', 'success');
    } catch (e) { showToast('Failed to record sale: ' + e.message, 'error'); }
    finally { setSavingSale(false); }
  };

  const deleteSale = async (saleId) => {
    if (!confirm('Delete this sale record?')) return;
    try {
      await CRM.AccountSalesAPI.delete(acc.id, saleId);
      setSales(prev => prev.filter(s => s.id !== saleId));
      showToast('Sale deleted.');
    } catch (e) { showToast('Failed to delete sale.', 'error'); }
  };

  const startEditSale = (s) => {
    setEditingSale(s.id);
    setEditSaleForm({ amount: s.amount, description: s.description || '', saleDate: s.saleDate, isSinglePurchase: s.isSinglePurchase });
  };

  const updateSale = async () => {
    if (!editSaleForm.amount || parseFloat(editSaleForm.amount) <= 0) return;
    setSavingEditSale(true);
    try {
      const updated = await CRM.AccountSalesAPI.update(acc.id, editingSale, editSaleForm);
      setSales(prev => prev.map(s => s.id === editingSale ? updated : s));
      setEditingSale(null);
      showToast('Sale updated!', 'success');
    } catch (e) { showToast('Failed to update sale.', 'error'); }
    finally { setSavingEditSale(false); }
  };

  const renderAodTab = () => {
    if (!aodLoaded) {
      return (
        <div className="empty">
          <div className="empty-icon">⏳</div>
          <div className="empty-text">Loading AoD usage data…</div>
        </div>
      );
    }
    if (!acc.uri) {
      return (
        <div className="empty">
          <div className="empty-icon">🔗</div>
          <div className="empty-text">No AoD URI set for this account. Edit the Overview tab to add a URI, then re-import billing data.</div>
        </div>
      );
    }
    if (aodUsage.length === 0) {
      return (
        <div className="empty">
          <div className="empty-icon">📊</div>
          <div className="empty-text">No AoD usage data imported for this account yet.<br/>Use Admin → AoD Import to load billing spreadsheets.</div>
        </div>
      );
    }

    // Group by invoiceDate (ISO string)
    const grouped = {};
    aodUsage.forEach(row => {
      const key = row.invoiceDate;
      if (!grouped[key]) grouped[key] = [];
      grouped[key].push(row);
    });
    const periods = Object.keys(grouped).sort((a, b) => b.localeCompare(a));

    const fmtDate = (iso) => {
      if (!iso) return '—';
      const [y, m, d] = iso.split('-');
      return new Date(Number(y), Number(m) - 1, Number(d)).toLocaleDateString(undefined, { year:'numeric', month:'short', day:'numeric' });
    };
    const fmtMonth = (iso) => {
      if (!iso) return '—';
      const [y, m] = iso.split('-');
      return new Date(Number(y), Number(m) - 1, 1).toLocaleDateString(undefined, { year:'numeric', month:'long' });
    };
    const fmtNum = (n, dec) => Number(n||0).toLocaleString(undefined, { minimumFractionDigits: dec||2, maximumFractionDigits: dec||2 });

    return (
      <div style={{display:'flex',flexDirection:'column',gap:20}}>
        {periods.map(invoiceDate => {
          const rows = grouped[invoiceDate];
          const periodTotal = rows.reduce((s, r) => s + (r.total || 0), 0);
          const first = rows[0];
          return (
            <div key={invoiceDate} style={{border:'1px solid var(--g200)',borderRadius:8,overflow:'hidden'}}>
              <div style={{background:'var(--navy)',color:'white',padding:'10px 16px',display:'flex',alignItems:'center',justifyContent:'space-between',flexWrap:'wrap',gap:8}}>
                <div>
                  <div style={{fontWeight:800,fontSize:15}}>{fmtMonth(invoiceDate)}</div>
                  <div style={{fontSize:11,opacity:.65,marginTop:2}}>
                    Period: {fmtDate(first.periodFrom)} – {fmtDate(first.periodTo)}
                    {' · '}Invoice: {fmtDate(invoiceDate)}
                  </div>
                </div>
                <div style={{fontWeight:900,fontSize:20,color:'var(--green)'}}>
                  ${fmtNum(periodTotal)}
                </div>
              </div>
              <table className="tbl" style={{margin:0,borderRadius:0}}>
                <thead>
                  <tr>
                    <th style={{fontWeight:700}}>Description</th>
                    <th style={{textAlign:'right',fontWeight:700,width:100}}>Count</th>
                    <th style={{textAlign:'right',fontWeight:700,width:110}}>Unit Rate</th>
                    <th style={{textAlign:'right',fontWeight:700,width:110}}>Total</th>
                  </tr>
                </thead>
                <tbody>
                  {rows.map(r => (
                    <tr key={r.id}>
                      <td style={{fontWeight:'normal'}}>{r.description}</td>
                      <td style={{textAlign:'right',fontWeight:'normal',fontVariantNumeric:'tabular-nums'}}>{fmtNum(r.count, 4)}</td>
                      <td style={{textAlign:'right',fontWeight:'normal',fontVariantNumeric:'tabular-nums'}}>${fmtNum(r.unitValue, 4)}</td>
                      <td style={{textAlign:'right',fontWeight:700,color:'var(--green)',fontVariantNumeric:'tabular-nums'}}>${fmtNum(r.total)}</td>
                    </tr>
                  ))}
                </tbody>
              </table>
            </div>
          );
        })}
      </div>
    );
  };

  const STAT_BADGES = { open:'badge-blue', 'in-progress':'badge-purple', pending:'badge-amber', resolved:'badge-green', closed:'badge-gray' };
  const PRI_BADGES  = { low:'badge-gray', medium:'badge-amber', high:'badge-red', urgent:'badge-red' };

  return (<>
    <div className="modal-overlay" {...overlayClose(onClose)}>
      <div className="modal-panel" style={{width:'min(820px,100%)'}} onClick={e => e.stopPropagation()}>
        <div className="modal-hd">
          <div>
            <div className="modal-title">{acc.companyName}</div>
            <div style={{fontSize:12,color:'var(--g400)',marginTop:2}}>{acc.industry}{acc.address ? ` · ${acc.address}` : ''}</div>
          </div>
          <div style={{display:'flex',gap:8,alignItems:'center'}}>
            {openTickets.length > 0 && <span className="badge badge-red">{openTickets.length} open ticket{openTickets.length!==1?'s':''}</span>}
            {acc.isActive === false && <span className="badge badge-gray">Closed</span>}
            <QuickTaskAdd accountId={acc.id} showToast={showToast} />
            <button className="btn btn-sm" style={{background:'#FDF4FF',color:'#A21CAF',border:'1px solid #F5D0FE'}}
              onClick={() => setAnalyzing(true)}>✨ Analyze</button>
            <button className="btn btn-sm" style={{background:'#EFF6FF',color:'#1D4ED8',border:'1px solid #BFDBFE'}}
              onClick={() => setEmailing(true)}>✉ Email</button>
            {user.isAdmin && (
              acc.isActive === false
                ? <button className="btn btn-primary btn-sm" onClick={reopenAccount} disabled={actioning}>↺ Reopen</button>
                : <button className="btn btn-sm" style={{background:'#FEF3C7',color:'#92400E',border:'1px solid #FCD34D'}} onClick={closeAccount} disabled={actioning}>🔒 Close Account</button>
            )}
            {user.isAdmin && (
              <button className="btn btn-sm" style={{background:'#fee2e2',color:'var(--red)',border:'1px solid #FECACA'}} onClick={deleteAccount} disabled={actioning}>🗑 Delete</button>
            )}
            <button className="modal-close" onClick={onClose}>×</button>
          </div>
        </div>

        <div style={{padding:'0 24px',borderBottom:'1px solid var(--g200)'}}>
          <div className="tabs" style={{margin:0}}>
            {['overview','contacts','tickets','sales','files','activity','aod','orders','proposals']
              .filter(t => t !== 'aod' || CRM.connectors?.aod !== false).map(t => (
              <button key={t} className={`tab-btn${tab===t?' active':''}`} onClick={() => { setTab(t); if(t==='aod') loadAod(); }}>
                {t==='overview'  ?'📋 Overview'
                  :t==='contacts'?`👤 Contacts (${contacts.length})`
                  :t==='tickets' ?`🎫 Tickets (${tickets.length})`
                  :t==='sales'   ?`💰 Sales (${sales.length})`
                  :t==='files'   ?`📎 Files (${files.length})`
                  :t==='activity'?`💬 Activity (${activities.length + syncedEmails.length})`
                  :t==='aod'     ?'📊 AoD Usage'
                  :t==='orders'  ?`🛒 Orders (${orders.length})`
                  :`📄 Proposals (${proposals.length})`}
              </button>
            ))}
          </div>
        </div>

        <div className="modal-body">
          {/* OVERVIEW */}
          {tab === 'overview' && (
            <div>
              <div style={{display:'grid',gridTemplateColumns:'repeat(4,1fr)',gap:12,marginBottom:20}}>
                <div style={{background:'var(--off)',borderRadius:6,padding:'12px 14px'}}>
                  <div style={{fontSize:10,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--g400)',marginBottom:4}}>Contract Value</div>
                  <div style={{fontSize:22,fontWeight:800,color:'var(--green)'}}>${(acc.contractValue||0).toLocaleString()}</div>
                </div>
                <div style={{background:'var(--off)',borderRadius:6,padding:'12px 14px'}}>
                  <div style={{fontSize:10,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--g400)',marginBottom:4}}>Single Purchase</div>
                  <div style={{fontSize:22,fontWeight:800,color:'var(--navy)'}}>{acc.singlePurchaseValue ? '$'+Number(acc.singlePurchaseValue).toLocaleString() : '—'}</div>
                </div>
                <div style={{background:'var(--off)',borderRadius:6,padding:'12px 14px'}}>
                  <div style={{fontSize:10,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--g400)',marginBottom:4}}>Contract Start</div>
                  <div style={{fontSize:14,fontWeight:700,color:'var(--navy)'}}>{acc.contractStart||'—'}</div>
                </div>
                <div style={{background:'var(--off)',borderRadius:6,padding:'12px 14px'}}>
                  <div style={{fontSize:10,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--g400)',marginBottom:4}}>Contract End</div>
                  <div style={{fontSize:14,fontWeight:700,color:'var(--navy)'}}>{acc.contractEnd||'—'}</div>
                </div>
              </div>

              {!editing ? (
                <>
                  <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:20,marginBottom:16}}>
                    <div>
                      <div className="form-section" style={{marginTop:0}}>Account Details</div>
                      <InfoRow label="Industry" value={acc.industry} />
                      <InfoRow label="Employees" value={acc.employeeCount} />
                      <InfoRow label="Address" value={acc.address} />
                      {CRM.connectors?.aod !== false && <InfoRow label="AoD URI" value={acc.uri} />}
                    </div>
                    <div>
                      <div className="form-section" style={{marginTop:0}}>Assignment</div>
                      <InfoRow label="Rep" value={(acc.assignedRep || CRM.UsersAPI.getById(acc.assignedRepId))?.name} />
                      <InfoRow label="Lead Ref" value={acc.leadId} />
                    </div>
                  </div>
                  {acc.notes && <div style={{background:'var(--off)',borderRadius:6,padding:'12px 14px',fontSize:13,color:'var(--g600)',lineHeight:1.7}}><NoteText text={acc.notes} /></div>}
                  <button className="btn btn-primary btn-sm" style={{marginTop:16}} onClick={() => setEditing(true)}>✏️ Edit</button>
                </>
              ) : (
                <>
                  <div className="fg fg-2">
                    <div className="field"><label>Company Name</label><input value={form.companyName||''} onChange={e=>set('companyName',e.target.value)} /></div>
                    <div className="field"><label>Industry</label>
                      <select value={form.industry||''} onChange={e=>set('industry',e.target.value)}>
                        <option value="">— Select —</option>
                        {CRM.INDUSTRIES.map(i=><option key={i}>{i}</option>)}
                      </select>
                    </div>
                  </div>
                  <div className="fg fg-2">
                    <div className="field"><label>Contract Value ($)</label><input type="number" value={form.contractValue||''} onChange={e=>set('contractValue',parseFloat(e.target.value)||0)} /></div>
                    <div className="field"><label>Single Purchase Value ($)</label><input type="number" value={form.singlePurchaseValue||''} onChange={e=>set('singlePurchaseValue',parseFloat(e.target.value)||0)} placeholder="0" /></div>
                  </div>
                  <div className="fg fg-2">
                    <div className="field"><label>Employee Count</label>
                      <select value={form.employeeCount||''} onChange={e=>set('employeeCount',e.target.value)}>
                        {CRM.EMPLOYEE_COUNTS.map(v=><option key={v}>{v}</option>)}
                      </select>
                    </div>
                  </div>
                  <div className="fg fg-2">
                    <div className="field"><label>Contract Start</label><input type="date" value={form.contractStart||''} onChange={e=>set('contractStart',e.target.value)} /></div>
                    <div className="field"><label>Contract End</label><input type="date" value={form.contractEnd||''} onChange={e=>set('contractEnd',e.target.value)} /></div>
                  </div>
                  <div className="fg fg-2">
                    <div className="field"><label>Address 1</label><input value={form.address1||''} onChange={e=>set('address1',e.target.value)} /></div>
                    <div className="field"><label>Address 2 <span style={{fontWeight:400,color:'var(--g400)',fontSize:11}}>(suite, floor…)</span></label><input value={form.address2||''} onChange={e=>set('address2',e.target.value)} /></div>
                  </div>
                  <div style={{display:'flex',gap:8}}>
                    <div className="field" style={{flex:'2 1 0'}}><label>City</label><input value={form.city||''} onChange={e=>set('city',e.target.value)} /></div>
                    <div className="field" style={{width:64}}><label>State</label><input value={form.state||''} onChange={e=>set('state',e.target.value)} maxLength={2} style={{textTransform:'uppercase'}} /></div>
                    <div className="field" style={{width:110}}><label>Zip Code</label><input value={form.zip||''} onChange={e=>set('zip',e.target.value)} maxLength={10} /></div>
                  </div>
                  {user.role==='admin' && <div className="fg fg-1"><div className="field"><label>Assigned Rep</label>
                    <select value={form.assignedRepId||''} onChange={e=>set('assignedRepId',e.target.value)}>
                      {reps.map(r=><option key={r.id} value={r.id}>{r.name}</option>)}
                    </select>
                  </div></div>}
                  {CRM.connectors?.aod !== false && (
                  <div className="fg fg-2">
                    <div className="field">
                      <label>AoD URI <span style={{fontWeight:400,color:'var(--g400)',fontSize:11}}>(used for AoD billing import matching)</span></label>
                      <input value={form.uri||''} onChange={e=>set('uri',e.target.value)} placeholder="e.g. 25-cintime" />
                    </div>
                  </div>
                  )}
                  <div className="fg fg-1"><div className="field"><label>Notes</label><textarea value={form.notes||''} onChange={e=>set('notes',e.target.value)} /></div></div>
                </>
              )}
            </div>
          )}

          {/* CONTACTS */}
          {tab === 'contacts' && (
            <div>
              <div style={{display:'flex',justifyContent:'flex-end',marginBottom:16}}>
                <button className="btn btn-primary btn-sm" onClick={() => setShowAddContact(!showAddContact)}>+ Add Contact</button>
              </div>
              {showAddContact && (
                <div style={{background:'var(--off)',borderRadius:8,padding:16,marginBottom:16,borderLeft:'3px solid var(--red)'}}>
                  <div style={{fontWeight:700,fontSize:12,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--red)',marginBottom:12}}>New Contact</div>
                  <div className="fg fg-2">
                    <div className="field"><label>Full Name *</label><input value={contactForm.name} onChange={e=>setC('name',e.target.value)} /></div>
                    <div className="field"><label>Title</label><input value={contactForm.title} onChange={e=>setC('title',e.target.value)} /></div>
                  </div>
                  <div className="fg fg-2">
                    <div className="field"><label>Email</label><input type="email" value={contactForm.email} onChange={e=>setC('email',e.target.value)} /></div>
                    <div className="field"><label>Phone</label><input value={contactForm.phone} onChange={e=>setC('phone',e.target.value)} /></div>
                  </div>
                  <div style={{display:'flex',gap:10,alignItems:'center',marginBottom:12}}>
                    <input type="checkbox" id="primary-chk" checked={contactForm.primary} onChange={e=>setC('primary',e.target.checked)} />
                    <label htmlFor="primary-chk" style={{fontSize:13,color:'var(--g600)'}}>Set as primary contact</label>
                  </div>
                  <div style={{display:'flex',gap:8}}>
                    <button className="btn btn-primary btn-sm" onClick={addContact}>Add Contact</button>
                    <button className="btn btn-ghost btn-sm" onClick={() => setShowAddContact(false)}>Cancel</button>
                  </div>
                </div>
              )}
              {contacts.length === 0 && <div className="empty"><div className="empty-icon">👤</div><div className="empty-text">No contacts yet.</div></div>}
              <div style={{display:'flex',flexDirection:'column',gap:10}}>
                {contacts.slice(0, contactCap).map(c => editingContactId === c.id ? (
                  <div key={c.id} style={{background:'#F8FAFC',border:'1.5px solid var(--navy)',borderRadius:8,padding:14}}>
                    <div style={{fontWeight:700,fontSize:12,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--navy)',marginBottom:10}}>Edit Contact</div>
                    <div className="fg fg-2">
                      <div className="field"><label>Full Name *</label><input value={editContactForm.name} onChange={e=>setEC('name',e.target.value)} /></div>
                      <div className="field"><label>Title</label><input value={editContactForm.title} onChange={e=>setEC('title',e.target.value)} /></div>
                    </div>
                    <div className="fg fg-2">
                      <div className="field"><label>Email</label><input type="email" value={editContactForm.email} onChange={e=>setEC('email',e.target.value)} /></div>
                      <div className="field"><label>Phone</label><input value={editContactForm.phone} onChange={e=>setEC('phone',e.target.value)} /></div>
                    </div>
                    <div style={{display:'flex',gap:10,alignItems:'center',marginBottom:10}}>
                      <input type="checkbox" id={`acc-edit-primary-${c.id}`} checked={editContactForm.primary} onChange={e=>setEC('primary',e.target.checked)} />
                      <label htmlFor={`acc-edit-primary-${c.id}`} style={{fontSize:13,color:'var(--g600)'}}>Primary contact</label>
                    </div>
                    <div style={{display:'flex',gap:8}}>
                      <button className="btn btn-primary btn-sm" onClick={saveEditContact}>Save</button>
                      <button className="btn btn-ghost btn-sm" onClick={cancelEditContact}>Cancel</button>
                    </div>
                  </div>
                ) : (
                  <div key={c.id} style={{background:'white',border:'1px solid var(--g200)',borderRadius:8,padding:'14px 16px',display:'flex',alignItems:'center',gap:14}}>
                    <div style={{width:40,height:40,borderRadius:'50%',background:c.primary?'var(--red)':'var(--navy)',color:'white',display:'flex',alignItems:'center',justifyContent:'center',fontSize:14,fontWeight:700,flexShrink:0}}>{(c.name || '?').charAt(0)}</div>
                    <div style={{flex:1}}>
                      <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:2}}>
                        <span style={{fontSize:14,fontWeight:700,color:'var(--navy)'}}>{c.name}</span>
                        {c.primary && <span className="badge badge-red" style={{fontSize:10}}>Primary</span>}
                      </div>
                      <div style={{fontSize:12,color:'var(--g400)'}}>{c.title}</div>
                      <div style={{display:'flex',gap:12,marginTop:4}}>
                        {c.email && <a href={`mailto:${c.email}`} style={{fontSize:12,color:'var(--navy)',textDecoration:'none'}} onClick={e=>e.stopPropagation()}>📧 {c.email}</a>}
                        {c.phone && <a href={`tel:${c.phone}`} style={{fontSize:12,color:'var(--navy)',textDecoration:'none'}} onClick={e=>e.stopPropagation()}>📞 {c.phone}</a>}
                      </div>
                    </div>
                    <div style={{display:'flex',gap:6}}>
                      <button className="btn btn-ghost btn-xs" onClick={() => startEditContact(c)}>✏ Edit</button>
                      {!c.primary && <button className="btn btn-ghost btn-xs" onClick={() => makePrimary(c.id)}>Make Primary</button>}
                      <button className="btn btn-xs" style={{background:'#fee2e2',color:'var(--red)',border:'none'}} onClick={() => removeContact(c.id)}>Remove</button>
                    </div>
                  </div>
                ))}
              </div>
              {contacts.length > contactCap && (
                <button className="btn btn-ghost btn-sm" style={{marginTop:10}} onClick={() => setContactCap(c => c + 100)}>
                  Show more ({contacts.length - contactCap} more)
                </button>
              )}
            </div>
          )}

          {/* TICKETS */}
          {tab === 'tickets' && (
            <div>
              {tickets.length === 0
                ? <div className="empty"><div className="empty-icon">🎫</div><div className="empty-text">No support tickets for this account.</div></div>
                : (() => {
                    // Newest first, and render only a bounded slice so an account
                    // with hundreds of tickets never mounts them all at once.
                    const sorted = [...tickets].sort((a,b) => new Date(b.updatedAt) - new Date(a.updatedAt));
                    const shown = sorted.slice(0, ticketCap);
                    return (
                      <React.Fragment>
                        <div style={{overflowX:'auto'}}>
                          <table className="tbl">
                            <thead><tr><th style={{width:56}}>#</th><th>Subject</th><th>Category</th><th>Priority</th><th>Status</th><th>Assigned To</th><th>Updated</th></tr></thead>
                            <tbody>
                              {shown.map(t => {
                                const tech = t.assignedTech || CRM.UsersAPI.getById(t.assignedTechId);
                                return (
                                  <tr key={t.id}>
                                    <td style={{fontFamily:'monospace',fontWeight:700,color:'var(--g600)'}}>{t.ticketNumber ?? '—'}</td>
                                    <td>{t.subject}</td>
                                    <td style={{fontWeight:'normal'}}>{t.category}</td>
                                    <td><span className={`badge ${PRI_BADGES[t.priority]||'badge-gray'}`}>{t.priority}</span></td>
                                    <td><span className={`badge ${STAT_BADGES[t.status]||'badge-gray'}`}>{t.status}</span></td>
                                    <td style={{fontWeight:'normal'}}>{tech?.name||'—'}</td>
                                    <td style={{fontWeight:'normal',fontSize:12,color:'var(--g400)'}}>{new Date(t.updatedAt).toLocaleDateString()}</td>
                                  </tr>
                                );
                              })}
                            </tbody>
                          </table>
                        </div>
                        {sorted.length > shown.length && (
                          <button className="btn btn-ghost btn-sm" style={{marginTop:10}} onClick={() => setTicketCap(c => c + 50)}>
                            Show more ({sorted.length - shown.length} more)
                          </button>
                        )}
                      </React.Fragment>
                    );
                  })()}
            </div>
          )}

          {/* SALES */}
          {tab === 'sales' && (
            <div>
              {(() => {
                const recurring = sales.filter(s=>!s.isSinglePurchase).reduce((t,s)=>t+(s.amount||0),0);
                const single    = sales.filter(s=> s.isSinglePurchase).reduce((t,s)=>t+(s.amount||0),0);
                const total     = recurring + single;
                return (
                  <div style={{background:'var(--navy)',borderRadius:8,padding:'16px 20px',marginBottom:20,display:'flex',alignItems:'center',justifyContent:'space-between',flexWrap:'wrap',gap:12}}>
                    <div style={{display:'flex',gap:28,flexWrap:'wrap'}}>
                      <div>
                        <div style={{fontSize:11,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'rgba(255,255,255,.45)',marginBottom:4}}>Total Sales</div>
                        <div style={{fontSize:26,fontWeight:900,color:'var(--green)'}}>${total.toLocaleString(undefined,{minimumFractionDigits:2,maximumFractionDigits:2})}</div>
                      </div>
                      {single > 0 && <>
                        <div>
                          <div style={{fontSize:11,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'rgba(255,255,255,.45)',marginBottom:4}}>Recurring</div>
                          <div style={{fontSize:18,fontWeight:800,color:'white'}}>${recurring.toLocaleString(undefined,{minimumFractionDigits:2,maximumFractionDigits:2})}</div>
                        </div>
                        <div>
                          <div style={{fontSize:11,fontWeight:700,letterSpacing:'.1em',textTransform:'uppercase',color:'rgba(255,255,255,.45)',marginBottom:4}}>Single Purchase</div>
                          <div style={{fontSize:18,fontWeight:800,color:'#FCD34D'}}>${single.toLocaleString(undefined,{minimumFractionDigits:2,maximumFractionDigits:2})}</div>
                        </div>
                      </>}
                    </div>
                    <button className="btn btn-primary btn-sm" onClick={() => setAddingSale(!addingSale)}>+ Record Sale</button>
                  </div>
                );
              })()}

              {addingSale && (
                <div style={{background:'var(--off)',borderRadius:8,padding:16,marginBottom:16,borderLeft:'3px solid var(--green)'}}>
                  <div style={{fontWeight:700,fontSize:12,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--green)',marginBottom:12}}>New Sale</div>
                  <div className="fg fg-3">
                    <div className="field"><label>Amount ($) *</label>
                      <input type="number" min="0" step="0.01" value={saleForm.amount} onChange={e=>setSaleForm(f=>({...f,amount:e.target.value}))} placeholder="0.00" />
                    </div>
                    <div className="field"><label>Sale Date</label>
                      <input type="date" value={saleForm.saleDate} onChange={e=>setSaleForm(f=>({...f,saleDate:e.target.value}))} />
                    </div>
                    <div className="field"><label>Description</label>
                      <input value={saleForm.description} onChange={e=>setSaleForm(f=>({...f,description:e.target.value}))} placeholder="e.g. Annual renewal, upsell…" />
                    </div>
                  </div>
                  <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:12}}>
                    <input type="checkbox" id="single-purchase-chk" checked={saleForm.isSinglePurchase} onChange={e=>setSaleForm(f=>({...f,isSinglePurchase:e.target.checked}))} />
                    <label htmlFor="single-purchase-chk" style={{fontSize:13,color:'var(--g600)',cursor:'pointer'}}>Single / one-time purchase (non-recurring)</label>
                  </div>
                  <div style={{display:'flex',gap:8}}>
                    <button className="btn btn-green btn-sm" onClick={recordSale} disabled={savingSale}>{savingSale?'Saving…':'Save Sale'}</button>
                    <button className="btn btn-ghost btn-sm" onClick={() => setAddingSale(false)}>Cancel</button>
                  </div>
                </div>
              )}

              {sales.length === 0 && !addingSale && (
                <div className="empty"><div className="empty-icon">💰</div><div className="empty-text">No sales recorded yet. Click "+ Record Sale" to log one.</div></div>
              )}

              <div style={{display:'flex',flexDirection:'column',gap:8}}>
                {sales.map(s => (
                  <div key={s.id} style={{background:'white',borderRadius:8,border:`1px solid ${editingSale===s.id ? 'var(--navy)' : 'var(--g200)'}`,overflow:'hidden'}}>
                    {editingSale === s.id ? (
                      <div style={{padding:'14px 16px',borderLeft:'3px solid var(--navy)'}}>
                        <div style={{fontWeight:700,fontSize:12,letterSpacing:'.1em',textTransform:'uppercase',color:'var(--navy)',marginBottom:12}}>Edit Sale</div>
                        <div className="fg fg-3">
                          <div className="field"><label>Amount ($) *</label>
                            <input type="number" min="0" step="0.01" value={editSaleForm.amount} onChange={e=>setEditSaleForm(f=>({...f,amount:e.target.value}))} />
                          </div>
                          <div className="field"><label>Sale Date</label>
                            <input type="date" value={editSaleForm.saleDate} onChange={e=>setEditSaleForm(f=>({...f,saleDate:e.target.value}))} />
                          </div>
                          <div className="field"><label>Description</label>
                            <input value={editSaleForm.description} onChange={e=>setEditSaleForm(f=>({...f,description:e.target.value}))} placeholder="e.g. Annual renewal…" />
                          </div>
                        </div>
                        <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:12}}>
                          <input type="checkbox" id={`sp-edit-${s.id}`} checked={editSaleForm.isSinglePurchase} onChange={e=>setEditSaleForm(f=>({...f,isSinglePurchase:e.target.checked}))} />
                          <label htmlFor={`sp-edit-${s.id}`} style={{fontSize:13,color:'var(--g600)',cursor:'pointer'}}>Single / one-time purchase (non-recurring)</label>
                        </div>
                        <div style={{display:'flex',gap:8}}>
                          <button className="btn btn-primary btn-sm" onClick={updateSale} disabled={savingEditSale}>{savingEditSale?'Saving…':'Save Changes'}</button>
                          <button className="btn btn-ghost btn-sm" onClick={() => setEditingSale(null)}>Cancel</button>
                        </div>
                      </div>
                    ) : (
                      <div style={{display:'flex',alignItems:'center',gap:14,padding:'14px 16px'}}>
                        <div style={{width:44,height:44,borderRadius:8,background: s.isSinglePurchase ? '#FEF3C7' : '#ECFDF5',display:'flex',alignItems:'center',justifyContent:'center',fontSize:20,flexShrink:0}}>{s.isSinglePurchase ? '🛒' : '💰'}</div>
                        <div style={{flex:1}}>
                          <div style={{display:'flex',alignItems:'center',gap:8}}>
                            <div style={{fontSize:16,fontWeight:800,color:'var(--green)'}}>${(s.amount||0).toLocaleString(undefined,{minimumFractionDigits:2,maximumFractionDigits:2})}</div>
                            {s.isSinglePurchase && <span style={{fontSize:10,fontWeight:700,padding:'2px 7px',borderRadius:10,background:'#FEF3C7',color:'#92400E',border:'1px solid #FCD34D'}}>Single Purchase</span>}
                          </div>
                          <div style={{fontSize:12,color:'var(--g600)',marginTop:2}}>{s.description||'—'}</div>
                          <div style={{fontSize:11,color:'var(--g400)',marginTop:2}}>{s.saleDate} · Recorded by {s.recordedByName}</div>
                        </div>
                        <div style={{display:'flex',gap:6,flexShrink:0}}>
                          <button onClick={() => startEditSale(s)} className="btn btn-ghost btn-xs">✏️ Edit</button>
                          {user.isAdmin && (
                            <button onClick={() => deleteSale(s.id)} className="btn btn-xs" style={{background:'#fee2e2',color:'var(--red)',border:'none'}}>✕</button>
                          )}
                        </div>
                      </div>
                    )}
                  </div>
                ))}
              </div>
            </div>
          )}

          {/* FILES */}
          {tab === 'files' && (
            <div>
              <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:16}}>
                <div style={{fontSize:13,color:'var(--g600)'}}>Attach contracts, documents, or images to this account.</div>
                <label className="btn btn-primary btn-sm" style={{cursor:'pointer'}}>
                  {uploading ? 'Uploading…' : '+ Upload File'}
                  <input type="file" accept=".pdf,.doc,.docx,.xls,.xlsx,.png,.jpg,.jpeg,.gif,.txt,.csv" onChange={uploadFile} style={{display:'none'}} disabled={uploading} />
                </label>
              </div>
              {files.length === 0 && !uploading && (
                <div className="empty"><div className="empty-icon">📎</div><div className="empty-text">No files attached yet.</div></div>
              )}
              <div style={{display:'flex',flexDirection:'column',gap:8}}>
                {files.map(f => (
                  <div key={f.id} style={{display:'flex',alignItems:'center',gap:12,padding:'10px 14px',background:'var(--off)',borderRadius:6,border:'1px solid var(--g200)'}}>
                    <span style={{fontSize:20}}>{fileIcon(f.contentType, f.fileName)}</span>
                    <div style={{flex:1,minWidth:0}}>
                      <div style={{fontSize:13,fontWeight:600,color:'var(--navy)',overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'}}>{f.fileName}</div>
                      <div style={{fontSize:11,color:'var(--g400)'}}>{fmtSize(f.fileSize)} · {f.uploaderName} · {new Date(f.uploadedAt).toLocaleDateString()}</div>
                    </div>
                    <a href={CRM.FilesAPI.downloadUrl(f.id)} target="_blank" className="btn btn-ghost btn-xs" style={{flexShrink:0}}>⬇ Download</a>
                    <button onClick={() => deleteFile(f.id, f.fileName)} className="btn btn-xs" style={{background:'#fee2e2',color:'var(--red)',border:'none',flexShrink:0}}>✕</button>
                  </div>
                ))}
              </div>
            </div>
          )}

          {/* ACTIVITY */}
          {tab === 'activity' && (
            <div>
              <div className="add-activity">
                <div style={{display:'flex',gap:8,marginBottom:10,flexWrap:'wrap'}}>
                  {ACT_TYPES.map(t => (
                    <button key={t} onClick={() => setActType(t)}
                      style={{padding:'5px 12px',fontSize:12,fontWeight:600,borderRadius:5,cursor:'pointer',fontFamily:'var(--font)',
                        background: actType===t ? 'var(--navy)' : 'white',
                        color: actType===t ? 'white' : 'var(--g600)',
                        border: actType===t ? '1.5px solid var(--navy)' : '1.5px solid var(--g200)'}}>
                      {ACT_ICONS[t]} {t.charAt(0).toUpperCase()+t.slice(1)}
                    </button>
                  ))}
                </div>
                <div className="add-act-row">
                  <textarea className="field" style={{flex:1,border:'1.5px solid var(--g200)',borderRadius:5,padding:'9px 12px',fontSize:13,fontFamily:'var(--font)',color:'var(--navy)',resize:'none',height:64,outline:'none',background:'white'}}
                    placeholder={`Log a ${actType}…`} value={actText} onChange={e=>setActText(e.target.value)}
                    onKeyDown={e=>{ if(e.key==='Enter'&&(e.ctrlKey||e.metaKey)) addActivity(); }} />
                  <button className="btn btn-primary btn-sm" onClick={addActivity}>Log</button>
                </div>
              </div>
              <div className="activity-list" style={{marginTop:16}}>
                {activities.length === 0 && syncedEmails.length === 0 && (
                  <div className="empty"><div className="empty-icon">💬</div><div className="empty-text">No activity yet. Log calls, emails, meetings, and notes here.</div></div>
                )}
                {(() => {
                  // Bounded render — a big account can have thousands of
                  // activities + synced emails (browser OOM otherwise).
                  const full = [
                    ...activities.map(a => ({ kind: 'act', at: a.createdAt, a })),
                    ...syncedEmails.map(m => ({ kind: 'mail', at: m.sentAt || m.createdAt, m })),
                  ].sort((x, y) => new Date(y.at) - new Date(x.at));
                  const timeline = full.slice(0, actCap);
                  const more = full.length - timeline.length;
                  const showMore = more > 0 ? (
                    <button key="__more" className="btn btn-ghost btn-sm" style={{marginTop:10}}
                      onClick={() => setActCap(c => c + 100)}>Show more ({more} more)</button>
                  ) : null;
                  return [...timeline.map(item => item.kind === 'act' ? (
                    <div key={item.a.id} className="activity-item">
                      <div className={`act-icon act-${item.a.type}`}>{ACT_ICONS[item.a.type]||'📌'}</div>
                      <div className="act-content">
                        <div className="act-text"><NoteText text={item.a.content} /></div>
                        <div className="act-meta">{item.a.userName} · {new Date(item.a.createdAt).toLocaleString()}</div>
                      </div>
                    </div>
                  ) : (
                    <div key={`mail-${item.m.id}`} className="activity-item">
                      <div className="act-icon act-email">{item.m.direction === 'in' ? '📥' : '📤'}</div>
                      <div className="act-content" style={{minWidth:0}}>
                        <div className="act-text" style={{fontWeight:700}}>{item.m.subject || '(no subject)'}</div>
                        <div style={{fontSize:12,color:'var(--g400)',whiteSpace:'nowrap',overflow:'hidden',textOverflow:'ellipsis'}}>
                          {item.m.fromName || item.m.fromAddress} → {item.m.toAddresses}
                        </div>
                        {item.m.bodyPreview && <div className="act-text" style={{marginTop:2}}><NoteText text={item.m.bodyPreview} limit={200} /></div>}
                        <div className="act-meta">
                          {new Date(item.at).toLocaleString()}
                          {item.m.webLink && <> · <a href={item.m.webLink} target="_blank" rel="noreferrer" style={{color:'var(--blue)',fontSize:11}}>Open in Outlook ↗</a></>}
                        </div>
                      </div>
                    </div>
                  )), showMore];
                })()}
              </div>
            </div>
          )}

          {/* AOD USAGE */}
          {tab === 'aod' && renderAodTab()}

          {/* ORDER FORMS */}
          {tab === 'orders' && (
            <AccountOrderFormsTab account={acc} user={user} showToast={showToast} />
          )}

          {/* PROPOSALS */}
          {tab === 'proposals' && (
            <AccountProposalsTab account={acc} user={user} showToast={showToast}
              onChanged={() => CRM.ProposalFormsAPI.getByAccount(acc.id).then(setProposals).catch(() => {})} />
          )}
        </div>

        {editing && (
          <div className="modal-footer">
            <button className="btn btn-ghost" onClick={() => { setEditing(false); setForm({...acc}); }}>Cancel</button>
            <button className="btn btn-primary" onClick={save} disabled={saving}>{saving ? 'Saving…' : 'Save Changes'}</button>
          </div>
        )}
      </div>
    </div>

    {analyzing && <AnalyzeModal
      title={`Account Analysis — ${acc.companyName}`}
      payload={{ type:'account', id: acc.id }}
      onClose={() => setAnalyzing(false)}
    />}
    {emailing && <SendEmailModal
      toEmail={(contacts.find(c => c.isPrimary) || contacts[0])?.email || ''}
      toName={(contacts.find(c => c.isPrimary) || contacts[0])?.name || acc.companyName}
      accountId={acc.id}
      onClose={() => setEmailing(false)}
      showToast={showToast}
    />}
  </>);

}

function AddAccountModal({ user, onClose, onSave }) {
  const reps = CRM.UsersAPI.getAll().filter(u => u.role === 'rep');
  const [wonLeads, setWonLeads] = useState([]);
  const [form, setForm] = useState({
    companyName:'', address1:'', address2:'', city:'', state:'', zip:'', industry:'', employeeCount:'',
    assignedRepId: user.role==='rep' && !user.isAdmin ? user.id : (reps[0]?.id||''),
    contractValue:'', contractStart:'', contractEnd:'', notes:'', leadId:'', singlePurchaseValue:''
  });
  const [saving, setSaving] = useState(false);
  const set = (k,v) => setForm(f => ({...f,[k]:v}));

  useEffect(() => {
    CRM.LeadsAPI.getAll().then(leads => setWonLeads(leads.filter(l => l.stage === 'won' && !l.convertedAccountId))).catch(() => {});
  }, []);

  const fillFromLead = async (leadId) => {
    if (!leadId) return;
    try {
      const lead = await CRM.LeadsAPI.getById(leadId);
      // Leads still store a single address string — best-effort parse into parts
      const p = lead.address ? parseAccountAddress(lead.address) : null;
      setForm(f => ({ ...f, leadId, companyName: lead.companyName||f.companyName,
        address1: p ? p.address : f.address1, city: p ? p.city : f.city,
        state: p ? p.state : f.state, zip: p ? p.zip : f.zip,
        industry: lead.industry||f.industry, employeeCount: lead.employeeCount||f.employeeCount, assignedRepId: lead.assignedRepId||f.assignedRepId, contractValue: lead.estimatedValue||f.contractValue }));
    } catch { /* ignore */ }
  };

  return (
    <div className="modal-overlay" {...overlayClose(onClose)}>
      <div className="modal-panel" onClick={e=>e.stopPropagation()}>
        <div className="modal-hd"><div className="modal-title">Add Account</div><button className="modal-close" onClick={onClose}>×</button></div>
        <div className="modal-body">
          <div className="fg fg-1">
            <div className="field"><label>Convert from Won Lead (optional)</label>
              <select onChange={e => fillFromLead(e.target.value)}>
                <option value="">— Select a won lead —</option>
                {wonLeads.map(l => <option key={l.id} value={l.id}>{l.companyName}</option>)}
              </select>
            </div>
          </div>
          <div className="fg fg-2">
            <div className="field"><label>Company Name *</label><input value={form.companyName} onChange={e=>set('companyName',e.target.value)} /></div>
            <div className="field"><label>Industry</label>
              <select value={form.industry} onChange={e=>set('industry',e.target.value)}>
                <option value="">— Select —</option>
                {CRM.INDUSTRIES.map(i=><option key={i}>{i}</option>)}
              </select>
            </div>
          </div>
          <div className="fg fg-2">
            <div className="field"><label>Contract Value ($)</label><input type="number" value={form.contractValue} onChange={e=>set('contractValue',e.target.value)} /></div>
            <div className="field"><label>Single Purchase Value ($)</label><input type="number" value={form.singlePurchaseValue} onChange={e=>set('singlePurchaseValue',e.target.value)} placeholder="0" /></div>
          </div>
          <div className="fg fg-2">
            <div className="field"><label>Assigned Rep</label>
              <select value={form.assignedRepId} onChange={e=>set('assignedRepId',e.target.value)} disabled={user.role==='rep' && !user.isAdmin}>
                {reps.map(r=><option key={r.id} value={r.id}>{r.name}</option>)}
              </select>
            </div>
          </div>
          <div className="fg fg-2">
            <div className="field"><label>Contract Start</label><input type="date" value={form.contractStart} onChange={e=>set('contractStart',e.target.value)} /></div>
            <div className="field"><label>Contract End</label><input type="date" value={form.contractEnd} onChange={e=>set('contractEnd',e.target.value)} /></div>
          </div>
          <div className="fg fg-2">
            <div className="field"><label>Address 1</label><input value={form.address1} onChange={e=>set('address1',e.target.value)} /></div>
            <div className="field"><label>Address 2 <span style={{fontWeight:400,color:'var(--g400)',fontSize:11}}>(suite, floor…)</span></label><input value={form.address2} onChange={e=>set('address2',e.target.value)} /></div>
          </div>
          <div style={{display:'flex',gap:8}}>
            <div className="field" style={{flex:'2 1 0'}}><label>City</label><input value={form.city} onChange={e=>set('city',e.target.value)} /></div>
            <div className="field" style={{width:64}}><label>State</label><input value={form.state} onChange={e=>set('state',e.target.value)} maxLength={2} style={{textTransform:'uppercase'}} /></div>
            <div className="field" style={{width:110}}><label>Zip Code</label><input value={form.zip} onChange={e=>set('zip',e.target.value)} maxLength={10} /></div>
          </div>
          <div className="fg fg-1"><div className="field"><label>Notes</label><textarea value={form.notes} onChange={e=>set('notes',e.target.value)} /></div></div>
        </div>
        <div className="modal-footer">
          <button className="btn btn-ghost" onClick={onClose}>Cancel</button>
          <button className="btn btn-primary" disabled={saving}
            onClick={async () => {
              if (!form.companyName) return;
              setSaving(true);
              try { await onSave({...form, contractValue: parseFloat(form.contractValue)||0, singlePurchaseValue: parseFloat(form.singlePurchaseValue)||0}); }
              finally { setSaving(false); }
            }}>{saving ? 'Creating…' : 'Create Account'}</button>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { Accounts, AccountDetailModal, AddAccountModal });
