/* WP Site Beam — WP Health
   Unified dashboard pulling WP + WooCommerce + installed plugin health.
   Matches WPSB plugin's WORDPRESS section (Site Info / SEO / Security / Reports).

   Data strategy:
   - Internal users (partner / admin / sa / dev) see Conceptualized Design data
     — dev.wpsitebeam.io, wpsitebeam.io, conceptualized.design
   - External users (customer / marketing) see demo data that's replaced on scan
   - Empty state shown for the "first site" placeholder in every demo set
*/

function WPHealth() {
  const { useState, useMemo } = React;
  const [s] = window.useWPSBD();
  const [tab, setTab] = useState('siteinfo');

  // Pick a dataset based on role. Internal = actualRole or role in the internal set.
  const internalRoles = new Set(['partner','admin','sa','dev']);
  const effectiveRole = s.actualRole && s.actualRole !== 'sa' ? s.actualRole : s.role;
  const isInternal = internalRoles.has(effectiveRole) || internalRoles.has(s.role);

  const SITES = isInternal ? CD_SITES : DEMO_SITES;
  const [siteIdx, setSiteIdx] = useState(() => {
    // Deep-link: if Sites page stashed a site name in localStorage, honor it once
    try {
      const preferred = localStorage.getItem('wpsb-wphealth-site');
      if (preferred) {
        localStorage.removeItem('wpsb-wphealth-site');
        const sites = isInternal ? CD_SITES : DEMO_SITES;
        const i = sites.findIndex(x => x.name === preferred || x.url.includes(preferred));
        if (i >= 0) return i;
      }
    } catch(e){}
    return 0;
  });
  const site = SITES[Math.min(siteIdx, SITES.length - 1)];

  const tabs = [
    { id:'siteinfo', label:'Site Info', icon:'globe',    desc:'WP environment, server, plugins & theme' },
    { id:'seo',      label:'SEO',       icon:'spark',    desc:'Unified SEO dashboard across plugins' },
    { id:'security', label:'Security',  icon:'shield',   desc:'SSL, core updates, user & plugin security' },
    { id:'reports',  label:'Reports',   icon:'chart',    desc:'Site health, monthly reports & form analytics' },
  ];

  // Agency name for INTERNAL pill — pulled from saved brand profile so it
  // updates when the user configures their white-label brand.
  const agencyShort = (() => {
    try {
      const b = JSON.parse(localStorage.getItem('wpsb-agency-brand') || '{}');
      const name = b.agencyName || 'Agency';
      // Short initials for the pill (max 3 chars)
      return name.split(/\s+/).filter(Boolean).map(w => w[0]).join('').slice(0,3).toUpperCase();
    } catch(e) { return 'AGENCY'; }
  })();

  // Connection status — derived from the picked site's health.
  // 'good' = connected & synced, 'warn' = stale, 'bad' = plugin not reporting.
  const curSite = SITES[siteIdx] || SITES[0];
  const connStatus = curSite?.health === 'good' ? 'ok' : curSite?.health === 'warn' ? 'warn' : 'bad';
  const connLabel = connStatus === 'ok' ? 'Connected' : connStatus === 'warn' ? 'Syncing' : 'Disconnected';
  const connColor = connStatus === 'ok' ? 'var(--green)' : connStatus === 'warn' ? 'var(--warn)' : 'var(--red)';
  const lastSync = curSite?.health === 'good' ? '2m ago' : curSite?.health === 'warn' ? '4h ago' : 'never';

  return (
    <div>
      <PageHead crumb="Tools"
        title={<span style={{ display:'inline-flex', alignItems:'center', gap:10 }}>
          WP Health
          {/* Live connection status — replaces old static v1.0 pill.
              Shows every role a useful "is my site talking to us right now?" signal. */}
          <span title={`Last sync from ${curSite?.name || 'site'}: ${lastSync}`}
                style={{ fontFamily:'var(--font-mono)', fontSize:'.58rem', padding:'3px 8px', borderRadius:4,
                         background: connStatus === 'ok' ? 'var(--green-dim)' : connStatus === 'warn' ? 'var(--warn-dim)' : 'rgba(220,38,38,.12)',
                         border: `1px solid ${connStatus === 'ok' ? 'var(--green-dim)' : connStatus === 'warn' ? 'var(--warn-dim)' : 'rgba(220,38,38,.3)'}`,
                         color: connColor, letterSpacing:'.08em', display:'inline-flex', alignItems:'center', gap:5 }}>
            <span style={{ width:6, height:6, borderRadius:'50%', background: connColor, boxShadow: connStatus === 'ok' ? `0 0 6px ${connColor}` : 'none' }}/>
            {connLabel.toUpperCase()} · {lastSync}
          </span>
          {/* Internal-only pill — dynamic agency initials from brand profile */}
          {isInternal && <span style={{ fontFamily:'var(--font-mono)', fontSize:'.58rem', padding:'3px 8px', borderRadius:4, background:'var(--orange-dim)', border:'1px solid var(--orange-dim)', color:'var(--orange)', letterSpacing:'.08em' }}>INTERNAL · {agencyShort}</span>}
        </span>}
        sub={`WordPress environment, SEO, security & reports — live data from the WPSB plugin. ${isInternal ? `Showing internal ${agencyShort} infrastructure.` : 'Example data — auto-replaced once the plugin connects.'}`}
        actions={<>
          {/* Site picker */}
          <div style={{ display:'inline-flex', alignItems:'center', gap:6, padding:'4px 10px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6 }}>
            <Icon name="sites" size={12}/>
            <select value={siteIdx} onChange={e => setSiteIdx(Number(e.target.value))}
                    style={{ background:'transparent', border:'none', color:'var(--text)', fontSize:'.78rem', fontFamily:'var(--font-mono)', outline:'none', cursor:'pointer', maxWidth:260 }}>
              {SITES.map((x, i) => <option key={x.url} value={i} style={{ background:'var(--surface)', color:'var(--text)' }}>{x.name} · {x.url.replace(/^https?:\/\//,'')}</option>)}
            </select>
          </div>
          <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Refreshing ${site.name}…`, 'info')}>
            <Icon name="refresh" size={12}/>Refresh
          </button>
          <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast(`Full scan started for ${site.name}`, 'ok')}>
            <Icon name="scanner" size={12}/>Run Scan
          </button>
        </>}
      />

      {/* Site header card */}
      <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8, padding:14, marginBottom:16, display:'grid', gridTemplateColumns:'auto 1fr auto', gap:14, alignItems:'center' }}>
        <div style={{ width:44, height:44, borderRadius:8, background: site.platform === 'WooCommerce' ? 'rgba(123,70,163,.15)' : 'var(--beam-dim)', border:'1px solid', borderColor: site.platform === 'WooCommerce' ? 'rgba(123,70,163,.35)' : 'var(--beam-dim)', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <Icon name="globe" size={20}/>
        </div>
        <div style={{ minWidth:0 }}>
          <div style={{ display:'flex', alignItems:'center', gap:8, marginBottom:2 }}>
            <strong style={{ fontSize:'.96rem' }}>{site.name}</strong>
            <span style={{ fontSize:'.66rem', padding:'2px 7px', borderRadius:3, background: site.platform === 'WooCommerce' ? 'rgba(123,70,163,.15)' : 'var(--beam-dim)', color: site.platform === 'WooCommerce' ? '#bb95d6' : '#5aa4d0', fontFamily:'var(--font-mono)', letterSpacing:'.08em' }}>
              {site.platform}
            </span>
            <span className={`tag ${site.health === 'good' ? 'ok' : site.health === 'warn' ? 'warn' : 'bad'}`}>
              {site.health === 'good' ? '✓ Healthy' : site.health === 'warn' ? '⚠ Attention' : '✕ Critical'}
            </span>
          </div>
          <div style={{ fontFamily:'var(--font-mono)', fontSize:'.72rem', color:'var(--dim)' }}>
            {site.url} · {site.host} · WP {site.wp_version} · PHP {site.php_version}
          </div>
        </div>
        <div style={{ display:'flex', gap:10, fontSize:'.7rem' }}>
          <div style={{ textAlign:'right' }}>
            <div style={{ color:'var(--dim)', fontSize:'.62rem', textTransform:'uppercase', letterSpacing:'.1em', fontFamily:'var(--font-mono)' }}>Last scan</div>
            <div style={{ fontFamily:'var(--font-mono)' }}>{site.last_scan || <em style={{ color:'var(--warn)' }}>never</em>}</div>
          </div>
        </div>
      </div>

      {/* Tabs */}
      <div className="sub-tabs" role="tablist" aria-label="WP Health sections">
        {tabs.map(t => (
          <button key={t.id} role="tab" aria-selected={tab === t.id}
                  className={'sub-tab' + (tab === t.id ? ' active' : '')}
                  onClick={() => setTab(t.id)}>
            <Icon name={t.icon} size={12}/>
            <span style={{ marginLeft:6 }}>{t.label}</span>
          </button>
        ))}
      </div>

      <div style={{ marginTop: 16 }}>
        {tab === 'siteinfo' && <SiteInfoTab site={site}/>}
        {tab === 'seo'      && <SEOTab site={site}/>}
        {tab === 'security' && <SecurityTab site={site}/>}
        {tab === 'reports'  && <ReportsTab site={site}/>}
      </div>
    </div>
  );
}

/* ── Datasets ─────────────────────────────────────────────── */

const CD_SITES = [
  {
    name:'Dev WPSiteBeam', url:'https://dev.wpsitebeam.io', host:'WP Engine · Sandbox',
    platform:'WordPress', wp_version:'6.9.4', php_version:'8.3.30',
    admin_email:'webmaster@conceptualizeddesign.com', language:'en_US', timezone:'America/Chicago',
    multisite:false, permalinks:'/%category%/%postname%/',
    mysql:'10.6.23', memory:'256M / 256M', debug:false, wp_cron:true,
    upload_max:'128M', post_max:'128M', max_exec:'300s', max_input_vars:3000, server:'nginx/1.26.1',
    plugins_active: 42, plugins_pending_updates: 9,
    themes_active:'Beam Child', themes_pending_updates:0,
    last_scan:'Apr 19, 2026 11:28 PM',
    health:'warn',
    seo_plugin:'SmartCrawl (via Branda)', seo_plugin_active:true,
    seo_stats:{ posts:1, pages:5, sitemap:true, home_title:'Dev WPSiteBeam', home_desc:'(not set)' },
    security_plugin:'WPMU Defender', security_active:true,
    plugins_detected:['WPMU DEV Dashboard','Defender Pro','SmartCrawl','Branda','Hummingbird Pro','Smush Pro','Gravity Forms','JetEngine','Elementor Pro'],
    forms:[{ n:'Support Intake', src:'Gravity Forms', submissions:28 }, { n:'Contact', src:'Gravity Forms', submissions:156 }],
    email_smtp:{
      plugin:'Gravity SMTP', version:'1.4.8', active:true, detected_at:'Apr 19, 2026 11:28 PM',
      mailer:'Gravity SMTP (native)', from_email:'noreply@dev.wpsitebeam.io', from_name:'WP Site Beam (Dev)',
      sent_30d:184, delivered_30d:181, bounced_30d:2, failed_30d:1, queue:0,
      last_success:'2h ago', last_fail:null,
      dns:{ spf:'pass', dkim:'pass', dmarc:'none (p=none)' },
      recent:[
        { t:'Support Intake → webmaster@conceptualizeddesign.com', status:'delivered', ago:'2h' },
        { t:'Contact → webmaster@conceptualizeddesign.com',        status:'delivered', ago:'5h' },
        { t:'WP Core → admin notification',                        status:'bounced',   ago:'1d', reason:'user unknown' },
      ],
    },
    analytics:{ sessions:4820, pageviews:12940, visitors:3120, bounce:42.3, avg_dur:'2m 14s', source:'Google Analytics 4',
      paid:{ sessions:642, spend:320, conversions:8, source:'Google Ads + Meta Ads (via GHL)' } },
    tracking:{
      pixels:[
        { id:'gtm',       name:'Google Tag Manager',    status:'firing',  value:'GTM-WPSB001',   loc:'<head>' },
        { id:'ga4',       name:'GA4 Measurement',        status:'firing',  value:'G-DEVWPSB1',    loc:'via GTM' },
        { id:'gads',      name:'Google Ads conversion', status:'firing',  value:'AW-1100220330', loc:'via GTM' },
        { id:'meta',      name:'Meta Pixel',            status:'firing',  value:'1044xxxxxx720', loc:'via GTM' },
        { id:'clarity',   name:'Microsoft Clarity',     status:'firing',  value:'ogswpsbdev',    loc:'<head>' },
        { id:'linkedin',  name:'LinkedIn Insight',      status:'stale',   value:'3920xxx',        loc:'<head>', note:'No events in 14d' },
        { id:'tiktok',    name:'TikTok Pixel',          status:'missing', value:'—',              loc:'—' },
        { id:'hubspot',   name:'HubSpot tracking',      status:'missing', value:'—',              loc:'—' },
      ],
      plugins:[
        { name:'Google Site Kit',           version:'1.147.0', role:'GA4 + GSC + AdSense' },
        { name:'PixelYourSite PRO',         version:'11.1.2',  role:'Meta + TikTok + Pinterest pixels' },
      ],
    },
  },
  {
    name:'WPSiteBeam (Prod)', url:'https://wpsitebeam.io', host:'WP Engine · Premier',
    platform:'WordPress', wp_version:'6.9.4', php_version:'8.3.30',
    admin_email:'hello@wpsitebeam.io', language:'en_US', timezone:'America/Chicago',
    multisite:false, permalinks:'/%postname%/',
    mysql:'10.6.23', memory:'512M / 1G', debug:false, wp_cron:true,
    upload_max:'256M', post_max:'256M', max_exec:'300s', max_input_vars:5000, server:'nginx/1.26.1',
    plugins_active: 38, plugins_pending_updates: 2,
    themes_active:'Beam Parent', themes_pending_updates:0,
    last_scan:'Apr 20, 2026 08:02 AM',
    health:'good',
    seo_plugin:'Yoast SEO Premium', seo_plugin_active:true,
    seo_stats:{ posts:24, pages:18, sitemap:true, home_title:'WP Site Beam — WordPress growth platform', home_desc:'AI-driven site scans, SEO, content ops & care plans for agencies.' },
    security_plugin:'Wordfence Premium', security_active:true,
    plugins_detected:['Yoast SEO Premium','Wordfence','ACF Pro','WP Rocket','WooCommerce','Stripe Gateway','Google Analytics 4','Elementor Pro'],
    forms:[{ n:'Agency Lead', src:'Gravity Forms', submissions:92 },{ n:'Newsletter', src:'Fluent Forms', submissions:428 }],
    email_smtp:{
      plugin:'Gravity SMTP', version:'1.4.8', active:true, detected_at:'Apr 20, 2026 08:02 AM',
      mailer:'SendGrid (via Gravity SMTP)', from_email:'hello@wpsitebeam.io', from_name:'WP Site Beam',
      sent_30d:2184, delivered_30d:2173, bounced_30d:7, failed_30d:4, queue:0,
      last_success:'12m ago', last_fail:'3d ago',
      dns:{ spf:'pass', dkim:'pass', dmarc:'pass (p=quarantine)' },
      recent:[
        { t:'Agency Lead → hello@wpsitebeam.io',    status:'delivered', ago:'12m' },
        { t:'Newsletter welcome → new subscriber',  status:'delivered', ago:'38m' },
        { t:'Password reset → customer',            status:'delivered', ago:'1h' },
      ],
    },
    analytics:{ sessions:48210, pageviews:183920, visitors:32104, bounce:38.9, avg_dur:'3m 48s', source:'Google Analytics 4',
      paid:{ sessions:9820, spend:4280, conversions:94, source:'Google Ads (direct) + Meta Ads (via GHL)' } },
    tracking:{
      pixels:[
        { id:'gtm',      name:'Google Tag Manager',    status:'firing', value:'GTM-WPSB2026',  loc:'<head>' },
        { id:'ga4',      name:'GA4 Measurement',        status:'firing', value:'G-WPSBPROD2',    loc:'via GTM' },
        { id:'gads',     name:'Google Ads conversion', status:'firing', value:'AW-1122334455', loc:'via GTM' },
        { id:'meta',     name:'Meta Pixel',             status:'firing', value:'1044xxxxxx999', loc:'via GTM' },
        { id:'linkedin', name:'LinkedIn Insight',       status:'firing', value:'4820xxx',        loc:'via GTM' },
        { id:'clarity',  name:'Microsoft Clarity',      status:'firing', value:'ogswpsbprod',    loc:'<head>' },
        { id:'hotjar',   name:'Hotjar',                 status:'firing', value:'HJ-48xxx',        loc:'<head>' },
        { id:'ghl',      name:'GHL tracking',           status:'firing', value:'sub-act-wpsb',   loc:'via GTM' },
      ],
      plugins:[
        { name:'Google Site Kit',           version:'1.147.0', role:'GA4 + GSC + AdSense' },
        { name:'PixelYourSite PRO',         version:'11.1.2',  role:'Meta + TikTok + Pinterest pixels' },
        { name:'MonsterInsights Pro',       version:'9.6.5',   role:'GA4 + eCommerce enhanced' },
      ],
    },
  },
  {
    name:'Conceptualized Design', url:'https://conceptualized.design', host:'Cloudways · DO 4GB',
    platform:'WooCommerce', wp_version:'6.9.4', php_version:'8.2.28',
    admin_email:'team@conceptualizeddesign.com', language:'en_US', timezone:'America/Chicago',
    multisite:false, permalinks:'/%postname%/',
    mysql:'8.0.36', memory:'256M / 512M', debug:false, wp_cron:true,
    upload_max:'128M', post_max:'128M', max_exec:'180s', max_input_vars:3000, server:'nginx/1.24.0',
    plugins_active: 31, plugins_pending_updates: 4,
    themes_active:'CD Brand', themes_pending_updates:1,
    last_scan:'Apr 18, 2026 02:14 PM',
    health:'good',
    seo_plugin:'Rank Math Pro', seo_plugin_active:true,
    seo_stats:{ posts:42, pages:12, sitemap:true, home_title:'Conceptualized Design — WordPress care & development', home_desc:'Care plans, custom development, and brand systems for ambitious teams.' },
    security_plugin:'Sucuri Platform', security_active:true,
    plugins_detected:['Rank Math Pro','Sucuri','WooCommerce','Stripe','ACF Pro','Gravity Forms','Imagify','Google Analytics 4'],
    forms:[{ n:'Service Inquiry', src:'Gravity Forms', submissions:64 },{ n:'Care Plan Onboarding', src:'Gravity Forms', submissions:22 }],
    email_smtp:{
      plugin:'WP Mail SMTP Pro', version:'4.1.2', active:true, detected_at:'Apr 18, 2026 02:14 PM',
      mailer:'Google Workspace (OAuth)', from_email:'team@conceptualizeddesign.com', from_name:'Conceptualized Design',
      sent_30d:642, delivered_30d:618, bounced_30d:14, failed_30d:10, queue:3,
      last_success:'24m ago', last_fail:'6h ago',
      dns:{ spf:'pass', dkim:'pass', dmarc:'fail (p=reject)' },
      recent:[
        { t:'Service Inquiry → team@',              status:'delivered', ago:'24m' },
        { t:'Care Plan Onboarding → new client',    status:'delivered', ago:'2h' },
        { t:'Renewal reminder → @gmail.com',        status:'failed',    ago:'6h', reason:'SPF softfail' },
        { t:'WooCommerce order → @aol.com',         status:'bounced',   ago:'1d', reason:'mailbox full' },
      ],
    },
    analytics:{ sessions:8940, pageviews:28120, visitors:6480, bounce:44.1, avg_dur:'2m 42s', source:'Google Analytics 4',
      paid:{ sessions:2140, spend:1820, conversions:38, source:'Google Ads + Meta Ads (via GHL)' } },
    tracking:{
      pixels:[
        { id:'gtm',      name:'Google Tag Manager',    status:'firing', value:'GTM-CDWPSB01',   loc:'<head>' },
        { id:'ga4',      name:'GA4 Measurement',       status:'firing', value:'G-CDWPSB2026',   loc:'via GTM' },
        { id:'gads',     name:'Google Ads conversion', status:'firing', value:'AW-999887766',   loc:'via GTM' },
        { id:'meta',     name:'Meta Pixel',            status:'firing', value:'938xxxxxx484',   loc:'via GTM' },
        { id:'ghl',      name:'GHL tracking',          status:'firing', value:'sub-act-cd',     loc:'via GTM' },
        { id:'pinterest',name:'Pinterest Tag',         status:'firing', value:'2619xxx',         loc:'<head>' },
        { id:'clarity',  name:'Microsoft Clarity',     status:'firing', value:'ogscdwpsb',       loc:'<head>' },
        { id:'callrail', name:'CallRail swap-script',  status:'firing', value:'callrail.com/cd', loc:'<head>' },
        { id:'hubspot',  name:'HubSpot tracking',      status:'stale',  value:'hs-24318877',     loc:'<head>', note:'Legacy — migrate to GHL' },
      ],
      plugins:[
        { name:'Pixel Manager for WooCommerce', version:'1.48.2', role:'Meta + Google Ads + Pinterest Conversions API' },
        { name:'Advanced Ads',                  version:'1.56.1', role:'Internal display ad manager' },
      ],
    },
  },
];

const DEMO_SITES = [
  {
    name:'Your WordPress Site (demo)', url:'https://example.com', host:'Generic hosting',
    platform:'WordPress', wp_version:'6.9.4', php_version:'8.2.12',
    admin_email:'admin@example.com', language:'en_US', timezone:'UTC',
    multisite:false, permalinks:'/%postname%/',
    mysql:'8.0.36', memory:'128M / 256M', debug:false, wp_cron:true,
    upload_max:'64M', post_max:'64M', max_exec:'120s', max_input_vars:1000, server:'nginx/1.22',
    plugins_active: 12, plugins_pending_updates: 3,
    themes_active:'Twenty Twenty-Six', themes_pending_updates:0,
    last_scan:null,
    health:'warn',
    seo_plugin:'Yoast SEO (free)', seo_plugin_active:true,
    seo_stats:{ posts:0, pages:0, sitemap:false, home_title:'Example Site', home_desc:'(not set)' },
    security_plugin:null, security_active:false,
    plugins_detected:['Yoast SEO','Contact Form 7','Akismet','Jetpack'],
    forms:[{ n:'Contact', src:'Contact Form 7', submissions:0 }],
    email_smtp:null,
    analytics:null,
    tracking:null,
  },
];

/* ── Site Info tab ─────────────────────────────────────────── */
function SiteInfoTab({ site }) {
  return (
    <div style={{ display:'grid', gap:14 }}>
      <InfoBlock title="Site Overview" icon="globe" tone="beam" rows={[
        ['Site Name',   site.name],
        ['URL',         site.url, true],
        ['Admin Email', site.admin_email, true],
        ['Language',    site.language, true],
        ['Timezone',    site.timezone, true],
        ['Multisite',   site.multisite ? 'Yes' : 'No'],
        ['Permalinks',  site.permalinks, true],
        ['Host / Plan', site.host],
      ]}/>

      <InfoBlock title="WordPress Environment" icon="sliders" tone="warn" rows={[
        ['WordPress',    site.wp_version, true],
        ['PHP',          site.php_version, true],
        ['MySQL',        site.mysql, true],
        ['Memory Limit', site.memory, true],
        ['Debug Mode',   site.debug ? 'Enabled' : 'Disabled'],
        ['WP Cron',      site.wp_cron ? 'Enabled' : 'Disabled'],
        ['Upload Max',   site.upload_max, true],
        ['Post Max',     site.post_max, true],
        ['Max Exec Time',site.max_exec, true],
        ['Max Input Vars', site.max_input_vars, true],
        ['Server',       site.server, true],
      ]}/>

      <div className="grid grid-2">
        <InfoBlock title="Plugins" icon="modules" tone="ok" rows={[
          ['Active', site.plugins_active],
          ['Updates pending', site.plugins_pending_updates, false, site.plugins_pending_updates > 0 ? 'warn' : 'ok'],
          ['SEO plugin detected', site.seo_plugin || 'none'],
          ['Security plugin', site.security_plugin || 'none'],
        ]} footer={
          <div style={{ marginTop:10, paddingTop:10, borderTop:'1px solid var(--border)' }}>
            <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', marginBottom:8, gap:8, flexWrap:'wrap' }}>
              <div style={{ fontSize:'.68rem', color:'var(--dim)', textTransform:'uppercase', letterSpacing:'.1em', fontFamily:'var(--font-mono)' }}>
                Active on this site · <strong style={{ color:'var(--text-2)' }}>{site.plugins_detected.length}</strong> of {site.plugins_active}
                <span style={{ marginLeft:8, padding:'1px 7px', background:'var(--green-dim)', color:'var(--green)', borderRadius:3, letterSpacing:'.08em', border:'1px solid var(--green-dim)' }}>LIVE</span>
              </div>
              <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast(`Re-syncing plugin list for ${site.name}…`, 'info');}} style={{ fontSize:'.68rem', color:'var(--beam)', textDecoration:'none', fontFamily:'var(--font-mono)' }}>↻ Re-sync</a>
            </div>
            <div style={{ display:'flex', flexWrap:'wrap', gap:4 }}>
              {site.plugins_detected.map(p => (
                <span key={p} style={{ fontSize:'.7rem', padding:'3px 8px', background:'var(--surface-3)', border:'1px solid var(--border)', borderRadius:3, color:'var(--text-2)', fontFamily:'var(--font-mono)' }}>{p}</span>
              ))}
            </div>
            <div style={{ marginTop:10, fontSize:'.68rem', color:'var(--dim)', lineHeight:1.55 }}>
              Pulled directly from <code style={{ background:'var(--surface-3)', padding:'1px 5px', borderRadius:2, fontSize:'.9em' }}>get_plugins()</code> + <code style={{ background:'var(--surface-3)', padding:'1px 5px', borderRadius:2, fontSize:'.9em' }}>is_plugin_active()</code> via the WP Site Beam plugin. Only <em>active</em> plugins shown — full inventory including inactive is in <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast('Opening WP Admin → Plugins', 'info');}} style={{ color:'var(--beam)' }}>WP Admin → Plugins ↗</a>.
            </div>
          </div>
        }/>
        <InfoBlock title="Themes" icon="brand" tone="" rows={[
          ['Active theme', site.themes_active],
          ['Updates pending', site.themes_pending_updates, false, site.themes_pending_updates > 0 ? 'warn' : 'ok'],
        ]} footer={
          <div style={{ marginTop:10, paddingTop:10, borderTop:'1px solid var(--border)', fontSize:'.72rem', color:'var(--dim)', lineHeight:1.5 }}>
            Last checked {site.last_scan || <em>never</em>} · 
            <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast('Opening WP Admin → Themes', 'info');}} style={{ marginLeft:4, color:'var(--beam)' }}>View in WP Admin ↗</a>
          </div>
        }/>
      </div>
    </div>
  );
}

/* ── SEO tab ───────────────────────────────────────────────── */
function SEOTab({ site }) {
  const unified = [
    { plugin: site.seo_plugin, detected: site.seo_plugin_active, primary: true },
    { plugin: 'WPSB Content SEO', detected: true, primary: false, note:'Running alongside' },
  ];
  const s = site.seo_stats;

  return (
    <div style={{ display:'grid', gap:14 }}>
      {/* Unified banner */}
      <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8, padding:16, display:'grid', gridTemplateColumns:'auto 1fr auto', gap:14, alignItems:'center' }}>
        <div style={{ width:40, height:40, borderRadius:6, background:'var(--beam-dim)', border:'1px solid var(--beam-dim)', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <Icon name="spark" size={18}/>
        </div>
        <div>
          <div style={{ fontSize:'.92rem', fontWeight:600, marginBottom:2 }}>SEO Dashboard</div>
          <div style={{ fontSize:'.76rem', color:'var(--dim)' }}>
            <strong style={{ color:'var(--warn)' }}>{site.seo_plugin}</strong> detected {site.seo_plugin_active ? '— active' : '— installed but inactive'}
            &nbsp;·&nbsp;
            WPSB Content SEO <span style={{ color:'var(--green)' }}>active</span>
          </div>
        </div>
        <span className="tag ok">✓ Active</span>
      </div>

      {/* Counts */}
      <div className="grid grid-3">
        <div className="stat"><div className="stat-lbl">Posts</div><div className="stat-val">{s.posts}</div></div>
        <div className="stat"><div className="stat-lbl">Pages</div><div className="stat-val">{s.pages}</div></div>
        <div className="stat">
          <div className="stat-lbl">Sitemap</div>
          <div className={`stat-val ${s.sitemap ? 'ok' : 'warn'}`}>{s.sitemap ? '✓' : '—'}</div>
        </div>
      </div>

      {/* Title + desc */}
      <InfoBlock title="Homepage meta" icon="content" tone="beam" rows={[
        ['Home Title', s.home_title, true],
        ['Home Description', s.home_desc || '(not set)', s.home_desc ? true : false, s.home_desc ? '' : 'warn'],
      ]}/>

      {/* Plugin unification */}
      <div className="card">
        <div className="card-head">
          <h2 className="card-title">Unified across installed SEO plugins</h2>
          <span className="tag">LIVE</span>
        </div>
        <div className="card-body" style={{ padding:0 }}>
          <table className="table">
            <thead>
              <tr>
                <th>Plugin</th>
                <th>Role</th>
                <th>Status</th>
                <th style={{ textAlign:'right' }}></th>
              </tr>
            </thead>
            <tbody>
              {unified.map(u => (
                <tr key={u.plugin}>
                  <td style={{ fontWeight:600 }}>{u.plugin}</td>
                  <td style={{ fontSize:'.76rem', color:'var(--dim)' }}>{u.primary ? 'Primary SEO plugin' : 'Companion'}{u.note ? ` — ${u.note}` : ''}</td>
                  <td><span className={`tag ${u.detected ? 'ok' : ''}`}>{u.detected ? 'Active' : 'Not detected'}</span></td>
                  <td style={{ textAlign:'right' }}>
                    <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Opening ${u.plugin}`, 'info')}>Open ↗</button>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      </div>

      {/* Actions */}
      <div style={{ display:'grid', gap:10 }}>
        <div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>
          <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast(`Deep-linking to ${site.seo_plugin} admin page…`, 'info')}>
            Open {site.seo_plugin.split(' ')[0]} ↗
          </button>
          <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Opening ${site.url}/sitemap_index.xml`, 'info')}>Sitemap ↗</button>
          <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast('Social/OG preview — reads og:* tags from the primary SEO plugin', 'info')}>Social ↗</button>
        </div>
        <div style={{ fontSize:'.68rem', color:'var(--dim)', lineHeight:1.55, fontFamily:'var(--font-mono)' }}>
          ↳ These buttons are <strong style={{ color:'var(--green)' }}>live-wired</strong> through the WP Site Beam plugin:
          <span style={{ color:'var(--text-2)' }}> Open {site.seo_plugin.split(' ')[0]}</span> deep-links to <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>/wp-admin/admin.php?page={site.seo_plugin.toLowerCase().includes('yoast') ? 'wpseo_dashboard' : site.seo_plugin.toLowerCase().includes('rank') ? 'rank-math' : 'wds_wizard'}</code>,
          <span style={{ color:'var(--text-2)' }}> Sitemap</span> opens the plugin-generated XML sitemap, and <span style={{ color:'var(--text-2)' }}>Social</span> previews OG/Twitter tags pulled via <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>get_post_meta()</code>. If the SEO plugin is deactivated, the buttons fall back to a "not installed" state.
        </div>
      </div>
    </div>
  );
}

/* ── Security tab ──────────────────────────────────────────── */
function SecurityTab({ site }) {
  // Rows structured as in the plugin screenshot
  const core = [
    { k:'WordPress Version', v:'v'+site.wp_version, ok:true, note:'Up to date' },
    { k:'PHP Version',       v:'PHP '+site.php_version, ok:true, note:'Supported' },
    { k:'SSL / HTTPS',       v:'Active', ok:true, note:'' },
    { k:'WP_DEBUG',          v: site.debug ? 'Enabled' : 'Disabled', ok:!site.debug, note: site.debug ? 'Turn off in production' : '' },
    { k:'File Editing',      v:'Enabled', ok:false, note:'Add DISALLOW_FILE_EDIT to wp-config.php' },
    { k:'Force SSL Admin',   v:'Enabled', ok:true, note:'' },
  ];
  const users = [
    { k:'"admin" Username', v:'Not found', ok:true },
    { k:'Admin Accounts',   v:'3 admins', ok:true },
  ];
  const updates = [
    { k:'Plugin Updates', v:`${site.plugins_pending_updates} pending`, ok: site.plugins_pending_updates === 0, note: site.plugins_pending_updates > 0 ? 'Update plugins to patch vulnerabilities' : 'All current' },
    { k:'Theme Updates',  v:`${site.themes_pending_updates} pending`,  ok: site.themes_pending_updates === 0, note: site.themes_pending_updates > 0 ? 'Update themes' : '' },
  ];
  const plugin = [
    { k:'Active Plugin', v: site.security_plugin || 'None detected', ok: !!site.security_active, note: site.security_active ? 'Detected and active' : 'Install Defender, Wordfence, or Sucuri' },
  ];

  return (
    <div style={{ display:'grid', gap:14 }}>
      {/* Intro card */}
      <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8, padding:16, display:'grid', gridTemplateColumns:'auto 1fr auto', gap:14, alignItems:'center' }}>
        <div style={{ width:40, height:40, borderRadius:6, background:'var(--green-dim)', border:'1px solid var(--green-dim)', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <Icon name="shield" size={18}/>
        </div>
        <div>
          <div style={{ fontSize:'.92rem', fontWeight:600, marginBottom:2 }}>Security</div>
          <div style={{ fontSize:'.76rem', color:'var(--dim)' }}>SSL, core updates, user roles, login security overview.</div>
        </div>
        <span className="tag">Beta</span>
      </div>

      <SecSection title="WordPress Core Security" icon="lock" tone="warn" items={core}/>
      <SecSection title="User Security" icon="team" tone="warn" items={users}/>
      <SecSection title="Updates Pending" icon="refresh" tone="warn" items={updates}/>
      <SecSection title="Security Plugin" icon="shield" tone="warn" items={plugin}/>

      <div style={{ fontSize:'.72rem', color:'var(--dim)', textAlign:'right' }}>
        Last checked {site.last_scan || <em>never</em>} · 
        <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast('Opening WP Site Health', 'info');}} style={{ marginLeft:4, color:'var(--beam)' }}>View full WP Site Health →</a>
      </div>
    </div>
  );
}

function SecSection({ title, icon, tone, items }) {
  return (
    <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8 }}>
      <div style={{ padding:'10px 16px', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', gap:8 }}>
        <Icon name={icon} size={12}/>
        <span style={{ fontFamily:'var(--font-mono)', fontSize:'.68rem', color:'var(--warn)', letterSpacing:'.14em', textTransform:'uppercase' }}>{title}</span>
      </div>
      <div>
        {items.map((it, i) => (
          <div key={it.k} style={{ display:'grid', gridTemplateColumns:'26px minmax(0, 200px) minmax(0, 140px) 1fr', gap:14, alignItems:'center', padding:'10px 16px', borderBottom: i < items.length - 1 ? '1px solid var(--border)' : 'none' }}>
            <div style={{ width:22, height:22, borderRadius:11, display:'flex', alignItems:'center', justifyContent:'center', background: it.ok ? 'var(--green-dim)' : 'var(--warn-dim)', color: it.ok ? 'var(--green)' : 'var(--warn)', fontWeight:700, fontSize:'.8rem' }}>
              {it.ok ? '✓' : '!'}
            </div>
            <div style={{ fontSize:'.82rem', color:'var(--text-2)' }}>{it.k}</div>
            <div style={{ fontSize:'.82rem', fontWeight:600, fontFamily:'var(--font-mono)', textAlign:'left' }}>{it.v}</div>
            <div style={{ fontSize:'.7rem', color: it.ok ? 'var(--dim)' : 'var(--warn)', textAlign:'left' }}>{it.note || ''}</div>
          </div>
        ))}
      </div>
    </div>
  );
}

/* ── Reports tab ───────────────────────────────────────────── */
function ReportsTab({ site }) {
  const hasScan = !!site.last_scan;
  const a = site.analytics;

  return (
    <div style={{ display:'grid', gap:14 }}>
      {/* Site Health banner */}
      <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8, padding:16 }}>
        <div style={{ display:'flex', alignItems:'flex-start', gap:14, marginBottom:14 }}>
          <div style={{ width:40, height:40, borderRadius:6, background:'var(--beam-dim)', border:'1px solid var(--beam-dim)', display:'flex', alignItems:'center', justifyContent:'center' }}>
            <Icon name="activity" size={18}/>
          </div>
          <div style={{ flex:1 }}>
            <div style={{ display:'flex', alignItems:'center', gap:8 }}>
              <strong style={{ fontSize:'.92rem' }}>Site Health</strong>
              <span className="tag ok">✓ Live</span>
            </div>
            <div style={{ fontSize:'.76rem', color:'var(--dim)' }}>Live data from this WordPress site.</div>
          </div>
        </div>
        <div className="grid grid-4" style={{ gap:8 }}>
          <MetricMini label="WordPress" value={site.wp_version}/>
          <MetricMini label="PHP" value={site.php_version}/>
          <MetricMini label="Plugin" value="1.3.0"/>
          <MetricMini label="Last Scan" value={site.last_scan ? site.last_scan.split(' ').slice(0,3).join(' ') : 'Not run yet'} tone={hasScan ? '' : 'warn'}/>
        </div>
        <button className="btn btn-primary"
                style={{ width:'100%', marginTop:12, background:'var(--orange)', borderColor:'var(--orange)', color:'#1a0d00', fontWeight:600 }}
                onClick={() => window.wpsbToast(`Running full site scan for ${site.name}…`, 'ok')}>
          🔍 Run Full Site Scan
        </button>
      </div>

      {/* Monthly report */}
      <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8, padding:16, display:'grid', gridTemplateColumns:'auto 1fr auto', gap:14, alignItems:'center' }}>
        <div style={{ width:36, height:36, borderRadius:6, background:'var(--green-dim)', border:'1px solid var(--green-dim)', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <Icon name="chart" size={16}/>
        </div>
        <div>
          <div style={{ fontSize:'.88rem', fontWeight:600 }}>Monthly Report</div>
          <div style={{ fontSize:'.74rem', color:'var(--dim)' }}>Full site health, SEO, security &amp; performance</div>
        </div>
        {hasScan ? (
          <button className="btn btn-primary btn-sm"
                  onClick={() => window.wpsbDownload(`${site.name.replace(/\s+/g,'-').toLowerCase()}-report-apr-2026.pdf`, '# Monthly report\n', 'application/pdf')}>
            <Icon name="download" size={11}/>Download PDF
          </button>
        ) : (
          <button className="btn btn-ghost btn-sm" style={{ color:'var(--warn)', borderColor:'var(--warn-dim)' }}
                  onClick={() => window.wpsbToast('Running scan first…', 'info')}>
            → Run Scan First
          </button>
        )}
      </div>

      {/* Form analytics */}
      <div className="card">
        <div className="card-head">
          <h2 className="card-title" style={{ display:'flex', alignItems:'center', gap:6 }}>
            <Icon name="content" size={13}/>Form Analytics
          </h2>
          <span style={{ fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>Submission counts — no PII collected</span>
        </div>
        <div className="card-body" style={{ padding:0 }}>
          {site.forms.length === 0 ? (
            <div style={{ padding:'20px 16px', color:'var(--dim)', textAlign:'center' }}>No forms detected.</div>
          ) : (
            <table className="table">
              <thead>
                <tr>
                  <th>Form</th>
                  <th>Source</th>
                  <th style={{ textAlign:'right' }}>Submissions (30d)</th>
                  <th style={{ textAlign:'right' }}></th>
                </tr>
              </thead>
              <tbody>
                {site.forms.map(f => (
                  <tr key={f.n}>
                    <td style={{ fontWeight:500 }}>{f.n}</td>
                    <td>
                      <span style={{ fontSize:'.7rem', padding:'2px 7px', borderRadius:10, background:'var(--beam-dim)', color:'var(--beam)', border:'1px solid var(--beam-dim)', fontFamily:'var(--font-mono)' }}>
                        {f.src}
                      </span>
                    </td>
                    <td className="mono" style={{ textAlign:'right', color: f.submissions > 0 ? 'var(--green)' : 'var(--dim)' }}>{f.submissions}</td>
                    <td style={{ textAlign:'right' }}>
                      <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Entries for ${f.n}`, 'info')}>View Entries →</button>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          )}
        </div>
      </div>

      {/* Email deliverability */}
      <div className="card">
        <div className="card-head">
          <h2 className="card-title" style={{ display:'flex', alignItems:'center', gap:6 }}>
            <Icon name="content" size={13}/>Email Deliverability
          </h2>
          {site.email_smtp ? (
            <span style={{ fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>
              <span style={{ color:'var(--green)' }}>●</span> {site.email_smtp.plugin} v{site.email_smtp.version} detected · mailer: {site.email_smtp.mailer}
            </span>
          ) : (
            <span style={{ fontSize:'.66rem', color:'var(--warn)', fontFamily:'var(--font-mono)' }}>
              ⚠ No SMTP plugin detected — using PHP mail()
            </span>
          )}
        </div>
        {!site.email_smtp ? (
          <div className="card-body" style={{ fontSize:'.8rem', color:'var(--dim)', lineHeight:1.6 }}>
            <p style={{ margin:'0 0 8px' }}>PHP <code>mail()</code> has very poor deliverability — form notifications and password resets are likely landing in spam.</p>
            <div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>
              <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast('Install Gravity SMTP (recommended)', 'info')}>Install Gravity SMTP</button>
              <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast('Install WP Mail SMTP', 'info')}>Install WP Mail SMTP</button>
            </div>
          </div>
        ) : (
          <>
            <div className="card-body" style={{ paddingBottom:8 }}>
              <div className="grid grid-4" style={{ gap:10, marginBottom:12 }}>
                <MetricMini label="Sent (30d)"      value={site.email_smtp.sent_30d.toLocaleString()}/>
                <MetricMini label="Delivered"       value={site.email_smtp.delivered_30d.toLocaleString()} tone={site.email_smtp.delivered_30d/site.email_smtp.sent_30d > .98 ? 'ok' : 'warn'}/>
                <MetricMini label="Bounced"         value={site.email_smtp.bounced_30d} tone={site.email_smtp.bounced_30d > 5 ? 'warn' : ''}/>
                <MetricMini label="Failed / Queue"  value={`${site.email_smtp.failed_30d} / ${site.email_smtp.queue}`} tone={site.email_smtp.failed_30d > 0 ? 'warn' : ''}/>
              </div>
              {/* DNS auth row */}
              <div style={{ display:'grid', gridTemplateColumns:'repeat(3, 1fr)', gap:10, padding:'10px 12px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6, fontSize:'.74rem' }}>
                {['spf','dkim','dmarc'].map(k => {
                  const v = site.email_smtp.dns[k];
                  const good = v.startsWith('pass');
                  return (
                    <div key={k} style={{ display:'flex', alignItems:'center', gap:8 }}>
                      <span style={{ width:18, height:18, borderRadius:9, display:'flex', alignItems:'center', justifyContent:'center', background: good ? 'var(--green-dim)' : 'var(--warn-dim)', color: good ? 'var(--green)' : 'var(--warn)', fontWeight:700, fontSize:'.7rem' }}>{good ? '✓' : '!'}</span>
                      <div>
                        <div style={{ fontFamily:'var(--font-mono)', fontSize:'.64rem', color:'var(--dim)', textTransform:'uppercase', letterSpacing:'.12em' }}>{k}</div>
                        <div style={{ fontFamily:'var(--font-mono)' }}>{v}</div>
                      </div>
                    </div>
                  );
                })}
              </div>
            </div>
            <div className="card-body" style={{ padding:0, borderTop:'1px solid var(--border)' }}>
              <table className="table">
                <thead>
                  <tr>
                    <th>Recent email</th>
                    <th>Status</th>
                    <th style={{ textAlign:'right' }}>When</th>
                  </tr>
                </thead>
                <tbody>
                  {site.email_smtp.recent.map((r,i) => (
                    <tr key={i}>
                      <td style={{ fontSize:'.78rem' }}>{r.t}{r.reason && <span style={{ color:'var(--warn)', fontSize:'.7rem', marginLeft:8 }}>· {r.reason}</span>}</td>
                      <td>
                        <span style={{ fontSize:'.68rem', padding:'2px 7px', borderRadius:10, border:'1px solid', background: r.status==='delivered' ? 'var(--green-dim)' : r.status==='bounced' ? 'var(--warn-dim)' : 'rgba(245,95,95,.12)', color: r.status==='delivered' ? 'var(--green)' : r.status==='bounced' ? 'var(--warn)' : 'var(--bad)', borderColor: r.status==='delivered' ? 'var(--green-dim)' : r.status==='bounced' ? 'var(--warn-dim)' : 'rgba(245,95,95,.25)', fontFamily:'var(--font-mono)', letterSpacing:'.05em', textTransform:'uppercase' }}>
                          {r.status}
                        </span>
                      </td>
                      <td className="mono" style={{ textAlign:'right', color:'var(--dim)' }}>{r.ago}</td>
                    </tr>
                  ))}
                </tbody>
              </table>
            </div>
            <div className="card-body" style={{ borderTop:'1px solid var(--border)', display:'flex', gap:8, flexWrap:'wrap', alignItems:'center' }}>
              <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast('Sending test email via '+site.email_smtp.plugin, 'info')}>Send test email</button>
              <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast('Opening '+site.email_smtp.plugin+' log', 'info')}>Open {site.email_smtp.plugin} log ↗</button>
              <span style={{ fontSize:'.68rem', color:'var(--dim)', marginLeft:'auto', fontFamily:'var(--font-mono)' }}>
                Pulled via {site.email_smtp.plugin} hooks (<code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>gform_smtp_*</code> / <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>wp_mail_smtp_*</code>) + DNS lookup
              </span>
            </div>
          </>
        )}
      </div>

      {/* Traffic analytics */}
      <div className="card">
        <div className="card-head">
          <h2 className="card-title" style={{ display:'flex', alignItems:'center', gap:6 }}>
            <Icon name="chart" size={13}/>Traffic Analytics
          </h2>
          {a ? (
            <span style={{ fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>
              <span style={{ color:'var(--green)' }}>●</span> Source: {a.source} · native OAuth (no analytics plugin required)
            </span>
          ) : (
            <span style={{ fontSize:'.66rem', color:'var(--warn)', fontFamily:'var(--font-mono)' }}>Not connected</span>
          )}
        </div>
        <div className="card-body">
          {!a ? (
            <div style={{ padding:'14px 0', color:'var(--dim)', fontSize:'.82rem', textAlign:'center' }}>
              <p style={{ margin:'0 0 10px' }}>No analytics source connected yet.</p>
              <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast('Connect Google Analytics 4 via native OAuth', 'info')}>Connect GA4</button>
            </div>
          ) : (
            <>
              <div className="grid grid-4" style={{ gap:10 }}>
                <MetricMini label="Sessions (30d)" value={a.sessions.toLocaleString()}/>
                <MetricMini label="Pageviews" value={a.pageviews.toLocaleString()}/>
                <MetricMini label="Unique visitors" value={a.visitors.toLocaleString()}/>
                <MetricMini label="Bounce rate" value={a.bounce + '%'} tone={a.bounce > 50 ? 'warn' : 'ok'}/>
                <MetricMini label="Avg session" value={a.avg_dur}/>
              </div>
              {/* Paid Traffic split */}
              {a.paid && (
                <div style={{ marginTop:14 }}>
                  <div style={{ display:'flex', alignItems:'center', gap:8, marginBottom:8 }}>
                    <span style={{ fontSize:'.66rem', color:'var(--warn)', fontFamily:'var(--font-mono)', textTransform:'uppercase', letterSpacing:'.14em' }}>Paid Traffic · 30d</span>
                    <span style={{ fontSize:'.64rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>Source: {a.paid.source}</span>
                    <span style={{ marginLeft:'auto', fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>
                      {((a.paid.sessions / a.sessions) * 100).toFixed(1)}% of all sessions
                    </span>
                  </div>
                  <div className="grid grid-4" style={{ gap:10 }}>
                    <MetricMini label="Paid sessions"  value={a.paid.sessions.toLocaleString()} tone="warn"/>
                    <MetricMini label="Ad spend"       value={'$' + a.paid.spend.toLocaleString()}/>
                    <MetricMini label="Conversions"    value={a.paid.conversions} tone="ok"/>
                    <MetricMini label="CAC (rough)"   value={'$' + (a.paid.spend / Math.max(1, a.paid.conversions)).toFixed(0)} tone={a.paid.spend / Math.max(1, a.paid.conversions) > 75 ? 'warn' : 'ok'}/>
                  </div>
                  <div style={{ marginTop:8, fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)', lineHeight:1.5 }}>
                    ↳ Paid sessions from GA4 <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>sessionDefaultChannelGroup = 'Paid Search' / 'Paid Social'</code> ·
                    Spend + conversions pulled from <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast('Opening Marketing → GHL Ad Manager', 'info');}} style={{ color:'var(--beam)' }}>Marketing → GHL Ad Manager ↗</a>.
                    CAC = spend / conversions (not ROAS — needs order value from Woo/Stripe).
                  </div>
                </div>
              )}
            </>
          )}
        </div>

        {/* Data source + GSC connector */}
        {a && (
          <div className="card-body" style={{ borderTop:'1px solid var(--border)', display:'grid', gap:12 }}>
            <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:10 }}>
              {/* GA4 row */}
              <div style={{ display:'flex', alignItems:'center', gap:10, padding:'10px 12px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6 }}>
                <div style={{ width:28, height:28, borderRadius:6, background:'var(--green-dim)', border:'1px solid var(--green-dim)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--green)', fontWeight:700, fontSize:'.82rem' }}>✓</div>
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ fontSize:'.78rem', fontWeight:600 }}>Google Analytics 4 · connected</div>
                  <div style={{ fontSize:'.68rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>OAuth 2.0 · property G-WPSB{site.url.replace(/\W/g,'').slice(0,6).toUpperCase()} · GA Data API v1</div>
                </div>
                <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast('Reconfigure GA4 connection', 'info')}>Manage</button>
              </div>
              {/* GSC row */}
              <div style={{ display:'flex', alignItems:'center', gap:10, padding:'10px 12px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6 }}>
                <div style={{ width:28, height:28, borderRadius:6, background:'var(--warn-dim)', border:'1px solid var(--warn-dim)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--warn)', fontWeight:700, fontSize:'.82rem' }}>!</div>
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ fontSize:'.78rem', fontWeight:600 }}>Google Search Console · not connected</div>
                  <div style={{ fontSize:'.68rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>Needed for impressions, CTR, ranking keywords — feeds Content SEO</div>
                </div>
                <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast('Connecting Search Console via OAuth', 'info')}>Connect GSC</button>
              </div>
            </div>
            <div style={{ fontSize:'.68rem', color:'var(--dim)', fontFamily:'var(--font-mono)', lineHeight:1.55 }}>
              ↳ <strong style={{ color:'var(--text-2)' }}>Native OAuth integrations</strong> — no <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>MonsterInsights</code>/<code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>ExactMetrics</code>/<code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>Site Kit</code> required. GA4 via the Google Analytics Data API, GSC via the Search Console API. Tokens are stored encrypted on our Railway backend and refreshed automatically. If a GA plugin is installed we'll detect it and offer a one-click migration.
            </div>
          </div>
        )}
      </div>

      {/* Tracking Pixels & Marketing Plugins */}
      <div className="card">
        <div className="card-head">
          <h2 className="card-title" style={{ display:'flex', alignItems:'center', gap:6 }}>
            <Icon name="spark" size={13}/>Tracking Pixels &amp; Marketing Plugins
          </h2>
          {site.tracking ? (
            <span style={{ fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)' }}>
              <span style={{ color:'var(--green)' }}>●</span> {site.tracking.pixels.filter(p=>p.status==='firing').length} firing · {site.tracking.pixels.filter(p=>p.status==='stale').length} stale · {site.tracking.pixels.filter(p=>p.status==='missing').length} not installed
            </span>
          ) : (
            <span style={{ fontSize:'.66rem', color:'var(--warn)', fontFamily:'var(--font-mono)' }}>Scan site to detect pixels</span>
          )}
        </div>
        {!site.tracking ? (
          <div className="card-body" style={{ color:'var(--dim)', fontSize:'.82rem', padding:'14px 16px', textAlign:'center' }}>
            Run a scan to detect tracking pixels and marketing plugins on this site.
          </div>
        ) : (
          <>
            <div className="card-body" style={{ padding:0 }}>
              <table className="table">
                <thead>
                  <tr>
                    <th>Pixel / Tag</th>
                    <th>Status</th>
                    <th>ID</th>
                    <th>Loaded via</th>
                    <th style={{ textAlign:'right' }}></th>
                  </tr>
                </thead>
                <tbody>
                  {site.tracking.pixels.map(p => {
                    const dot = p.status==='firing' ? 'var(--green)' : p.status==='stale' ? 'var(--warn)' : 'var(--dim)';
                    return (
                      <tr key={p.id}>
                        <td style={{ fontWeight:500 }}>{p.name}{p.note && <span style={{ color:'var(--warn)', fontSize:'.7rem', marginLeft:8, fontWeight:400 }}>· {p.note}</span>}</td>
                        <td>
                          <span style={{ display:'inline-flex', alignItems:'center', gap:6, fontSize:'.7rem', padding:'2px 8px', borderRadius:10, background: p.status==='firing' ? 'var(--green-dim)' : p.status==='stale' ? 'var(--warn-dim)' : 'var(--surface-3)', color: dot, border:`1px solid ${p.status==='firing' ? 'var(--green-dim)' : p.status==='stale' ? 'var(--warn-dim)' : 'var(--border)'}`, fontFamily:'var(--font-mono)', letterSpacing:'.06em', textTransform:'uppercase' }}>
                            <span style={{ width:5, height:5, borderRadius:'50%', background:dot }}/>{p.status}
                          </span>
                        </td>
                        <td className="mono" style={{ fontSize:'.74rem', color: p.value==='—' ? 'var(--dim)' : 'var(--text-2)' }}>{p.value}</td>
                        <td className="mono" style={{ fontSize:'.74rem', color:'var(--dim)' }}>{p.loc}</td>
                        <td style={{ textAlign:'right' }}>
                          {p.status !== 'missing' ? (
                            <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Opening ${p.name} dashboard`, 'info')}>Open ↗</button>
                          ) : (
                            <button className="btn btn-ghost btn-sm" style={{ color:'var(--beam)' }} onClick={() => window.wpsbToast(`Install guide for ${p.name}`, 'info')}>Install</button>
                          )}
                        </td>
                      </tr>
                    );
                  })}
                </tbody>
              </table>
            </div>

            {/* Marketing plugins detected */}
            {site.tracking.plugins.length > 0 && (
              <div className="card-body" style={{ borderTop:'1px solid var(--border)' }}>
                <div style={{ fontSize:'.66rem', color:'var(--dim)', textTransform:'uppercase', letterSpacing:'.14em', fontFamily:'var(--font-mono)', marginBottom:8 }}>Marketing plugins detected on this site</div>
                <div style={{ display:'grid', gap:8 }}>
                  {site.tracking.plugins.map(pl => (
                    <div key={pl.name} style={{ display:'grid', gridTemplateColumns:'1fr auto', alignItems:'center', gap:10, padding:'8px 12px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6 }}>
                      <div>
                        <div style={{ fontSize:'.82rem', fontWeight:600 }}>{pl.name} <span style={{ fontSize:'.7rem', color:'var(--dim)', fontFamily:'var(--font-mono)', marginLeft:6, fontWeight:400 }}>v{pl.version}</span></div>
                        <div style={{ fontSize:'.7rem', color:'var(--dim)' }}>{pl.role}</div>
                      </div>
                      <button className="btn btn-ghost btn-sm" onClick={() => window.wpsbToast(`Opening ${pl.name} settings`, 'info')}>Open ↗</button>
                    </div>
                  ))}
                </div>
              </div>
            )}

            <div className="card-body" style={{ borderTop:'1px solid var(--border)', display:'flex', flexWrap:'wrap', gap:8, alignItems:'center' }}>
              <button className="btn btn-primary btn-sm" onClick={() => window.wpsbToast('Re-scanning pixels…', 'info')}>↻ Re-scan pixels</button>
              <a href="#" onClick={e=>{e.preventDefault(); window.wpsbToast('Opening Marketing → Pixels &amp; Tags', 'info');}} className="btn btn-ghost btn-sm">Manage in Marketing ↗</a>
              <span style={{ fontSize:'.66rem', color:'var(--dim)', fontFamily:'var(--font-mono)', marginLeft:'auto', lineHeight:1.5 }}>
                Detected via headless render (fires network requests, watches <code style={{ background:'var(--surface-3)', padding:'1px 4px', borderRadius:2 }}>gtag/fbq/lintrk/ttq/_linkedin_data_partner_ids</code>) + plugin scan.
              </span>
            </div>
          </>
        )}
      </div>
    </div>
  );
}

/* ── Shared bits ───────────────────────────────────────────── */
function InfoBlock({ title, icon, tone, rows, footer }) {
  const toneColor = { beam:'var(--beam)', warn:'var(--warn)', ok:'var(--green)', '':'var(--text-2)' }[tone || ''] || 'var(--text-2)';
  return (
    <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:8 }}>
      <div style={{ padding:'10px 16px', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', gap:8 }}>
        <Icon name={icon} size={12}/>
        <span style={{ fontFamily:'var(--font-mono)', fontSize:'.68rem', color:toneColor, letterSpacing:'.14em', textTransform:'uppercase' }}>{title}</span>
      </div>
      <div>
        {rows.map(([k, v, isMono, rowTone], i) => (
          <div key={k} style={{ display:'grid', gridTemplateColumns:'180px 1fr', padding:'9px 16px', borderBottom: i < rows.length - 1 ? '1px solid var(--border)' : 'none', fontSize:'.82rem' }}>
            <div style={{ color:'var(--dim)' }}>{k}</div>
            <div style={{ fontFamily: isMono ? 'var(--font-mono)' : 'inherit', color: rowTone === 'warn' ? 'var(--warn)' : rowTone === 'ok' ? 'var(--green)' : 'var(--text)', fontWeight: 500 }}>{v}</div>
          </div>
        ))}
        {footer && <div style={{ padding:'0 16px 12px' }}>{footer}</div>}
      </div>
    </div>
  );
}

function MetricMini({ label, value, tone }) {
  return (
    <div style={{ background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:6, padding:'10px 12px' }}>
      <div style={{ fontSize:'.64rem', color:'var(--dim)', textTransform:'uppercase', letterSpacing:'.12em', fontFamily:'var(--font-mono)', marginBottom:4 }}>{label}</div>
      <div style={{ fontSize:'1rem', fontWeight:600, color: tone === 'warn' ? 'var(--warn)' : tone === 'ok' ? 'var(--green)' : 'var(--text)' }}>{value}</div>
    </div>
  );
}

window.WPHealth = WPHealth;
