/* global React */

// AI-chat wireframe primitives — 3-pane shell, message bubbles, mention pills,
// interactive input with @-popover, doc-preview right panel.

const { useState, useRef, useEffect } = React;

// ── real DataDoc menu icons (from product) ───────────────────────
const II = {
  templates: ['30 30', <path key="a" fillRule="evenodd" clipRule="evenodd" d="M8.1438 5.27376C6.97845 5.83018 7.00003 5.64673 7.00003 15.0002C7.00003 22.6462 7.02438 23.4065 7.28593 23.9067C7.85414 24.9939 7.89942 25 15.4998 25C21.6312 25 22.3387 24.9738 22.8557 24.7267C23.9887 24.1858 23.9995 24.1142 23.9997 17.1081L24 10.8564L20.9334 7.92819L17.8669 5L13.2913 5.00031C9.26289 5.00047 8.6476 5.03313 8.1438 5.27376ZM8.56407 6.4955C8.33702 6.71254 8.30727 7.70022 8.30727 15.0002C8.30727 22.3003 8.33702 23.2879 8.56407 23.505C8.78933 23.7201 9.64605 23.7504 15.4998 23.7504C21.3535 23.7504 22.2102 23.7201 22.4355 23.505C22.6596 23.2906 22.6923 22.5265 22.6923 17.4892V11.7189H20.0278C18.1734 11.7189 17.3036 11.6619 17.1671 11.5314C17.0306 11.4009 16.971 10.5695 16.971 8.79696V6.25003H12.8959C9.40935 6.25003 8.78393 6.2855 8.56407 6.4955ZM18.2787 8.79196V10.4689H19.9951C20.9391 10.4689 21.7115 10.45 21.7115 10.427C21.7115 10.404 20.9391 9.64933 19.9951 8.75009L18.2787 7.11505V8.79196Z" fill="currentColor"/>],
  documents: ['30 30', <React.Fragment key="a"><path fillRule="evenodd" clipRule="evenodd" d="M8.1438 5.27376C6.97845 5.83018 7.00003 5.64673 7.00003 15.0002C7.00003 22.6462 7.02438 23.4065 7.28593 23.9067C7.85414 24.9939 7.89942 25 15.4998 25C21.6312 25 22.3387 24.9738 22.8557 24.7267C23.9887 24.1858 23.9995 24.1142 23.9997 17.1081L24 10.8564L17.8669 5L13.2913 5.00031C9.26289 5.00047 8.6476 5.03313 8.1438 5.27376ZM8.56407 6.4955C8.33702 6.71254 8.30727 7.70022 8.30727 15.0002C8.30727 22.3003 8.33702 23.2879 8.56407 23.505C8.78933 23.7201 9.64605 23.7504 15.4998 23.7504C21.3535 23.7504 22.2102 23.7201 22.4355 23.505C22.6596 23.2906 22.6923 22.5265 22.6923 17.4892V11.7189H20.0278C18.1734 11.7189 17.3036 11.6619 17.1671 11.5314C17.0306 11.4009 16.971 10.5695 16.971 8.79696V6.25003H12.8959C9.40935 6.25003 8.78393 6.2855 8.56407 6.4955ZM18.2787 10.4689H19.9951C20.9391 10.4689 21.7115 10.45 21.7115 10.427C21.7115 10.404 20.9391 9.64933 19.9951 8.75009L18.2787 7.11505V10.4689Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M10.25 14C10.25 13.5858 10.5858 13.25 11 13.25H20C20.4142 13.25 20.75 13.5858 20.75 14C20.75 14.4142 20.4142 14.75 20 14.75H11C10.5858 14.75 10.25 14.4142 10.25 14Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M10.25 17C10.25 16.5858 10.5858 16.25 11 16.25H20C20.4142 16.25 20.75 16.5858 20.75 17C20.75 17.4142 20.4142 17.75 20 17.75H11C10.5858 17.75 10.25 17.4142 10.25 17Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M10.25 20C10.25 19.5858 10.5858 19.25 11 19.25H20C20.4142 19.25 20.75 19.5858 20.75 20C20.75 20.4142 20.4142 20.75 20 20.75H11C10.5858 20.75 10.25 20.4142 10.25 20Z" fill="currentColor"/></React.Fragment>],
  signatures: ['24 24', <path key="a" d="M15 6.49995L17.5 8.99995M11 19.9999H20M4 19.9999V17.4999L16.75 4.74995C17.4404 4.05959 18.5596 4.05959 19.25 4.74995C19.9404 5.44031 19.9404 6.55959 19.25 7.24995L6.5 19.9999H4Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>],
  products: ['30 30', <path key="a" fillRule="evenodd" clipRule="evenodd" d="M10 17.0434V19.3977L17.2851 23L25 19.4096V10.8698L17.3016 7.72131L17.0388 7.82301C16.4573 8.04804 15.6485 8.38806 14.7976 8.75543C14.9341 9.22374 15 9.71138 15 10.2121C15 10.2206 15 10.2291 14.9999 10.2375C15.8463 9.86973 16.6684 9.52029 17.2892 9.27267L22.4371 11.378L17.3032 13.6225L14.546 12.3417C14.5271 12.3826 14.5077 12.4233 14.4876 12.4638C14.2854 12.8717 14.0256 13.232 13.7157 13.544L16.5801 14.8745V21.0451L11.4286 18.4978V17.0434H10ZM23.5714 18.486L18.0087 21.0748V14.8861L23.5714 12.4541V18.486Z" fill="currentColor"/>],
  contractors: ['30 30', <React.Fragment key="a"><path fillRule="evenodd" clipRule="evenodd" d="M11.9949 5.90909C10.9324 5.90909 10.0711 6.76098 10.0711 7.81183L10.0711 9.50317C10.0711 9.85345 10.3582 10.1374 10.7124 10.1374C11.0665 10.1374 11.3536 9.85346 11.3536 9.50317L11.3536 7.81184C11.3536 7.46155 11.6407 7.17759 11.9949 7.17759H17.7661V9.50317C17.7661 10.554 18.6273 11.4059 19.6898 11.4059H22.041V22.1882C22.041 22.5384 21.7539 22.8224 21.3998 22.8224H20.5448C20.1906 22.8224 19.9035 23.1064 19.9035 23.4567C19.9035 23.8069 20.1906 24.0909 20.5448 24.0909H21.3998C22.4622 24.0909 23.3235 23.239 23.3235 22.1882V10.7717C23.3235 10.3327 23.1472 9.91175 22.8334 9.60136L19.5905 6.39384C19.2767 6.08346 18.8511 5.90909 18.4073 5.90909H11.9949ZM19.0486 9.50317V7.65172L21.5617 10.1374H19.6898C19.3356 10.1374 19.0486 9.85345 19.0486 9.50317Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M4.94117 16.4396C4.94117 15.4208 5.77616 14.5949 6.80617 14.5949H17.1836C18.2136 14.5949 19.0486 15.4208 19.0486 16.4396C19.0486 16.4928 19.0462 16.5457 19.0417 16.5981C19.0462 16.6285 19.0485 16.6596 19.0485 16.6913L19.0485 20.1179C19.0486 20.8778 19.0486 21.5114 18.9802 22.0143C18.9081 22.5452 18.7493 23.0246 18.3599 23.4097C17.9705 23.7949 17.4859 23.9519 16.9491 24.0233C16.4406 24.0909 15.8 24.0909 15.0318 24.0909L8.95793 24.0909C8.18975 24.0909 7.54914 24.0909 7.04062 24.0233C6.50386 23.9519 6.01925 23.7949 5.62982 23.4097C5.2404 23.0246 5.08165 22.5452 5.00949 22.0143C4.94112 21.5114 4.94114 20.8778 4.94116 20.118L4.94116 16.6913C4.94116 16.6596 4.94351 16.6285 4.94805 16.5981C4.94348 16.5456 4.94117 16.4928 4.94117 16.4396ZM6.80617 15.8634C6.48446 15.8634 6.22366 16.1214 6.22366 16.4396C6.22366 16.6422 6.33131 16.83 6.50716 16.934L10.5685 19.3368C11.0072 19.5963 11.2961 19.7663 11.5329 19.8761C11.7566 19.9798 11.8857 20.0059 11.9949 20.0059C12.104 20.0059 12.2331 19.9798 12.4568 19.8761C12.6937 19.7663 12.9825 19.5963 13.4212 19.3368L17.4826 16.934C17.6584 16.83 17.7661 16.6422 17.7661 16.4396C17.7661 16.1214 17.5053 15.8634 17.1836 15.8634H6.80617ZM17.7661 18.2444L17.7661 20.074C17.7661 20.8892 17.7647 21.4368 17.7092 21.8453C17.6561 22.2356 17.5645 22.4026 17.453 22.5128C17.3416 22.623 17.1728 22.7137 16.7782 22.7661C16.3652 22.821 15.8116 22.8224 14.9873 22.8224L9.00238 22.8224C8.17816 22.8224 7.6245 22.821 7.21151 22.7661C6.81696 22.7137 6.6481 22.623 6.53668 22.5128C6.42526 22.4026 6.33359 22.2356 6.28054 21.8453C6.22502 21.4368 6.22365 20.8892 6.22365 20.074V18.2444L9.93651 20.441C10.3418 20.6807 10.6862 20.8845 10.9886 21.0247C11.3107 21.174 11.6316 21.2744 11.9949 21.2744C12.3581 21.2744 12.679 21.174 13.0011 21.0247C13.3036 20.8845 13.6479 20.6807 14.0532 20.441L17.7661 18.2444Z" fill="currentColor"/></React.Fragment>],
  safe: ['24 24', <React.Fragment key="a"><path d="M17.625 6.38983C17.625 6.04944 17.3507 5.7735 17.0123 5.7735C16.6738 5.7735 16.3995 6.04944 16.3995 6.38983V7.93066C16.3995 8.27105 16.6738 8.547 17.0123 8.547C17.3507 8.547 17.625 8.27105 17.625 7.93066V6.38983Z" fill="currentColor"/><path d="M17.625 13.7858C17.625 13.4454 17.3507 13.1695 17.0123 13.1695C16.6738 13.1695 16.3995 13.4454 16.3995 13.7858V15.3267C16.3995 15.667 16.6738 15.943 17.0123 15.943C17.3507 15.943 17.625 15.667 17.625 15.3267V13.7858Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M9.96569 6.698C7.59682 6.698 5.67647 8.62959 5.67647 11.0123C5.67647 13.3951 7.59682 15.3267 9.96569 15.3267C12.3346 15.3267 14.2549 13.3951 14.2549 11.0123C14.2549 8.62959 12.3346 6.698 9.96569 6.698ZM9.35294 7.99231C8.15249 8.23741 7.20692 9.18852 6.96325 10.396H8.23205C8.41666 9.87062 8.83063 9.45423 9.35294 9.26854V7.99231ZM10.5784 9.26854C11.1007 9.45423 11.5147 9.87062 11.6993 10.396H12.9681C12.7245 9.18852 11.7789 8.23741 10.5784 7.99231V9.26854ZM12.9681 11.6287H11.6993C11.5147 12.154 11.1007 12.5704 10.5784 12.7561V14.0323C11.7789 13.7872 12.7245 12.8361 12.9681 11.6287ZM9.35294 14.0323V12.7561C8.83063 12.5704 8.41666 12.154 8.23205 11.6287H6.96325C7.20692 12.8361 8.15249 13.7872 9.35294 14.0323ZM9.96569 10.396C9.62728 10.396 9.35294 10.6719 9.35294 11.0123C9.35294 11.3527 9.62728 11.6287 9.96569 11.6287C10.3041 11.6287 10.5784 11.3527 10.5784 11.0123C10.5784 10.6719 10.3041 10.396 9.96569 10.396Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M4.45098 3C3.09734 3 2 4.10377 2 5.46533V15.943C2 17.2002 2.93557 18.2376 4.14461 18.3892V19.9492C4.14461 20.6299 4.69328 21.1818 5.3701 21.1818H8.12745C8.80427 21.1818 9.35294 20.6299 9.35294 19.9492V18.4083H13.0294V19.9492C13.0294 20.6299 13.5781 21.1818 14.2549 21.1818H17.0123C17.6891 21.1818 18.2377 20.6299 18.2377 19.9492V18.3892C19.4468 18.2376 20.3824 17.2002 20.3824 15.943V5.46533C20.3824 4.10377 19.285 3 17.9314 3H4.45098ZM5.3701 19.9492V18.4083H8.12745V19.9492H5.3701ZM14.2549 19.9492V18.4083H17.0123V19.9492H14.2549ZM3.22549 5.46533C3.22549 4.78455 3.77416 4.23267 4.45098 4.23267H17.9314C18.6082 4.23267 19.1569 4.78455 19.1569 5.46533V15.943C19.1569 16.6238 18.6082 17.1757 17.9314 17.1757H4.45098C3.77416 17.1757 3.22549 16.6238 3.22549 15.943V5.46533Z" fill="currentColor"/></React.Fragment>],
  marketplace: ['24 24', <path key="a" d="M6.24 3.576L4.85333 5.448C4.57868 5.81878 4.44135 6.00417 4.44454 6.15935C4.44731 6.2944 4.50985 6.42104 4.61489 6.50431C4.73559 6.6 4.96447 6.6 5.42222 6.6H18.5778C19.0355 6.6 19.2644 6.6 19.3851 6.50431C19.4901 6.42104 19.5527 6.2944 19.5555 6.15935C19.5586 6.00417 19.4213 5.81878 19.1467 5.448L17.76 3.576M6.24 3.576C6.39644 3.3648 6.47467 3.2592 6.5738 3.18304C6.6616 3.11558 6.76103 3.06525 6.86701 3.0346C6.98667 3 7.11704 3 7.37778 3H16.6222C16.883 3 17.0133 3 17.133 3.0346C17.239 3.06525 17.3384 3.11558 17.4262 3.18304C17.5253 3.2592 17.6036 3.3648 17.76 3.576M6.24 3.576L4.56889 5.832C4.35781 6.11695 4.25227 6.25943 4.17733 6.41633C4.11083 6.55556 4.06233 6.70288 4.03302 6.85466C4 7.02571 4 7.20381 4 7.56L4 18.12C4 19.1281 4 19.6321 4.19377 20.0172C4.36421 20.3559 4.63617 20.6312 4.97068 20.8038C5.35097 21 5.8488 21 6.84444 21L17.1556 21C18.1512 21 18.649 21 19.0293 20.8038C19.3638 20.6312 19.6358 20.3559 19.8062 20.0172C20 19.6321 20 19.1281 20 18.12V7.56C20 7.20381 20 7.02571 19.967 6.85466C19.9377 6.70288 19.8892 6.55556 19.8227 6.41633C19.7477 6.25943 19.6422 6.11695 19.4311 5.832L17.76 3.576M15.5556 10.2C15.5556 11.1548 15.181 12.0705 14.5142 12.7456C13.8474 13.4207 12.943 13.8 12 13.8C11.057 13.8 10.1526 13.4207 9.48584 12.7456C8.81905 12.0705 8.44444 11.1548 8.44444 10.2" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>],
  payment: ['30 30', <React.Fragment key="a"><rect x="4.4" y="4.4" width="21.2" height="21.2" rx="10.6" stroke="currentColor" strokeWidth="1.2"/><path d="M12.1053 21V14.76M12.1053 14.76V9C12.1053 9 15.1842 9 16.8421 9C18.5 9 20 9.96 20 11.88C20 13.8 18.5 14.76 16.8421 14.76C15.1842 14.76 12.1053 14.76 12.1053 14.76ZM12.1053 14.76H10M10 17.16H16.8421" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/></React.Fragment>],
  invite: ['30 30', <React.Fragment key="a"><path fillRule="evenodd" clipRule="evenodd" d="M19.833 13.1642C20.2319 13.1642 20.5552 13.485 20.5552 13.8807V22.4778C20.5552 22.8734 20.2319 23.1942 19.833 23.1942C19.4341 23.1942 19.1108 22.8734 19.1108 22.4778V13.8807C19.1108 13.485 19.4341 13.1642 19.833 13.1642Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M14.7775 18.1792C14.7775 17.7835 15.1009 17.4628 15.4997 17.4628H24.1662C24.565 17.4628 24.8884 17.7835 24.8884 18.1792C24.8884 18.5749 24.565 18.8956 24.1662 18.8956H15.4997C15.1009 18.8956 14.7775 18.5749 14.7775 18.1792Z" fill="currentColor"/><path fillRule="evenodd" clipRule="evenodd" d="M15.9462 13.9726C17.0552 13.1702 17.7775 11.8717 17.7775 10.4088C17.7775 7.97777 15.7837 6 13.3331 6C10.8825 6 8.88881 7.97777 8.88881 10.4088C8.88881 11.8717 9.611 13.1702 10.7201 13.9726C7.96309 15.0192 6 17.6709 6 20.7694C6 22.1064 7.09654 23.1942 8.44438 23.1942H17.7897C17.7098 22.9701 17.6664 22.729 17.6664 22.4778V21.8715H8.44438C7.83174 21.8715 7.33331 21.3771 7.33331 20.7693C7.33331 17.4875 10.0248 14.8175 13.3332 14.8175C14.6943 14.8175 15.951 15.2694 16.9588 16.0299H17.6664V14.9046C17.1416 14.5221 16.5638 14.2071 15.9462 13.9726ZM10.2221 10.4088C10.2221 8.70708 11.6177 7.32264 13.3331 7.32264C15.0486 7.32264 16.4442 8.70708 16.4442 10.4088C16.4442 12.1105 15.0486 13.4949 13.3331 13.4949C11.6177 13.4949 10.2221 12.1105 10.2221 10.4088Z" fill="currentColor"/></React.Fragment>],
  chat: ['24 24', <React.Fragment key="a"><path d="M12 3l1.6 3.9L17.5 8.5l-3.9 1.6L12 14l-1.6-3.9L6.5 8.5l3.9-1.6L12 3Z" fill="currentColor"/><path d="M18 13l.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8.8-2Z" fill="currentColor"/></React.Fragment>],
};
const DDIcon = ({ name }) => {
  const ic = II[name]; if (!ic) return null;
  return <svg width="24" height="24" viewBox={`0 0 ${ic[0]}`} fill="none" xmlns="http://www.w3.org/2000/svg">{ic[1]}</svg>;
};

const DDLogo = () => (
  <div className="ddlogo"><span className="d1">Data</span><span className="d2">Doc</span></div>
);

// ── Sidebar ──────────────────────────────────────────────────────
const NAV_ITEMS = [
  ['tpl', 'templates', 'Шаблоны'],
  ['docs', 'documents', 'Документы'],
  ['sig', 'signatures', 'Подписи'],
  ['prod', 'products', 'Товары и услуги'],
  ['cp', 'contractors', 'Контрагенты'],
  ['chat', 'chat', 'Чат-ассистент'],
  ['safe', 'safe', 'Электронный Архив'],
  ['mkt', 'marketplace', 'Маркетплейс'],
];
const Sidebar = ({ active = 'chat' }) => (
  <div className="nav">
    <div className="logo"><DDLogo/></div>
    <div className="items" style={{ display: 'flex', flexDirection: 'column' }}>
      {NAV_ITEMS.map(([key, icon, label]) => (
        <div key={key} className={`item ${active === key ? 'on' : ''}`}>
          <div className="ic"><DDIcon name={icon}/></div><div>{label}</div>
        </div>
      ))}
    </div>
    <div className="footer">
      <div className="item"><div className="ic"><DDIcon name="payment"/></div><div>Оплата</div></div>
      <div className="item"><div className="ic"><DDIcon name="invite"/></div><div>Пригласить</div></div>
    </div>
  </div>
);

// ── Mention pill (inline chip inside user message) ───────────────
const Mention = ({ kind = 'tpl', name }) => {
  const cls = kind === 'cp' ? 'cp' : kind === 'doc' ? 'dx' : '';
  const DocI = (typeof window !== 'undefined' && window.DocIcon) || null;
  const icon = kind === 'cp' ? <span className="t">👤</span>
    : DocI ? <span className="t" style={{ display: 'inline-flex' }}><DocI size={14} /></span>
      : <span className="t">{kind === 'doc' ? '§' : '▤'}</span>;
  return (
    <span className={`amen ${cls}`}>{icon}{name}</span>
  );
};

// ── Message bubble ───────────────────────────────────────────────
const Msg = ({ who = 'ai', avatar, ts, children }) => (
  <div className={`aim ${who === 'you' ? 'you' : ''}`}>
    {who === 'ai' ? <div className="ava logo">{avatar || <span className="ddmark">Dd</span>}</div> : null}
    <div className="stack">
      {children}
      {ts ? <div className="ts">{ts}</div> : null}
    </div>
  </div>
);

const Bubble = ({ dashed = false, plain = false, children }) => (
  <div className={`bubble ${dashed ? 'dashed' : ''} ${plain ? 'plain' : ''}`}>{children}</div>
);

// attachment thumbnails in user message
const AttachedFiles = ({ files }) => (
  <div className="afiles">
    {files.map((f, i) => (
      <div className="afile" key={i}>
        <div className="thumb"/>
        <span>{f}</span>
      </div>
    ))}
  </div>
);

// ── Interactive @-mention input ──────────────────────────────────
// Per-artboard. Typing @ shows popover. Click → inserts pill chip into the
// contentEditable field. Send button shakes (each artboard is a fixed state).

const MENTION_CATALOG = {
  'Шаблоны': [
    { id: 'договор-оказания-услуг', name: 'договор-оказания-услуг', sub: 'для физлиц и СМЗ · 1 докс', kind: 'tpl' },
    { id: 'договор-поставки', name: 'договор-поставки', sub: 'B2B · с НДС · 1 докс', kind: 'tpl' },
    { id: 'договор-с-СМЗ', name: 'договор-с-СМЗ', sub: 'самозанятый · с чеком · 1 докс', kind: 'tpl' },
    { id: 'договор-аренды', name: 'договор-аренды', sub: 'долгосрочная аренда · 1 докс', kind: 'tpl' },
    { id: 'доп-соглашение', name: 'доп-соглашение', sub: 'изменение действующего договора', kind: 'tpl' },
    { id: 'акт', name: 'акт-выполненных-работ', sub: 'ежемесячное закрытие · 1 докс', kind: 'tpl' },
    { id: 'счёт', name: 'счёт', sub: 'на оплату · с НДС / без', kind: 'tpl' }
  ],
  'Контрагенты': [
    { id: 'ip-melnikov', name: 'ИП Мельников А.С.', sub: 'ИНН 770401872312', kind: 'cp' },
    { id: 'ip-sidorov', name: 'ИП Сидоров В.В.', sub: 'ИНН 502718029184', kind: 'cp' },
    { id: 'ooo-romashka', name: 'ООО Ромашка', sub: 'ИНН 7704812345 · договор от 12.03.2026', kind: 'cp' },
    { id: 'ooo-voshod', name: 'ООО Восход', sub: 'ИНН 7842918374 · 4 документа', kind: 'cp' }
  ],
  'Документы': [
    { id: 'd47', name: '№47 от 12.03.2026', sub: 'Договор · ООО Ромашка · 180 000 ₽/мес', kind: 'doc' },
    { id: 'd18', name: '№18 от 05.05.2026', sub: 'Договор · ИП Сидоров В.В.', kind: 'doc' },
    { id: 'd-may', name: 'договоры за май', sub: '12 документов · ИП и ООО', kind: 'doc' }
  ],
  'Действия': [
    { id: 'a-close', name: 'закрыть месяц', sub: 'массовые акты по ретейнерам', kind: 'tpl' },
    { id: 'a-revise', name: 'проверить риски', sub: 'AI-ревизия активных договоров', kind: 'tpl' }
  ]
};

function MentionInput({
  initial = [], // mix of strings and {kind,name}
  estimate = null, // {text, doxes, ok}
  showMenu = false,
  menuFilter = '',
  placeholder = 'Спросите AI или начните с @ для шаблона или контрагента',
  quick = null
}) {
  const [open, setOpen] = useState(showMenu);
  const [filter, setFilter] = useState(menuFilter);
  const [content, setContent] = useState(initial);

  useEffect(() => { setOpen(showMenu); setFilter(menuFilter); }, [showMenu, menuFilter]);

  const matches = (() => {
    const f = filter.toLowerCase().trim();
    const out = {};
    Object.entries(MENTION_CATALOG).forEach(([cat, items]) => {
      const hit = items.filter((it) => !f || it.name.toLowerCase().includes(f) || it.sub.toLowerCase().includes(f));
      if (hit.length) out[cat] = hit;
    });
    return out;
  })();

  const onInput = (e) => {
    const txt = e.currentTarget.innerText;
    const m = txt.match(/@([^\s]*)$/);
    if (m) { setOpen(true); setFilter(m[1] || ''); }
    else { setOpen(false); setFilter(''); }
  };

  const pick = (it) => {
    // Append chip to current visual content
    setContent((c) => [...c, { kind: it.kind, name: it.name }]);
    setOpen(false);
    setFilter('');
  };

  return (
    <div className="aiinput">
      {quick ? (
        <div className="quick">
          {quick.map((q, i) => <div className="qc" key={i}>⚡ {q}</div>)}
        </div>
      ) : null}
      <div className="field">
        <div className="row">
          <div
            className="text"
            contentEditable
            suppressContentEditableWarning
            data-placeholder={placeholder}
            onInput={onInput}
            spellCheck={false}
          >
            {content.map((c, i) => typeof c === 'string'
              ? <React.Fragment key={i}>{c}</React.Fragment>
              : <React.Fragment key={i}><Mention kind={c.kind} name={c.name}/> </React.Fragment>
            )}
          </div>
          <div className="actions">
            <div className="ic" title="прикрепить">📎</div>
            <div className="ic send" title="отправить"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 13V3.5M8 3.5L3.5 8M8 3.5L12.5 8" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/></svg></div>
          </div>
        </div>
        {open ? (
          <div className="amenu">
            {Object.entries(matches).length === 0 ? (
              <div style={{ padding: 14, color: 'var(--ink-3)', fontSize: 12 }}>ничего не нашли · попробуйте по-другому</div>
            ) : Object.entries(matches).map(([cat, items]) => (
              <div key={cat}>
                <div className="cat">{cat}</div>
                {items.map((it, i) => (
                  <div className={`it ${i === 0 ? 'on' : ''}`} key={it.id} onClick={() => pick(it)}>
                    <div className="ic">{it.kind === 'cp' ? '👤' : (window.DocIcon ? <window.DocIcon size={15} /> : (it.kind === 'doc' ? '§' : '▤'))}</div>
                    <div className="body">
                      <div className="name">{it.name}</div>
                      <div className="sub">{it.sub}</div>
                    </div>
                    <div className="kb">{i === 0 ? '↵' : ''}</div>
                  </div>
                ))}
              </div>
            ))}
          </div>
        ) : null}
      </div>
      {estimate ? (
        <div className={`estimate ${estimate.ok === false ? 'err' : ''}`}>
          <span className="v">≈ {estimate.doxes} доксов</span>
          <span>{estimate.text}</span>
          {estimate.ok === false ? <span className="btn-aip primary" style={{ marginLeft: 'auto', padding: '2px 10px', fontSize: 11 }}>Пополнить →</span> : null}
        </div>
      ) : null}
    </div>
  );
}

// ── Share-with-colleague popover (workspace only) ────────────────
const ShareMenu = () => (
  <div className="sharemenu">
    <div className="sh-h">Поделиться чатом<span className="sh-x">✕</span></div>
    <div className="sh-sub">Доступ есть только у коллег из вашего рабочего пространства <b>«Студия Кадр»</b>.</div>
    <div className="sh-add">
      <span className="sh-search">🔎 добавить коллегу по имени или e-mail</span>
    </div>
    <div className="sh-list">
      <div className="sh-row">
        <div className="sh-ava you">МК</div>
        <div className="sh-who"><div className="nm">Мария Козлова <span className="tag">вы</span></div><div className="em">m.kozlova@kadr.ru</div></div>
        <div className="sh-role">Владелец</div>
      </div>
      <div className="sh-row">
        <div className="sh-ava">ПТ</div>
        <div className="sh-who"><div className="nm">Пётр Ткаченко</div><div className="em">p.tkachenko@kadr.ru</div></div>
        <div className="sh-role sel">Редактор ▾</div>
        <div className="sh-revoke">Отозвать</div>
      </div>
      <div className="sh-row">
        <div className="sh-ava">ИС</div>
        <div className="sh-who"><div className="nm">Ирина Соколова</div><div className="em">i.sokolova@kadr.ru</div></div>
        <div className="sh-role sel">Просмотр ▾</div>
        <div className="sh-revoke">Отозвать</div>
      </div>
      <div className="sh-row off">
        <div className="sh-ava">АГ</div>
        <div className="sh-who"><div className="nm">Артём Громов</div><div className="em">a.gromov@voshod.ru</div></div>
        <div className="sh-out">вне рабочего пространства</div>
      </div>
    </div>
    <div className="sh-foot">
      <span className="sh-link">🔗 Скопировать ссылку · только для участников</span>
      <span className="sh-done">Готово</span>
    </div>
  </div>
);

// ── Chat-column header with doxes balance ────────────────────────
const ChatHead = ({ title = 'Новый чат с DataDoc AI', sub = 'на основе YandexGPT', balance = 1240, low = false, share = false }) => (
  <div className="chat-head">
    <div>
      <div className="title">{title}</div>
      <div className="sub">{sub}</div>
    </div>
    <div className="chat-head-actions">
      <div className={`share-btn ${share ? 'on' : ''}`}><span className="ico"><svg width="15" height="15" viewBox="0 0 16 16" fill="none"><path d="M11 5.5a2 2 0 1 0-1.9-1.35L6.8 5.3a2 2 0 1 0 0 3.4l2.3 1.15a2 2 0 1 0 .55-1L7.35 7.7a2 2 0 0 0 0-1.4L9.65 5.15c.36.22.79.35 1.25.35Z" fill="currentColor"/></svg></span>Поделиться</div>
      <div className={`doxes ${low ? 'low' : ''}`}>
        <span className="di">⬨</span>
        <span>{balance.toLocaleString('ru-RU')} доксов</span>
        <span style={{ color: 'var(--ink-3)', borderLeft: '1px solid var(--ink-3)', paddingLeft: 6, marginLeft: 4, fontSize: 11 }}>пополнить</span>
      </div>
    </div>
    {share ? <ShareMenu/> : null}
  </div>
);

// ── Chat-history rail (past dialogs, like ChatGPT) ───────────────
const CHAT_HISTORY = [
  ['Сегодня', [['Массовое создание договоров', true], ['Акт № 1 к договору №47', false]]],
  ['Вчера', [['Проверка договора подряда', false], ['Поиск: Восход, 2 квартал', false], ['Доп.соглашение ООО Ромашка', false]]],
  ['Ранее', [['Договор аренды по паспорту', false], ['Сверка двух редакций', false], ['Добавление ООО «Восход»', false], ['Составление договора услуг', false]]],
];
const ChatHistory = ({ active = 'Массовое создание договоров', collapsed = false }) => (
  collapsed ? (
    <div className="chist collapsed">
      <div className="chist-exp" title="Развернуть чаты">»</div>
      <div className="chist-new mini" title="Новый чат">＋</div>
      <div className="chist-mini-list">
        {CHAT_HISTORY.flatMap(([, items]) => items).slice(0, 6).map(([name], i) => (
          <div className={`cm ${name === active ? 'on' : ''}`} key={i} title={name}>✶</div>
        ))}
      </div>
    </div>
  ) : (
    <div className="chist">
      <div className="chist-top"><span className="ct">Чаты</span><span className="chist-collapse" title="Свернуть">«</span></div>
      <div className="chist-new">＋ Новый чат</div>
      <div className="chist-search"><span>🔎</span><span className="ph">поиск по диалогам</span></div>
      <div className="chist-list">
        {CHAT_HISTORY.map(([grp, items]) => (
          <div className="chist-grp" key={grp}>
            <div className="gl">{grp}</div>
            {items.map(([name], i) => (
              <div className={`ci ${name === active ? 'on' : ''}`} key={i}><span className="d">✶</span><span className="nm">{name}</span></div>
            ))}
          </div>
        ))}
      </div>
    </div>
  )
);

// ── 3-pane shell ─────────────────────────────────────────────────
const Shell = ({ navActive = 'chat', chatHead, children, doc, history = true, activeChat, histCollapsed = false }) => (
  <div className={`ai-shell ${history ? (histCollapsed ? 'has-hist hist-min' : 'has-hist') : ''}`}>
    <Sidebar active="chat"/>
    {history ? <ChatHistory active={activeChat} collapsed={histCollapsed}/> : null}
    <div className="chat-col">
      {chatHead}
      <div className="chat-body">{children}</div>
    </div>
    <div className="docpane">{doc}</div>
  </div>
);

Object.assign(window, {
  Sidebar, Mention, Msg, Bubble, AttachedFiles, MentionInput,
  ChatHead, ShareMenu, Shell, ChatHistory, MENTION_CATALOG
});
