// views_results.jsx — the audit Results report. Editorial, glass-box:
// hero JiffyScore dial + radar, 6-dimension gauges, evidence, Google
// guidance, priority gaps, search-intent map, page findings.
(function () {
  const { useState } = React;
  const D = window.JS_DATA;

  function scrollToId(id) {
    const el = document.getElementById(id);
    if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 130, behavior: 'smooth' });
  }

  function MetricChip({ k, v }) {
    return <div style={{ background: 'var(--bg-2)', border: '1px solid var(--line-soft)', borderRadius: 'var(--r-sm)', padding: '12px 15px' }}>
      <div className="js-tag">{k}</div>
      <div style={{ fontFamily: 'var(--font-mono)', fontWeight: 600, fontSize: 20, color: 'var(--ink)', marginTop: 4 }}>{v}</div>
    </div>;
  }

  function ResultsReport({ audit, role, go, onGenerate, openScore }) {
    const a = audit.analysis;
    const meta = D.SCORE_META;
    const dims = meta.map(m => ({ short: m.k, value: a.scores[m.key] }));
    const compare = meta.map(m => ({ value: a.previous[m.key] }));
    const [exportOpen, setExportOpen] = useState(false);
    const [extensionStatus, setExtensionStatus] = useState('');
    const [extensionBusy, setExtensionBusy] = useState('');
    const lab = openScore || (() => {});
    // each priority gap maps to the dimension it moves most
    const gapDim = ['citationReadiness', 'content', 'entityClarity', 'citationReadiness', 'technical'];

    const sections = [['sec-score', 'Score'], ['sec-dims', 'Dimensions'], ['sec-evidence', 'Evidence'],
      ['sec-guidance', 'Google guidance'], ['sec-gaps', 'Priority gaps'], ['sec-intents', 'Intent map'], ['sec-pages', 'Pages']];

    const exports = [
      ['JSON', 'fileText', `/audits/${audit.id}/export.json`],
      ['HTML report', 'fileText', `/audits/${audit.id}/export.html`],
      ['Full ZIP', 'box', `/audits/${audit.id}/export.zip`],
      ['Citation evidence', 'quote', `/audits/${audit.id}/citation-evidence.zip`],
      ['Agency report', 'fileText', `/audits/${audit.id}/agency-report.html`]
    ];

    const runExtension = async (name, action) => {
      setExtensionBusy(name);
      setExtensionStatus('');
      try {
        const result = await action();
        if (result?.audit) Object.assign(window.JS_DATA.AUDIT, result.audit);
        setExtensionStatus(`${name} completed`);
      } catch (e) {
        setExtensionStatus(`${name} failed: ${e.message}`);
      } finally {
        setExtensionBusy('');
      }
    };

    return (
      <div className="js-view js-view--wide">
        <div className="js-pagehead">
          <div>
            <p className="eyebrow">Audit · {new Date(audit.runAt).toLocaleDateString('en-AU', { day: 'numeric', month: 'short', year: 'numeric' })}</p>
            <h1>{audit.clientName} <em>scored</em>.</h1>
            <p className="sub"><span className="js-num" style={{ color: 'var(--gold)' }}>{audit.websiteUrl.replace('https://', '')}</span> · {audit.industry} · {audit.primaryLocation} · {audit.pagesCrawled} pages crawled</p>
          </div>
          <div className="js-head-actions">
            <Btn kind="ghost" icon="refresh" sm onClick={() => go('run-audit')}>Re-run</Btn>
            <div style={{ position: 'relative' }}>
              <Btn kind="ghost" icon="download" iconRight="chevronDown" sm onClick={() => setExportOpen(o => !o)}>Export</Btn>
              {exportOpen && <>
                <div style={{ position: 'fixed', inset: 0, zIndex: 80 }} onClick={() => setExportOpen(false)} />
                <div className="js-menu" style={{ zIndex: 81, minWidth: 220 }}>
                  <div className="js-menu-label">Download</div>
                  {exports.map(([l, ic, path]) => <div key={l} className="js-menu-item" onClick={() => { setExportOpen(false); window.JS_API.download(path); }}>
                    <span className="mi-glyph"><Icon name={ic} size={15} /></span><div className="mi-name">{l}</div></div>)}
                </div>
              </>}
            </div>
            <Btn kind="gold" icon="sparkles" onClick={onGenerate}>Generate pack</Btn>
          </div>
        </div>

        <Panel style={{ marginBottom: 18 }}>
          <PanelHead eyebrow="Advanced audit outputs" title="Source-project extensions" desc="These actions call the migrated backend extension routes attached to audit results." />
          <div className="row-wrap">
            <Btn sm kind="ghost" icon="fileText" onClick={() => runExtension('Guidance plan', () => window.JS_API.audits.guidancePlan(audit.id))}>{extensionBusy === 'Guidance plan' ? 'Generating…' : 'Guidance plan'}</Btn>
            <Btn sm kind="ghost" icon="layers" onClick={() => runExtension('Implementation suite', () => window.JS_API.audits.implementationSuite(audit.id))}>{extensionBusy === 'Implementation suite' ? 'Building…' : 'Implementation suite'}</Btn>
            <Btn sm kind="ghost" icon="play" onClick={() => runExtension('Queue suite', () => window.JS_API.audits.queueImplementationSuite(audit.id, []))}>{extensionBusy === 'Queue suite' ? 'Queueing…' : 'Queue suite'}</Btn>
            <Btn sm kind="gold" icon="sparkles" onClick={() => runExtension('Level10', () => window.JS_API.audits.level10(audit.id))}>{extensionBusy === 'Level10' ? 'Enhancing…' : 'Level10'}</Btn>
          </div>
          {extensionStatus && <div className="js-gap sev-low" style={{ marginTop: 14 }}><p style={{ margin: 0, fontSize: 12.5 }}>{extensionStatus}</p></div>}
        </Panel>

        {/* sticky anchor subnav */}
        <SubNav sections={sections} />

        {/* ---- SCORE HERO ---- */}
        <Panel id="sec-score" raised className="js-artback" style={{ marginBottom: 18, padding: '34px 36px' }}>
          <div className="js-scorehero">
            <div className="lab-dial-trigger" onClick={() => lab('total')} role="button" aria-label="Why this JiffyScore?">
              <ScoreDial value={a.scores.total} label="JiffyScore" delta={a.scores.total - a.previous.total} size="xl" />
              <span className="lab-dial-hint"><Icon name="flask" size={13} />Why this score? · simulate fixes</span>
            </div>
            <div>
              <p className="eyebrow">Composite verdict</p>
              <h2 className="display-3" style={{ margin: '12px 0 14px', maxWidth: '18ch' }}>Strong foundation, <em>under-cited</em>.</h2>
              <p className="lead" style={{ fontSize: 16, marginBottom: 20 }}>
                {audit.clientName} ranks and converts well, but answer engines paraphrase rather than cite it. The fastest gains are in <strong style={{ color: 'var(--ink)' }}>citation readiness</strong> and <strong style={{ color: 'var(--ink)' }}>entity clarity</strong> — structure the proof you already have.
              </p>
              <div className="row-wrap">
                <Pill tone="green">Local visibility {a.scores.localVisibility}</Pill>
                <Pill tone="amber">AI readiness {a.scores.aiReadiness}</Pill>
                <Pill tone="coral">Citation {a.scores.citationReadiness}</Pill>
                <Pill>Glass-box scoring</Pill>
              </div>
            </div>
          </div>
        </Panel>

        {/* ---- DIMENSIONS: gauges + radar ---- */}
        <div id="sec-dims" className="js-cols-main" style={{ marginBottom: 18 }}>
          <Panel>
            <PanelHead eyebrow="Six dimensions" title="Every number shows its work" desc="Hover any dimension to see what drives it. The composite is a weighted blend — no black boxes." />
            <div className="js-gauges">
              {meta.map(m => <MiniGauge key={m.key} value={a.scores[m.key]} name={m.name} k={m.k} why={m.why} onClick={() => lab(m.key)} />)}
            </div>
          </Panel>
          <Panel>
            <PanelHead title="Score shape" />
            <RadarChart dims={dims} compare={compare} />
            <div className="row" style={{ justifyContent: 'center', gap: 20, marginTop: 8, fontSize: 12, color: 'var(--ink-soft)' }}>
              <span className="row" style={{ gap: 6 }}><span style={{ width: 14, height: 3, background: 'var(--gold)', borderRadius: 2 }} />Now</span>
              <span className="row" style={{ gap: 6 }}><span style={{ width: 14, height: 0, borderTop: '2px dashed var(--mute)' }} />Last run</span>
            </div>
          </Panel>
        </div>

        {/* ---- IMPORTED EVIDENCE ---- */}
        <Panel id="sec-evidence" style={{ marginBottom: 18 }}>
          <PanelHead eyebrow="Imported search evidence" title="Grounded in real performance data"
            desc="Search Console and GA4 signals feed directly into scoring — not guesses." />
          <div className="js-grid-2">
            <div>
              <div className="js-tag" style={{ marginBottom: 10 }}>Search Console · {a.webmasterSignals.rowCount} rows</div>
              <div className="js-grid-3" style={{ gap: 10 }}>
                <MetricChip k="Avg position" v={a.webmasterSignals.averagePosition} />
                <MetricChip k="Low-CTR queries" v={a.webmasterSignals.lowCtrCount} />
                <MetricChip k="Rank opportunities" v={a.webmasterSignals.rankingOpportunityCount} />
              </div>
            </div>
            <div>
              <div className="js-tag" style={{ marginBottom: 10 }}>GA4 analytics · {a.analyticsSignals.rowCount} rows</div>
              <div className="js-grid-3" style={{ gap: 10 }}>
                <MetricChip k="Engagement" v={Math.round(a.analyticsSignals.averageEngagementRate * 100) + '%'} />
                <MetricChip k="Conversion" v={(a.analyticsSignals.averageConversionRate * 100).toFixed(1) + '%'} />
                <MetricChip k="Low-conv pages" v={a.analyticsSignals.lowConversionCount} />
              </div>
            </div>
          </div>
        </Panel>

        {/* ---- GOOGLE GUIDANCE ---- */}
        <Panel id="sec-guidance" style={{ marginBottom: 18 }}>
          <PanelHead eyebrow="Standards checklist" title="Mapped to official Google guidance">
            <div className="js-scorechip"><span className="sc-ring" style={{ background: 'var(--gold)' }} />{a.googleGuidance.summary.score}/100</div>
          </PanelHead>
          <div className="row-wrap" style={{ marginBottom: 16 }}>
            <Pill tone="green">{a.googleGuidance.summary.passCount} pass</Pill>
            <Pill tone="amber">{a.googleGuidance.summary.needsWorkCount} needs work</Pill>
          </div>
          <div className="js-grid-2">
            {a.googleGuidance.checks.map((c, i) => (
              <div key={i} className={'js-gap ' + (c.status === 'pass' ? 'sev-low' : 'sev-medium')}>
                <h4>{c.status === 'pass' ? <Icon name="check" size={16} style={{ color: 'var(--emerald)' }} /> : <Icon name="alert" size={16} style={{ color: 'var(--gold)' }} />}{c.title}</h4>
                <div className="meta"><Pill tone={c.status === 'pass' ? 'green' : 'amber'}>{c.status === 'pass' ? 'Pass' : 'Needs work'}</Pill><span className="js-tag">{c.source}</span></div>
                <p>{c.why}</p>
                <div className="action"><b>Action ·</b> {c.action}</div>
              </div>
            ))}
          </div>
        </Panel>

        {/* ---- PRIORITY GAPS ---- */}
        <Panel id="sec-gaps" style={{ marginBottom: 18 }}>
          <PanelHead eyebrow="Priority gaps" title="What's costing you citations" desc="Ranked by impact on AI-search visibility. Each one becomes a generated asset in your pack.">
            <Btn kind="gold" sm icon="sparkles" onClick={onGenerate}>Generate fixes</Btn>
          </PanelHead>
          <div className="js-rows">
            {a.gaps.map((g, i) => (
              <div key={i} className={'js-gap sev-' + g.severity} onClick={() => lab(gapDim[i])} style={{ cursor: 'pointer' }}>
                <h4>{g.title}</h4>
                <div className="meta">
                  <Pill tone={g.severity === 'high' ? 'coral' : g.severity === 'medium' ? 'amber' : 'green'}>{g.severity} priority</Pill>
                  <Pill>{g.impact} impact</Pill>
                  <span className="js-link-gold" style={{ marginLeft: 'auto' }}>Why &amp; simulate <Icon name="arrow" size={13} /></span>
                </div>
                <p>{g.whyItMatters}</p>
                <div className="action"><b>Action ·</b> {g.action}</div>
              </div>
            ))}
          </div>
        </Panel>

        {/* ---- INTENT MAP + ENTITY ---- */}
        <div id="sec-intents" className="js-cols-main" style={{ marginBottom: 18 }}>
          <Panel>
            <PanelHead eyebrow="Search intent map" title="Questions AI should answer with you" desc="The prompts your buyers ask answer engines — and how urgent each is." />
            <div className="js-rows">
              {a.searchIntents.map((q, i) => (
                <div key={i} className="js-rowcard" style={{ gridTemplateColumns: '1fr auto auto', cursor: 'default', padding: '13px 18px' }}>
                  <div className="rc-title" style={{ fontSize: 14 }}>{q.query}</div>
                  <Pill>{q.type}</Pill>
                  <Pill tone={q.priority === 'high' ? 'coral' : q.priority === 'medium' ? 'amber' : 'green'}>{q.priority}</Pill>
                </div>
              ))}
            </div>
          </Panel>
          <Panel>
            <PanelHead title="Entity understanding" />
            <h3 style={{ fontFamily: 'var(--font-display)', fontSize: 22, margin: '0 0 4px', color: 'var(--ink)' }}>{a.entities.brandName}</h3>
            <p className="js-tag" style={{ marginBottom: 16 }}>{a.entities.industry} · {a.entities.domain}</p>
            {[['Services', a.entities.services], ['Locations', a.entities.locations], ['Audiences', a.entities.audiences], ['Trust signals', a.entities.proof.signals]].map(([label, items]) => (
              <div key={label} style={{ marginBottom: 14 }}>
                <div className="js-tag" style={{ marginBottom: 8 }}>{label}</div>
                <div className="row-wrap">{items.map((it, j) => <span key={j} className="pill" style={{ background: 'var(--bg-2)' }}>{it}</span>)}</div>
              </div>
            ))}
          </Panel>
        </div>

        {/* ---- PAGE FINDINGS ---- */}
        <Panel id="sec-pages">
          <PanelHead eyebrow="Crawled pages" title={audit.pagesCrawled + ' pages analysed'} desc="Per-page schema coverage and flags that affect how models read each URL." />
          <div className="js-table-wrap">
            <table className="js-table">
              <thead><tr><th>Page</th><th>Title</th><th>Words</th><th>Index</th><th>Schema</th><th>Flags</th></tr></thead>
              <tbody>
                {a.pageFindings.map((p, i) => (
                  <tr key={i}>
                    <td className="t-strong" style={{ fontFamily: 'var(--font-mono)', fontSize: 12.5 }}>{p.url}</td>
                    <td>{p.title}</td>
                    <td className="js-num" style={{ color: p.wordCount < 250 ? 'var(--coral)' : 'var(--ink-soft)' }}>{p.wordCount}</td>
                    <td>{p.indexable ? <Pill tone="green" dot={false}>Yes</Pill> : <Pill tone="coral" dot={false}>No</Pill>}</td>
                    <td>{p.schemaTypes.length ? p.schemaTypes.map((s, j) => <span key={j} className="pill" style={{ background: 'var(--bg-2)', marginRight: 4 }}>{s}</span>) : <span className="js-tag">None</span>}</td>
                    <td>{p.flags.length ? p.flags.map((f, j) => <span key={j} className="pill pill--coral" style={{ marginRight: 4 }} dot="false">{f}</span>) : <span className="js-tag">Clean</span>}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </Panel>
      </div>
    );
  }

  function SubNav({ sections }) {
    const [active, setActive] = useState(sections[0][0]);
    React.useEffect(() => {
      const onScroll = () => {
        let cur = sections[0][0];
        for (const [id] of sections) {
          const el = document.getElementById(id);
          if (el && el.getBoundingClientRect().top < 200) cur = id;
        }
        setActive(cur);
      };
      window.addEventListener('scroll', onScroll, { passive: true });
      onScroll();
      return () => window.removeEventListener('scroll', onScroll);
    }, []);
    return (
      <div className="js-subnav">
        {sections.map(([id, label]) => (
          <a key={id} className={active === id ? 'is-active' : ''} onClick={() => scrollToId(id)}>{label}</a>
        ))}
      </div>
    );
  }

  window.ResultsReport = ResultsReport;
})();
