/* Mesh — Product page: "The agentic close" section.
   Recreates the v5 "trust & governance layer" stages (Aggregate · Standardize ·
   Estimate · Audit) as a HORIZONTAL-SCROLL track: the four product panels sit
   side-by-side in a scroll-snap rail; the stage tabs above are clickable and
   stay in sync with the scroll position. */

const AG_STAGES = [
  { t: 'Aggregate',   s: 'every signal source' },
  { t: 'Standardize', s: 'map & clean every column' },
  { t: 'Estimate',    s: 'with auditable logic' },
  { t: 'Audit',       s: 'every change traced' },
];

/* ---------- 1 · Aggregate ---------- */
const AG_PREFS = [
  { t: 'Purchase Orders',  s: 'PO line items, vendors, and committed amounts', auto: true, query: true },
  { t: 'Invoices',         s: 'Vendor invoices matched against open POs',       auto: true },
  { t: 'Internal Outreach', s: 'Cost-estimate requests sent to internal DRIs',  auto: false },
  { t: 'Vendor Outreach',  s: 'Invoice-confirmation outreach sent to vendors',  auto: false },
  { t: 'Exclusion Criteria', s: 'Rules for POs excluded from the accrual',      auto: false },
];

function AggregatePanel({ focus = -1 }) {
  const fi = focus < 0 ? -1 : Math.round(focus / 3 * (AG_PREFS.length - 1));
  return (
    <div className="ag-panel">
      <div className="ag-panel-bar">
        <span className="ag-crumb"><Icon name="chevron-left" className="ic" /> Integrations</span>
        <span className="ag-panel-name">NetSuite</span>
        <span className="ag-conn"><span className="ag-conn-dot"></span> Connected</span>
      </div>
      <div className="ag-panel-body">
        <div className="ag-pref-head">
          <span className="ag-erp-mark">N</span>
          <span className="ag-pref-h">Data preferences</span>
        </div>
        <p className="ag-pref-sub">Which workbook sheets NetSuite feeds — uploaded by hand (Manual) or pulled automatically (Automated).</p>
        <div className="ag-pref-list">
          {AG_PREFS.map((p, idx) => (
            <div className={'ag-pref-row' + (idx === fi ? ' ag-foc' : '')} key={p.t}>
              <div className="ag-pref-tx">
                <div className="ag-pref-t">{p.t}{p.query && <span className="ag-query"><Icon name="code-2" className="ic" /> View query</span>}</div>
                <div className="ag-pref-s">{p.s}</div>
              </div>
              <div className="ag-seg2">
                <span className={'ag-seg2-b' + (p.auto ? '' : ' on')}>Manual</span>
                <span className={'ag-seg2-b ag-auto' + (p.auto ? ' on' : '')}><Icon name="zap" className="ic" /> Automated</span>
              </div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

/* ---------- 2 · Standardize ---------- */
const AG_MAP = [
  ['po_line', 'PO + Line', 'string', 'Unique purchase order line identifier'],
  ['supplier_id', 'Supplier #', 'string', 'Numeric supplier reference from your ERP'],
  ['supplier_name', 'Supplier Name', 'string', 'Full legal name of the supplier'],
  ['item_descr', 'Item', 'string', 'Short description of goods or services'],
  ['dept', 'Department', 'string', 'Owning business unit / department'],
  ['contact_name', 'Name', 'string', 'Primary internal contact for outreach'],
  ['contact_email', 'Email', 'string', 'Email address used to send outreach'],
  ['contact_role', 'Role', 'string', 'Title or function of the contact'],
  ['svc_provided', 'Service Provided', 'string', 'Whether services were rendered for this PO line — yes/no'],
  ['cost_estimate_usd', 'Cost Estimate', 'money', 'DRI-provided estimate of the cost amount in USD'],
];

function StandardizePanel({ focus = -1 }) {
  const fi = focus < 0 ? -1 : Math.round(focus / 3 * (AG_MAP.length - 1));
  return (
    <div className="ag-panel">
      <div className="ag-panel-bar ag-bar-col">
        <div className="ag-bar-row">
          <span className="ag-panel-name">Match columns to Mesh fields</span>
          <span className="ag-x"><Icon name="x" className="ic" /></span>
        </div>
        <p className="ag-bar-sub">We've matched <b>10</b> of 10 columns automatically. Review or edit before saving.</p>
      </div>
      <div className="ag-panel-body ag-body-flush">
        <div className="ag-req">
          <span className="ag-req-ic"><Icon name="info" className="ic" /></span>
          <span><b>Required fields</b> — Mesh has identified the required fields for <b>Purchase Orders</b>. Unmapped required fields will block save.</span>
        </div>
        <div className="ag-stats">
          <span><b>10</b> columns in file</span>
          <span><b>10</b> auto-mapped</span>
          <span><b>0</b> unmapped</span>
          <span><b>528</b> rows detected</span>
        </div>
        <div className="ag-map">
          <div className="ag-map-row ag-map-head">
            <span>Column Header</span><span>Mesh_Name</span><span>Type</span><span>Business Context</span>
          </div>
          {AG_MAP.map(([col, name, type, ctx], idx) => (
            <div className={'ag-map-row' + (idx === fi ? ' ag-foc' : '')} key={col}>
              <span className="ag-mono">{col}</span>
              <span className="ag-select">{name}<Icon name="chevron-down" className="ic" /></span>
              <span className={'ag-type ag-type-' + type}>{type}</span>
              <span className="ag-ctx">{ctx}</span>
            </div>
          ))}
        </div>
      </div>
      <div className="ag-map-foot">
        <span className="ag-foot-note"><Icon name="sparkles" className="ic" /> 8 auto-mapped · 2 inferred by Mesh AI</span>
        <div className="ag-foot-btns">
          <button className="btn btn-ghost">Back</button>
          <button className="btn btn-primary">Save &amp; continue</button>
        </div>
      </div>
    </div>
  );
}

/* ---------- 3 · Estimate ---------- */
const AG_EST = [
  { po: '6577-1', frac: 6 / 6, hc: '6/6', ok: true,  amt: '$456,000.00', exp: 'Straight-line calculation', mesh: true,  prep: 'Mesh',    rev: 'Erin C.',  line: '456,000.00' },
  { po: '7646-1', frac: 5 / 6, hc: '5/6', ok: false, amt: '$101,600.00', exp: 'Estimated using $12,700.00 last month invoice with 8x multiplier', mesh: false, prep: 'Sarah K.', rev: 'Sarah L.', line: '174,800.00' },
  { po: '2294-1', frac: 5 / 6, hc: '5/6', ok: false, amt: '$41,377.00',  exp: 'Estimated using $5,911.00 last month invoice with 7x multiplier',  mesh: true,  prep: 'Mesh',    rev: 'Erin C.',  line: '95,916.00' },
  { po: '6679-1', frac: 5 / 6, hc: '5/6', ok: false, amt: '$183,440.00', amtGreen: true, meshExp: true, exp: 'Estimated using $34,764.00 last month invoice with 8x multiplier', mesh: true, prep: 'Mesh', rev: 'Erin C.', line: '220,704.00' },
];

function Ring({ frac, color }) {
  const r = 6, C = 2 * Math.PI * r;
  return (
    <svg width="16" height="16" viewBox="0 0 16 16" className="ag-ring">
      <circle cx="8" cy="8" r={r} fill="none" stroke="var(--line-2)" strokeWidth="2" />
      <circle cx="8" cy="8" r={r} fill="none" stroke={color} strokeWidth="2" strokeLinecap="round"
        strokeDasharray={(frac * C).toFixed(1) + ' ' + C.toFixed(1)} transform="rotate(-90 8 8)" />
    </svg>
  );
}

function EstimatePanel({ focus = -1 }) {
  const fi = focus < 0 ? -1 : Math.round(focus / 3 * (AG_EST.length - 1));
  return (
    <div className="ag-panel">
      <div className="ag-panel-bar">
        <span className="ag-panel-name"><Icon name="sparkles" className="ic ag-spark" /> Expense Accruals · May 2026</span>
        <button className="ag-run"><Icon name="sparkles" className="ic" /> Run Agent</button>
      </div>
      <div className="ag-est">
        <div className="ag-est-row ag-est-head">
          <span>PO + Line</span><span>Health</span><span className="r">Mesh Accrual Amount</span><span>Mesh Explanation</span>
          <span>Preparer</span><span>Reviewer</span><span>Status</span><span className="r">Line Total</span>
        </div>
        {AG_EST.map((r, idx) => (
          <div className={'ag-est-row' + (idx === fi ? ' ag-foc' : '')} key={r.po}>
            <span className="ag-mono ag-est-po">{r.po}</span>
            <span className="ag-health"><Ring frac={r.frac} color={r.ok ? '#1FA463' : '#E0922F'} /> {r.hc}</span>
            <span className={'r ag-est-amt' + (r.amtGreen ? ' ag-green' : '')}>{r.amt}</span>
            <span className="ag-est-exp">{r.meshExp && <Icon name="sparkles" className="ic ag-spark" />} {r.exp}</span>
            <span className={r.mesh ? 'ag-mesh' : ''}>{r.mesh && <Icon name="sparkles" className="ic" />} {r.prep}</span>
            <span className="ag-est-rev">{r.rev}</span>
            <span><span className="ag-status">Ready for Review</span></span>
            <span className="r ag-mono ag-est-line">{r.line}</span>
          </div>
        ))}
      </div>
    </div>
  );
}

/* ---------- 4 · Audit ---------- */
const AG_AUD_LIST = [
  ['7646-1', 'Atlas Partners Group'],
  ['6679-1', 'Nexus Industrial USA'],
  ['2333-1', 'Vertex Manufacturing LLC', true],
  ['2380-1', 'Vertex Industries USA'],
  ['6577-1', 'Nexus Partners Worldwide'],
  ['2294-1', 'Vertex Systems Co.'],
];

const AG_TL = [
  { head: 'Data imported · Apr 23, 2026 · 10:51 AM', by: 'Created by: Mesh',
    rows: [{ t: 'Row was created in the system' }, { t: 'Source: File upload • Acme Accruals — Purchase Orders (5).csv', mut: true }] },
  { head: 'Computed result · Apr 23, 2026 · 10:51 AM', by: 'Created by: Mesh',
    diffs: [['Mesh Accrual', '$9,000.00'], ['Explanation', 'Booked via project cost accounting module']] },
  { head: 'Updated · Apr 23, 2026 · 10:52 AM', by: 'Updated by: Erin C. · Controller',
    status: ['Needs Review', 'Reviewed – Comments'] },
  { head: 'Updated (Current) · Apr 23, 2026 · 10:52 AM', by: 'Updated by: Mesh Admin',
    rows: [{ t: 'No changes detected', mut: true }] },
];

function AuditPanel({ focus = -1 }) {
  const fi = focus < 0 ? -1 : Math.round(focus / 3 * (AG_TL.length - 1));
  return (
    <div className="ag-panel ag-aud">
      <div className="ag-aud-list">
        <div className="ag-aud-list-bar">Expense Accruals · May 2026</div>
        <div className="ag-aud-list-head"><span>PO + Line</span><span>Vendor</span></div>
        {AG_AUD_LIST.map(([po, v, sel]) => (
          <div className={'ag-aud-list-row' + (sel ? ' sel' : '')} key={po}>
            <span className="ag-mono">{po}</span><span className="ag-aud-vn">{v}</span>
          </div>
        ))}
      </div>
      <div className="ag-aud-detail">
        <div className="ag-aud-d-bar">
          <div>
            <div className="ag-aud-d-title">2333-1</div>
            <div className="ag-aud-d-sub">Vertex Manufacturing LLC · Customer Success</div>
          </div>
          <span className="ag-x"><Icon name="x" className="ic" /></span>
        </div>
        <div className="ag-aud-tabs">
          {['Details', 'Invoices 5', 'Comments 1', 'Emails', 'Activity'].map((t, i) => (
            <span className={'ag-aud-tab' + (i === 4 ? ' on' : '')} key={t}>{t}</span>
          ))}
        </div>
        <div className="ag-tl">
          {AG_TL.map((e, i) => (
            <div className={'ag-tl-item' + (i === fi ? ' ag-foc' : '')} key={i}>
              <span className="ag-tl-dot"><Icon name="check" className="ic" /></span>
              <div className="ag-tl-body">
                <div className="ag-tl-head">{e.head}</div>
                <div className="ag-tl-by">{e.by}</div>
                {e.rows && e.rows.map((r, j) => <div className={'ag-tl-line' + (r.mut ? ' mut' : '')} key={j}>{r.t}</div>)}
                {e.diffs && (
                  <div className="ag-tl-card">
                    {e.diffs.map(([k, val]) => (
                      <div className="ag-tl-diff" key={k}><span className="ag-tl-k">{k}</span><span className="ag-tl-arrow">—→</span><span className="ag-tl-v">{val}</span></div>
                    ))}
                  </div>
                )}
                {e.status && (
                  <div className="ag-tl-card">
                    <div className="ag-tl-diff"><span className="ag-tl-k">Status</span><span className="ag-tl-old">{e.status[0]}</span><span className="ag-tl-arrow">→</span><span className="ag-tl-v">{e.status[1]}</span></div>
                  </div>
                )}
              </div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

const AG_PANELS = [AggregatePanel, StandardizePanel, EstimatePanel, AuditPanel];

const AG_DWELL = 4800; // ms each stage holds before auto-advancing
const FOCUS_STEPS = 4;  // components highlighted per stage before advancing
const FOCUS_DWELL = AG_DWELL / FOCUS_STEPS;

function AgenticClose() {
  const [active, setActive] = React.useState(0);
  const [focus, setFocus] = React.useState(0);
  const [playing, setPlaying] = React.useState(true);
  const trackRef = React.useRef(null);
  const secRef = React.useRef(null);
  const lock = React.useRef(false);
  const inView = React.useRef(false);
  const resumeTimer = React.useRef(null);
  const activeRef = React.useRef(0);
  const focusRef = React.useRef(0);
  React.useEffect(() => { activeRef.current = active; }, [active]);
  React.useEffect(() => { focusRef.current = focus; }, [focus]);

  // Pause autoplay on manual interaction, then resume after a short idle.
  const nudge = () => {
    setPlaying(false);
    clearTimeout(resumeTimer.current);
    resumeTimer.current = setTimeout(() => setPlaying(true), 9000);
  };

  // Only autoplay while the section is on screen.
  React.useEffect(() => {
    const el = secRef.current;
    if (!el || typeof IntersectionObserver === 'undefined') { inView.current = true; return; }
    const obs = new IntersectionObserver(
      (es) => es.forEach(e => { inView.current = e.isIntersecting; }),
      { threshold: 0.35 });
    obs.observe(el);
    return () => obs.disconnect();
  }, []);

  // Autoplay loop: step through each stage's components, then advance the stage.
  React.useEffect(() => {
    if (!playing) return;
    const id = setInterval(() => {
      if (!inView.current || document.hidden || lock.current) return;
      const nf = focusRef.current + 1;
      if (nf >= FOCUS_STEPS) {
        setFocus(0);
        goTo((activeRef.current + 1) % AG_PANELS.length);
      } else {
        setFocus(nf);
      }
    }, FOCUS_DWELL);
    return () => clearInterval(id);
  }, [playing]);

  const goTo = (i) => {
    const track = trackRef.current;
    if (!track) return;
    lock.current = true;
    setActive(i);
    // This engine ignores scrollTo({behavior:'smooth'}) on the rail, and
    // mandatory snap reverts mid-tween values — so disable snap and animate
    // scrollLeft by hand, then restore snap for manual swipes.
    track.style.scrollSnapType = 'none';
    const start = track.scrollLeft;
    const target = i * track.clientWidth;
    const t0 = (typeof performance !== 'undefined' ? performance.now() : Date.now());
    const dur = 460;
    const ease = (t) => 1 - Math.pow(1 - t, 3);
    cancelAnimationFrame(lock.raf);
    const step = (now) => {
      const p = Math.min(1, (now - t0) / dur);
      track.scrollLeft = start + (target - start) * ease(p);
      if (p < 1) { lock.raf = requestAnimationFrame(step); }
      else { track.scrollLeft = target; track.style.scrollSnapType = ''; lock.current = false; }
    };
    lock.raf = requestAnimationFrame(step);
  };

  const onScroll = () => {
    const track = trackRef.current;
    if (!track || lock.current) return;
    const i = Math.round(track.scrollLeft / track.clientWidth);
    setActive(Math.max(0, Math.min(AG_PANELS.length - 1, i)));
  };

  const jump = (i) => { nudge(); setFocus(0); goTo(i); };

  return (
    <section className="ag-sec" id="product" ref={secRef}>
      <div className="wrap">
        <div className="eyebrow ag-eyebrow"><span className="bar"></span> The agentic close</div>
        <h2 className="ag-title">The trust and governance layer for your agentic close</h2>
        <div className="ag-tabs">
          {AG_STAGES.map((s, i) => (
            <button className={'ag-tab' + (i === active ? ' is-active' : '')} key={s.t} onClick={() => jump(i)}>
              <span className="ag-tab-t">{s.t}</span>
              <span className="ag-tab-s">{s.s}</span>
              {i === active && playing &&
                <span className="ag-tab-prog" key={'p' + active} style={{ animationDuration: AG_DWELL + 'ms' }}></span>}
            </button>
          ))}
        </div>
      </div>
      <div className="ag-track" ref={trackRef} onScroll={onScroll} onPointerDown={nudge} onWheel={nudge}>
        {AG_PANELS.map((P, i) => (
          <div className="ag-slide" key={i}><div className="wrap ag-slide-in"><P focus={i === active ? focus : -1} /></div></div>
        ))}
      </div>
      <div className="wrap ag-dots">
        {AG_PANELS.map((_, i) => (
          <button key={i} className={'ag-dot' + (i === active ? ' on' : '')} onClick={() => jump(i)} aria-label={'Stage ' + (i + 1)}></button>
        ))}
      </div>
    </section>
  );
}

Object.assign(window, { AgenticClose });
