(function registerFreeSeoPromptSimulatorView(global) {
  const React = global.React;
  if (!React) return;

  function promptResultsFor(run) {
    return (run && run.promptResults) || (run && run.results && run.results.prompts) || [];
  }

  function averageAnswerability(run) {
    const summary = run && run.summary || {};
    if (Number.isFinite(Number(summary.averageAnswerability))) return Number(summary.averageAnswerability);
    if (summary.averageScores && Number.isFinite(Number(summary.averageScores.answerabilityScore))) return Math.round(Number(summary.averageScores.answerabilityScore) * 100);
    return 0;
  }

  function averageCitation(run) {
    const summary = run && run.summary || {};
    if (Number.isFinite(Number(summary.averageCitationReadiness))) return Number(summary.averageCitationReadiness);
    if (summary.averageScores && Number.isFinite(Number(summary.averageScores.citationReadinessScore))) return Math.round(Number(summary.averageScores.citationReadinessScore) * 100);
    return 0;
  }

  function promptCount(run) {
    const summary = run && run.summary || {};
    return summary.promptCount || summary.totalPrompts || promptResultsFor(run).length || 0;
  }

  function weakCount(run) {
    const summary = run && run.summary || {};
    return summary.weakPromptCount || summary.weak || 0;
  }

  function intentLabel(result) {
    const value = (result && result.intent && (result.intent.type || result.intent)) || 'intent';
    return String(value).replace(/_/g, ' ');
  }

  function PromptSimulatorView() {
    const api = global.JS_API && global.JS_API.freeSeo && global.JS_API.freeSeo.promptSimulator;
    const [runs, setRuns] = React.useState([]);
    const [activeRun, setActiveRun] = React.useState(null);
    const [selected, setSelected] = React.useState(null);
    const [loading, setLoading] = React.useState(false);
    const [error, setError] = React.useState('');

    React.useEffect(() => {
      refreshRuns();
    }, []);

    async function refreshRuns() {
      if (!api) return;
      try {
        const response = await api.listRuns({ limit: 10 });
        const items = response.data && response.data.items ? response.data.items : response.data || [];
        setRuns(items);
        if (!activeRun && items[0]) setActiveRun(items[0]);
      } catch (err) {
        setError(err.message);
      }
    }

    async function createRun(payload) {
      setLoading(true);
      setError('');
      try {
        const response = await api.createRun(payload);
        const run = response.data;
        setActiveRun(run);
        setSelected(promptResultsFor(run)[0]);
        await refreshRuns();
      } catch (err) {
        setError(err.message);
      } finally {
        setLoading(false);
      }
    }

    async function openRun(run) {
      if (!api) return;
      setLoading(true);
      setError('');
      try {
        const response = await api.getRun(run.id);
        const detail = response.data;
        setActiveRun(detail);
        setSelected(promptResultsFor(detail)[0]);
      } catch (err) {
        setError(err.message);
      } finally {
        setLoading(false);
      }
    }

    if (!api) {
      return <div className="free-seo-card"><h2>Prompt Simulator</h2><p>Prompt simulator client is not loaded.</p></div>;
    }

    const selectedResult = selected || promptResultsFor(activeRun)[0];

    return <div className="free-seo-lab-page prompt-simulator-page">
      <header className="free-seo-page-header">
        <div>
          <p className="eyebrow">Free SEO Lab · Patch 03</p>
          <h2>Local AI Prompt Simulator</h2>
          <p>Test whether your local site evidence can answer and cite customer prompts without paid LLM or SERP APIs.</p>
        </div>
        {activeRun && <div className="free-seo-actions">
          <a className="button secondary" href={api.reportUrl(activeRun.id)} target="_blank" rel="noreferrer">Open report</a>
          <button type="button" onClick={() => api.exportRun(activeRun.id, 'zip')}>Export ZIP</button>
        </div>}
      </header>

      {error && <div className="free-seo-error">{error}</div>}

      <div className="free-seo-grid-2 wide-left">
        <global.FreeSeoPromptRunForm onSubmit={createRun} loading={loading} />
        <aside className="free-seo-card compact">
          <h3>Recent runs</h3>
          {runs.length ? runs.map((run) => <button key={run.id} type="button" className="free-seo-run-pill" onClick={() => openRun(run)}>
            <strong>{run.runLabel || (run.inputs && run.inputs.websiteUrl) || run.websiteUrl || run.id}</strong>
            <span>{run.status} · {averageAnswerability(run)} avg</span>
          </button>) : <p>No runs yet.</p>}
        </aside>
      </div>

      {activeRun && <section className="free-seo-card">
        <div className="free-seo-card-header">
          <div>
            <h3>{activeRun.runLabel || (activeRun.inputs && activeRun.inputs.websiteUrl) || activeRun.websiteUrl || activeRun.id}</h3>
            <p>{activeRun.status} · {activeRun.results && activeRun.results.evidenceVersion ? `Evidence version ${activeRun.results.evidenceVersion}` : 'Local deterministic scoring'}</p>
          </div>
        </div>
        <div className="free-seo-metric-grid">
          <div><strong>{promptCount(activeRun)}</strong><span>Prompts</span></div>
          <div><strong>{averageAnswerability(activeRun)}</strong><span>Avg answerability</span></div>
          <div><strong>{averageCitation(activeRun)}</strong><span>Avg citation</span></div>
          <div><strong>{weakCount(activeRun)}</strong><span>Weak prompts</span></div>
        </div>
        <global.FreeSeoPromptResultCards results={promptResultsFor(activeRun)} onSelect={setSelected} />
      </section>}

      {selectedResult && <section className="free-seo-card">
        <div className="free-seo-card-header">
          <div>
            <h3>{selectedResult.query || selectedResult.prompt}</h3>
            <p>Intent: {intentLabel(selectedResult)} · Confidence: {selectedResult.confidence || selectedResult.scoreLabel}</p>
          </div>
        </div>
        <global.FreeSeoEvidencePageList pages={selectedResult.evidencePages || []} />
        <global.FreeSeoMissingFactsPanel missingFacts={selectedResult.missingFacts || []} actions={selectedResult.recommendedActions || []} />
      </section>}
    </div>;
  }

  global.FreeSeoPromptSimulatorView = PromptSimulatorView;
})(window);
