(() => {
  'use strict';

  const VERSION = '8.7.0';
  const VISIT_COOLDOWN_MS = 60_000;
  const PROFILE_KEY = 'sa_capability_profile_v1';
  const WORKSPACE_ORDER = ['relationships','positioning','participation','attention','intelligence'];

  const WORKSPACES = {
    home: {label:'Home Dashboard', page:'index.html'},
    relationships: {label:'Market Relationships', page:'market-relationships.html'},
    positioning: {label:'Positioning Intelligence', page:'positioning.html'},
    participation: {label:'Institutional Participation', page:'institutional-participation.html'},
    attention: {label:'Market Attention', page:'market-attention.html'},
    intelligence: {label:'Intelligence', page:'intelligence.html'},
    lab: {label:'Intelligence Lab', page:'intelligence-lab.html'}
  };

  const path = (location.pathname.split('/').pop() || 'index.html').toLowerCase();
  const currentKey = path === 'index.html' || path === '' ? 'home'
    : path.includes('market-relationships') ? 'relationships'
    : path.includes('positioning') ? 'positioning'
    : path.includes('institutional-participation') ? 'participation'
    : path.includes('market-attention') ? 'attention'
    : path.includes('intelligence-lab') ? 'lab'
    : path.includes('intelligence') ? 'intelligence'
    : 'home';

  const esc = value => String(value ?? '').replace(/[&<>"']/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[c]));
  const now = () => new Date().toISOString();
  const text = id => String(document.getElementById(id)?.textContent || '').trim();
  const value = id => String(document.getElementById(id)?.value || '').trim();
  const safeJson = (raw, fallback={}) => { try { return JSON.parse(raw); } catch (_) { return fallback; } };

  function profile() {
    const saved = safeJson(localStorage.getItem(PROFILE_KEY), {});
    return {
      platform: saved.platform || 'RETAIL',
      research_path: saved.research_path || 'FOUNDATIONS',
      service_package: saved.service_package || 'CURRENT',
      capability_profile: saved.capability_profile || 'STANDARD'
    };
  }

  function evidenceSelectors(key) {
    const maps = {
      relationships: ['relationshipStatus','relationshipPhase','relationshipStrength','relationshipBias','relationshipInterpretation','relationshipSignal','rvipState','arbeState'],
      positioning: ['positioningState','positioningBias','positioningConfidence','positioningLifecycle','sapeState','pcrState','positioningSummary'],
      participation: ['omsScore','omsConfidence','omsStage','oppSymbol','ipeQuoteSymbol','participationState','participationConfidence'],
      attention: ['marketAttentionState','marketAttentionBias','marketAttentionRisk','marketAttentionScore','attentionRank','marketAttentionSummary'],
      intelligence: ['marketState','riskState','biasState','dimseState','saeoState','energyState','flowState','structureState'],
      lab: ['dimseState','saeoState','energyState','flowState','structureState','propagationState']
    };
    return maps[key] || [];
  }

  function captureEvidence() {
    const campaign = window.SA_CAMPAIGNS?.active?.();
    if (!campaign || currentKey === 'home') return null;
    const fields = {};
    evidenceSelectors(currentKey).forEach(id => {
      const item = document.getElementById(id);
      if (!item) return;
      const captured = 'value' in item ? String(item.value || '').trim() : String(item.textContent || '').trim();
      if (captured && captured !== '--' && captured.length < 800) fields[id] = captured;
    });
    const symbol = value('oppSymbol') || value('ipeQuoteSymbol') || value('relationshipSymbol') || value('positioningSymbol') || value('marketAttentionSymbol') || value('symbolInput') || campaign.symbol;
    return {
      workspace: currentKey,
      workspace_label: WORKSPACES[currentKey]?.label || currentKey,
      symbol: String(symbol || campaign.symbol || '').toUpperCase(),
      captured_at: now(),
      fields,
      page: path,
      profile: profile()
    };
  }

  function evidenceComplete(campaign, key) {
    return Boolean(campaign?.workspace_evidence?.[key]?.captured_at);
  }

  function nextWorkspace(campaign) {
    if (!campaign) return WORKSPACES.participation;
    const firstMissing = WORKSPACE_ORDER.find(key => !evidenceComplete(campaign, key));
    if (firstMissing) return WORKSPACES[firstMissing];
    if (campaign.status === 'COMPLETED') return WORKSPACES.attention;
    if (campaign.status === 'MONITORING') return WORKSPACES.intelligence;
    return WORKSPACES.participation;
  }

  function destination(campaign, workspace) {
    if (!workspace) workspace = nextWorkspace(campaign);
    if (!campaign) return workspace.page;
    return window.SA_CAMPAIGNS?.workspaceUrl?.(workspace.page, campaign) || `${workspace.page}?campaign=${encodeURIComponent(campaign.campaign_id)}&symbol=${encodeURIComponent(campaign.symbol)}`;
  }

  function ensureBanner() {
    if (document.getElementById('saCampaignContextBanner') || currentKey === 'home') return;
    const anchor = document.querySelector('.sa-price-preference, .sa-platform-status, .top-bar, header');
    if (!anchor) return;
    anchor.insertAdjacentHTML('afterend', '<section id="saCampaignContextBanner" class="sa-campaign-context-banner" aria-live="polite"></section>');
  }

  function ensureHomePanel() {
    if (currentKey !== 'home' || document.getElementById('saHomeCampaignPanel')) return;
    const target = document.querySelector('#homeTab .sa35-briefing-grid, #homeTab .sa35-welcome-panel, #homeTab');
    if (!target) return;
    target.insertAdjacentHTML(target.classList.contains('sa35-welcome-panel') ? 'afterend' : 'beforebegin', '<section id="saHomeCampaignPanel" class="sa-home-campaign-panel panel" aria-live="polite"></section>');
  }

  function contextHelp() {
    return `<span class="sa-context-help sa-campaign-context-help" tabindex="0" aria-label="Campaign context help">?<span class="sa-context-help-popover"><b>What is it?</b> Your active research campaign across Signal Architect.<b>Why use it?</b> Keep the same symbol, stage, evidence, and next investigation synchronized between workspaces.<b>When use it?</b> Whenever you continue, review, document, or monitor an investigation.</span></span>`;
  }

  function renderBanner(campaign) {
    ensureBanner();
    const node = document.getElementById('saCampaignContextBanner');
    if (!node) return;
    if (!campaign) {
      node.innerHTML = `<div><span>CAMPAIGN CONTEXT ${contextHelp()}</span><strong>NO ACTIVE CAMPAIGN</strong><small>Save an institutional investigation to create continuity across research workspaces.</small></div><button type="button" data-sa-open-campaigns>OPEN CAMPAIGNS</button>`;
      bind(node);
      return;
    }
    const next = nextWorkspace(campaign);
    node.innerHTML = `<div class="sa-campaign-context-identity"><span>ACTIVE CAMPAIGN ${contextHelp()}</span><strong>${esc(campaign.symbol)} · ${esc(String(campaign.research_direction || 'neutral').toUpperCase())}</strong><small>${esc(campaign.status)} · ${esc(campaign.research_stage)} · OMS ${Number(campaign.oms_score || 0).toFixed(1)} · ${Number(campaign.confidence || 0).toFixed(1)}% confidence</small></div><div class="sa-campaign-context-progress"><span>CURRENT WORKSPACE</span><strong>${esc(WORKSPACES[currentKey]?.label || currentKey)}</strong><small>Next suggested investigation: ${esc(next.label)}</small></div><nav><a href="${esc(destination(campaign,next))}">CONTINUE INVESTIGATION</a><button type="button" data-sa-capture-evidence>CAPTURE EVIDENCE</button><button type="button" data-sa-open-campaigns>CAMPAIGNS</button></nav>`;
    bind(node);
  }

  function renderHome(campaign) {
    ensureHomePanel();
    const node = document.getElementById('saHomeCampaignPanel');
    if (!node) return;
    if (!campaign) {
      node.innerHTML = `<header><div><span>CAMPAIGN STATUS ${contextHelp()}</span><h2>No active campaign</h2></div><b>READY TO BEGIN</b></header><p>Complete or save an institutional investigation to create a campaign that can continue across Signal Architect.</p><div class="sa-home-campaign-actions"><a href="institutional-participation.html">OPEN INSTITUTIONAL PARTICIPATION</a><button type="button" data-sa-open-campaigns>VIEW CAMPAIGNS</button></div>`;
      bind(node);
      return;
    }
    const next = nextWorkspace(campaign);
    const complete = WORKSPACE_ORDER.filter(key => evidenceComplete(campaign,key)).length;
    node.innerHTML = `<header><div><span>ACTIVE CAMPAIGN ${contextHelp()}</span><h2>${esc(campaign.symbol)} · ${esc(String(campaign.research_direction || 'neutral').toUpperCase())}</h2></div><b>${esc(campaign.status)}</b></header><div class="sa-home-campaign-metrics"><div><span>RESEARCH STAGE</span><strong>${esc(campaign.research_stage)}</strong></div><div><span>OMS</span><strong>${Number(campaign.oms_score || 0).toFixed(1)}</strong></div><div><span>CONFIDENCE</span><strong>${Number(campaign.confidence || 0).toFixed(1)}%</strong></div><div><span>EVIDENCE COVERAGE</span><strong>${complete}/${WORKSPACE_ORDER.length}</strong></div></div><p>Next suggested investigation: <strong>${esc(next.label)}</strong>. The suggestion is informational; the campaign remains available across every enabled workspace.</p><div class="sa-home-campaign-actions"><a href="${esc(destination(campaign,next))}">CONTINUE INVESTIGATION</a><button type="button" data-sa-open-campaigns>OPEN CAMPAIGN MANAGER</button><button type="button" data-sa-open-pipeline>OPEN PIPELINE</button></div>`;
    bind(node);
  }

  function bind(root) {
    root.querySelectorAll('[data-sa-open-campaigns]').forEach(button => button.addEventListener('click', () => document.getElementById('saCampaignLauncher')?.click()));
    root.querySelectorAll('[data-sa-open-pipeline]').forEach(button => button.addEventListener('click', () => window.SA_CAMPAIGN_PIPELINE?.open?.()));
    root.querySelectorAll('[data-sa-capture-evidence]').forEach(button => button.addEventListener('click', () => {
      const snapshot = captureEvidence();
      if (!snapshot) return;
      window.SA_CAMPAIGNS?.contributeEvidence?.(snapshot.workspace, snapshot);
      button.textContent = 'EVIDENCE CAPTURED';
      setTimeout(() => button.textContent = 'CAPTURE EVIDENCE', 1800);
    }));
  }

  function autoContribute() {
    const campaign = window.SA_CAMPAIGNS?.active?.();
    if (!campaign || currentKey === 'home') return;
    const last = campaign.workspace_evidence?.[currentKey]?.captured_at;
    if (last && Date.now() - new Date(last).getTime() < VISIT_COOLDOWN_MS) return;
    const snapshot = captureEvidence();
    if (!snapshot) return;
    window.SA_CAMPAIGNS?.contributeEvidence?.(currentKey, snapshot, {silent:true, visit:true});
  }

  function render() {
    const campaign = window.SA_CAMPAIGNS?.active?.() || null;
    renderHome(campaign);
    renderBanner(campaign);
  }

  function init() {
    render();
    setTimeout(autoContribute, 1600);
    window.addEventListener('sa:campaign-change', render);
    window.addEventListener('sa:campaign-store-change', render);
  }

  window.SA_CAMPAIGN_CONTEXT = Object.freeze({version:VERSION,currentWorkspace:currentKey,captureEvidence,nextWorkspace,render,profile});
  document.addEventListener('DOMContentLoaded', init);
})();
