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

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

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

  function FreeSeoCrawlView(props) {
    var React = global.React;
    var useEffect = React.useEffect;
    var useState = React.useState;
    var Form = global.FreeSeoCrawlRunForm;
    var SummaryCards = global.FreeSeoCrawlSummaryCards;
    var IssueTable = global.FreeSeoCrawlIssueTable;
    var Drawer = global.FreeSeoPageIssueDrawer;
    var StatusBadge = global.FreeSeoRunStatusBadge;
    var api = getApi();
    var statePair = useState({ loading: true, running: false, error: null, runs: [], selectedRun: null, pages: [], issues: [], selectedIssue: null });
    var state = statePair[0];
    var setState = statePair[1];

    function patch(update) {
      setState(function apply(prev) { return Object.assign({}, prev, update); });
    }

    function loadRuns() {
      if (!api) {
        patch({ loading: false, error: 'Free SEO crawl API client is not loaded.' });
        return Promise.resolve();
      }
      patch({ loading: true, error: null });
      return api.list({ limit: 10 }).then(function handle(data) {
        var runs = data && data.items || [];
        var selected = runs[0] || null;
        patch({ loading: false, runs: runs, selectedRun: selected });
        if (selected) return loadRunDetails(selected.id);
        return null;
      }).catch(function handleError(error) {
        patch({ loading: false, error: error.message || 'Unable to load technical crawls.' });
      });
    }

    function loadRunDetails(runId) {
      if (!api || !runId) return Promise.resolve();
      return Promise.all([
        api.get(runId),
        api.pages(runId, { limit: 50 }).catch(function fallback() { return { items: [] }; }),
        api.issues(runId, { limit: 100 }).catch(function fallback() { return { items: [] }; })
      ]).then(function handle(results) {
        patch({ selectedRun: results[0], pages: results[1] && results[1].items || [], issues: results[2] && results[2].items || [] });
      }).catch(function handleError(error) {
        patch({ error: error.message || 'Unable to load crawl run details.' });
      });
    }

    function runCrawl(input) {
      if (!api) return;
      patch({ running: true, error: null });
      api.create(input).then(function handle(run) {
        patch({ running: false, selectedRun: run });
        return loadRuns();
      }).catch(function handleError(error) {
        patch({ running: false, error: error.message || 'Technical crawl failed.' });
      });
    }

    function download(format) {
      if (!api || !state.selectedRun) return;
      api.downloadExport(state.selectedRun.id, { format: format }).catch(function handleError(error) {
        patch({ error: error.message || 'Export failed.' });
      });
    }

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

    return React.createElement('main', { className: 'free-seo-crawl-view' }, [
      React.createElement('header', { key: 'header', className: 'free-seo-lab-header' }, [
        React.createElement('p', { key: 'eyebrow', className: 'eyebrow' }, 'AI SEO Lab / Technical Crawl'),
        React.createElement('h1', { key: 'title' }, 'Free Technical SEO Deep Crawl'),
        React.createElement('p', { key: 'copy' }, 'Run a key-free same-origin crawl to find indexability, metadata, content, link, media, schema, and social metadata issues.'),
        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' }, 'Start a crawl'),
        Form ? React.createElement(Form, { key: 'form', onSubmit: runCrawl, disabled: state.running, defaults: props && props.defaults || {} }) : null
      ]),
      state.selectedRun ? React.createElement('section', { key: 'summary', className: 'free-seo-section' }, [
        React.createElement('div', { key: 'head', className: 'free-seo-section-head' }, [
          React.createElement('div', { key: 'text' }, [
            React.createElement('h2', { key: 'title' }, 'Latest crawl summary'),
            React.createElement('p', { key: 'meta' }, 'Run ' + state.selectedRun.id + ' - ' + formatDate(state.selectedRun.createdAt))
          ]),
          StatusBadge ? React.createElement(StatusBadge, { key: 'badge', status: state.selectedRun.status }) : React.createElement('span', { key: 'status' }, state.selectedRun.status)
        ]),
        SummaryCards ? React.createElement(SummaryCards, { key: 'cards', summary: state.selectedRun.summary || {} }) : null,
        React.createElement('div', { key: 'exports', className: 'free-seo-export-row' }, [
          React.createElement('button', { key: 'json', type: 'button', onClick: function click() { download('json'); } }, 'Export JSON'),
          React.createElement('button', { key: 'issues', type: 'button', onClick: function click() { download('issues_csv'); } }, 'Export issues CSV'),
          React.createElement('button', { key: 'pages', type: 'button', onClick: function click() { download('pages_csv'); } }, 'Export pages CSV'),
          React.createElement('button', { key: 'html', type: 'button', onClick: function click() { download('html'); } }, 'Export HTML'),
          React.createElement('button', { key: 'zip', type: 'button', onClick: function click() { download('zip'); } }, 'Export ZIP')
        ])
      ]) : null,
      React.createElement('section', { key: 'runs', className: 'free-seo-section' }, [
        React.createElement('h2', { key: 'title' }, 'Recent technical crawls'),
        state.loading ? React.createElement('p', { key: 'loading' }, 'Loading crawls...') : null,
        React.createElement('div', { key: 'list', className: 'free-seo-run-list' }, state.runs.map(function mapRun(run) {
          return React.createElement('button', {
            key: run.id,
            type: 'button',
            className: state.selectedRun && state.selectedRun.id === run.id ? 'is-selected' : '',
            onClick: function click() { loadRunDetails(run.id); }
          }, [run.inputs && run.inputs.startUrl || run.id, ' - ', run.status]);
        }))
      ]),
      React.createElement('section', { key: 'issues', className: 'free-seo-section' }, [
        React.createElement('h2', { key: 'title' }, 'Issue inventory'),
        IssueTable ? React.createElement(IssueTable, { key: 'table', issues: state.issues, onSelect: function select(issue) { patch({ selectedIssue: issue }); } }) : null
      ]),
      Drawer ? React.createElement(Drawer, { key: 'drawer', issue: state.selectedIssue, onClose: function close() { patch({ selectedIssue: null }); } }) : null
    ]);
  }

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