(function registerFreeSeoPageLabView(global) {
  'use strict';

  function getApi() {
    return global.JS_API && global.JS_API.freeSeo && global.JS_API.freeSeo.pageLab;
  }

  function formatDate(value) {
    if (!value) return 'Not available';
    try { return new Date(value).toLocaleString(); } catch (error) { return value; }
  }

  function RunList(props) {
    var React = global.React;
    var runs = props.runs || [];
    var selectedId = props.selectedId;
    var onSelect = props.onSelect || function noop() {};
    if (!runs.length) return React.createElement('p', { className: 'free-seo-empty' }, 'No Page Lab runs yet.');
    return React.createElement('div', { className: 'free-seo-run-list' }, runs.map(function mapRun(run) {
      var summary = run.summary || {};
      var className = 'free-seo-run-list-item' + (run.id === selectedId ? ' is-selected' : '');
      return React.createElement('button', { key: run.id, type: 'button', className: className, onClick: function click() { onSelect(run); } }, [
        React.createElement('strong', { key: 'id' }, run.id),
        React.createElement('span', { key: 'status' }, run.status + ' / ' + (summary.pageCount || 0) + ' page(s)'),
        React.createElement('small', { key: 'time' }, formatDate(run.createdAt))
      ]);
    }));
  }

  function PageTable(props) {
    var React = global.React;
    var pages = props.pages || [];
    var onSelectPage = props.onSelectPage || function noop() {};
    if (!pages.length) return React.createElement('p', { className: 'free-seo-empty' }, 'This run has no page results yet.');
    return React.createElement('div', { className: 'free-seo-table-wrap' }, React.createElement('table', { className: 'free-seo-page-table' }, [
      React.createElement('thead', { key: 'thead' }, React.createElement('tr', null, [
        React.createElement('th', { key: 'url' }, 'URL'),
        React.createElement('th', { key: 'overall' }, 'Overall'),
        React.createElement('th', { key: 'a11y' }, 'A11y'),
        React.createElement('th', { key: 'seo' }, 'SEO'),
        React.createElement('th', { key: 'fixes' }, 'Fixes'),
        React.createElement('th', { key: 'action' }, 'Action')
      ])),
      React.createElement('tbody', { key: 'tbody' }, pages.map(function mapPage(page) {
        var scores = page.scores || {};
        var counts = page.recommendationCounts || {};
        function pct(value) {
          if (value === null || value === undefined) return 'N/A';
          var numeric = Number(value);
          if (numeric > 1) numeric = numeric / 100;
          return Math.round(numeric * 100) + '%';
        }
        return React.createElement('tr', { key: page.encodedUrl || page.url }, [
          React.createElement('td', { key: 'url' }, React.createElement('span', { title: page.url }, page.url)),
          React.createElement('td', { key: 'overall' }, pct(scores.overall)),
          React.createElement('td', { key: 'a11y' }, pct(scores.accessibility)),
          React.createElement('td', { key: 'seo' }, pct(scores.seo)),
          React.createElement('td', { key: 'fixes' }, (counts.critical || 0) + ' critical / ' + (counts.high || 0) + ' high'),
          React.createElement('td', { key: 'action' }, React.createElement('button', { type: 'button', onClick: function click() { onSelectPage(page); } }, 'View evidence'))
        ]);
      }))
    ]));
  }

  function SummaryCards(props) {
    var React = global.React;
    var summary = props.summary || {};
    var scores = summary.scoreAverages || {};
    var counts = summary.recommendationCounts || {};
    var ScoreGrid = global.FreeSeoLighthouseScoreGrid;
    return React.createElement('section', { className: 'free-seo-section' }, [
      React.createElement('h2', { key: 'title' }, 'Run summary'),
      ScoreGrid ? React.createElement(ScoreGrid, { key: 'scores', scores: scores }) : null,
      React.createElement('div', { key: 'meta', className: 'free-seo-summary-grid' }, [
        React.createElement('div', { key: 'pages' }, [React.createElement('span', { key: 'label' }, 'Pages'), React.createElement('strong', { key: 'value' }, summary.pageCount || 0)]),
        React.createElement('div', { key: 'critical' }, [React.createElement('span', { key: 'label' }, 'Critical fixes'), React.createElement('strong', { key: 'value' }, counts.critical || 0)]),
        React.createElement('div', { key: 'high' }, [React.createElement('span', { key: 'label' }, 'High fixes'), React.createElement('strong', { key: 'value' }, counts.high || 0)]),
        React.createElement('div', { key: 'failed' }, [React.createElement('span', { key: 'label' }, 'Failed pages'), React.createElement('strong', { key: 'value' }, summary.failedPageCount || 0)])
      ])
    ]);
  }

  function FreeSeoPageLabView(props) {
    var React = global.React;
    var useEffect = React.useEffect;
    var useState = React.useState;
    var Form = global.FreeSeoPageLabRunForm;
    var Drawer = global.FreeSeoPageLabEvidenceDrawer;
    var api = getApi();
    var initial = props && props.initial || {};
    var statePair = useState({ loading: true, creating: false, error: null, runs: [], selectedRun: null, selectedPage: null });
    var state = statePair[0];
    var setState = statePair[1];

    function setPatch(patch) {
      setState(function merge(prev) { return Object.assign({}, prev, patch); });
    }

    function loadRuns() {
      if (!api) {
        setPatch({ loading: false, error: 'Page Lab API client is not loaded.' });
        return Promise.resolve();
      }
      setPatch({ loading: true, error: null });
      return api.list({ limit: 10, websiteId: initial.websiteId, auditId: initial.auditId }).then(function handle(data) {
        var runs = data && data.items || [];
        setPatch({ loading: false, runs: runs, selectedRun: state.selectedRun || runs[0] || null });
      }).catch(function handleError(error) {
        setPatch({ loading: false, error: error.message || 'Unable to load Page Lab runs.' });
      });
    }

    useEffect(function onMount() {
      loadRuns();
    }, []);

    function createRun(payload) {
      if (!api) return;
      setPatch({ creating: true, error: null, selectedPage: null });
      api.create(payload).then(function created(run) {
        setPatch({ creating: false, selectedRun: run, selectedPage: null });
        return loadRuns();
      }).catch(function handleError(error) {
        setPatch({ creating: false, error: error.message || 'Unable to create Page Lab run.' });
      });
    }

    if (state.loading && !state.runs.length) {
      return React.createElement('main', { className: 'free-seo-page-lab-view' }, React.createElement('p', null, 'Loading Page Lab...'));
    }

    var selectedRun = state.selectedRun;
    var pages = selectedRun && selectedRun.results && selectedRun.results.pages || [];

    return React.createElement('main', { className: 'free-seo-page-lab-view' }, [
      React.createElement('header', { key: 'header', className: 'free-seo-lab-header' }, [
        React.createElement('p', { key: 'eyebrow', className: 'eyebrow' }, 'Free SEO Lab'),
        React.createElement('h1', { key: 'title' }, 'Page Lab'),
        React.createElement('p', { key: 'copy' }, 'Run Lighthouse, axe-core, and static fallback evidence checks for selected URLs. No paid API key is required.'),
        state.error ? React.createElement('div', { key: 'error', className: 'alert alert-error' }, state.error) : null
      ]),
      React.createElement('section', { key: 'form', className: 'free-seo-section' }, [
        React.createElement('h2', { key: 'title' }, 'Create Page Lab run'),
        Form ? React.createElement(Form, { key: 'form', initial: initial, onSubmit: createRun }) : React.createElement('p', { key: 'missing' }, 'Page Lab form component is missing.'),
        state.creating ? React.createElement('p', { key: 'creating' }, 'Running Page Lab...') : null
      ]),
      React.createElement('section', { key: 'runs', className: 'free-seo-page-lab-layout' }, [
        React.createElement('aside', { key: 'list' }, [
          React.createElement('h2', { key: 'title' }, 'Recent Page Lab runs'),
          React.createElement(RunList, { key: 'runs', runs: state.runs, selectedId: selectedRun && selectedRun.id, onSelect: function select(run) { setPatch({ selectedRun: run, selectedPage: null }); } })
        ]),
        React.createElement('div', { key: 'detail' }, selectedRun ? [
          React.createElement(SummaryCards, { key: 'summary', summary: selectedRun.summary || {} }),
          React.createElement('section', { key: 'pages', className: 'free-seo-section' }, [
            React.createElement('div', { key: 'heading', className: 'free-seo-section-heading' }, [
              React.createElement('h2', { key: 'title' }, 'Page evidence'),
              api && api.reportHtmlUrl ? React.createElement('a', { key: 'report', href: api.reportHtmlUrl(selectedRun.id), target: '_blank', rel: 'noopener noreferrer' }, 'Open HTML report') : null
            ]),
            React.createElement(PageTable, { key: 'table', pages: pages, onSelectPage: function selectPage(page) { setPatch({ selectedPage: page }); } })
          ])
        ] : React.createElement('p', { className: 'free-seo-empty' }, 'Select or create a Page Lab run.'))
      ]),
      Drawer ? React.createElement(Drawer, { key: 'drawer', page: state.selectedPage, onClose: function close() { setPatch({ selectedPage: null }); } }) : null
    ]);
  }

  global.FreeSeoPageLabView = FreeSeoPageLabView;
  global.JiffyScoreViews = global.JiffyScoreViews || {};
  global.JiffyScoreViews.freeSeoPageLab = FreeSeoPageLabView;
})(typeof window !== 'undefined' ? window : globalThis);
