// OrgLens — main App (state, routing, tweaks integration)

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "scoreVisualization": "ring",
  "compactDensity": false,
  "showReleaseGuardBanner": true,
  "headlineAI": true
}/*EDITMODE-END*/;

function App() {
  const [t, setTweak] = (window.useTweaks || (() => [TWEAK_DEFAULTS, () => {}]))(TWEAK_DEFAULTS);

  // Routing
  const [screen, setScreen] = React.useState('dashboard');
  // Active org
  const [activeOrgId, setActiveOrgId] = React.useState('nw-prod');
  // Findings state (mutable: status can be open/resolved/ignored)
  const [findings, setFindings] = React.useState(window.FINDINGS);
  // Selected finding for drawer
  const [openFinding, setOpenFinding] = React.useState(null);
  // AI Copilot panel
  const [copilotOpen, setCopilotOpen] = React.useState(false);
  const [copilotInitialPrompt, setCopilotInitialPrompt] = React.useState(null);
  // Toast
  const [toast, setToast] = React.useState(null);

  const openCopilotWith = (prompt) => {
    setCopilotInitialPrompt(prompt || null);
    setCopilotOpen(true);
  };

  const showToast = React.useCallback((msg, variant = 'success') => {
    setToast({ msg, variant, id: Date.now() });
  }, []);

  React.useEffect(() => {
    if (!toast) return;
    const id = setTimeout(() => setToast(null), 3200);
    return () => clearTimeout(id);
  }, [toast]);

  // Org list with score derived from current findings count for active org (drama!)
  const orgs = window.ORG_PORTFOLIO;
  const activeOrg = orgs.find(o => o.id === activeOrgId) || orgs[0];

  // Compute live OrgScore based on findings status (only for active org).
  // Base = 50 (from data); each resolved P1 adds 2.5, P2 adds 1, P3 adds 0.4
  // Ignored items add 0.5 (you accepted the risk, you didn't fix it)
  const liveScore = React.useMemo(() => {
    if (!activeOrg.primary) return activeOrg.score;
    let bonus = 0;
    findings.forEach(f => {
      if (f.status === 'resolved') {
        bonus += f.priority === 'P1' ? 2.5 : f.priority === 'P2' ? 1.0 : 0.4;
      } else if (f.status === 'ignored') {
        bonus += 0.3;
      }
    });
    return Math.min(95, activeOrg.score + bonus);
  }, [findings, activeOrg]);

  // Category scores: same logic — resolving findings in a category lifts that category
  const liveCategoryScores = React.useMemo(() => {
    return window.CATEGORY_SCORES.map(cat => {
      let bonus = 0;
      findings.forEach(f => {
        if (f.category === cat.id && f.status === 'resolved') {
          bonus += f.priority === 'P1' ? 5 : f.priority === 'P2' ? 2.5 : 1;
        }
      });
      return { ...cat, score: Math.min(95, cat.score + bonus) };
    });
  }, [findings]);

  const setStatus = (id, newStatus) => {
    setFindings(prev => prev.map(f => f.id === id ? { ...f, status: newStatus } : f));
  };

  const switchOrg = (orgId) => {
    setActiveOrgId(orgId);
    setScreen('dashboard');
    const o = orgs.find(x => x.id === orgId);
    showToast(`Switched to ${o.name}. Loading latest scan…`, 'info');
  };

  const handleOpenFinding = (f) => setOpenFinding(f);
  const handleCloseFinding = () => setOpenFinding(null);

  const handleRescan = () => {
    showToast('Scan started. Estimated 2–5 minutes for Quick Scan…', 'info');
  };

  const openCount = findings.filter(f => f.status === 'open').length;

  // Pass live values into screens
  const enrichedActiveOrg = { ...activeOrg, score: Math.round(liveScore) };

  const appStyles = {
    app: {
      display: 'flex', flexDirection: 'column',
      height: '100vh', overflow: 'hidden',
      fontSize: t.compactDensity ? 12 : 14,
    },
    body: { display: 'flex', flex: 1, overflow: 'hidden' },
    main: { flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column', minWidth: 0 },
    contentWrap: { flex: 1, overflow: 'hidden', display: 'flex', minWidth: 0 },
  };

  return (
    <div style={appStyles.app}>
      <GlobalHeader/>
      <div style={appStyles.body}>
        <LeftRail activeScreen={screen} onNavigate={setScreen}/>
        <div style={appStyles.main}>
          <ContextBar
            activeScreen={screen}
            onNavigate={setScreen}
            activeOrgName={activeOrg.name}
            onOrgPick={() => setScreen('portfolio')}
            openCount={openCount}
          />
          <div style={appStyles.contentWrap}>
            {screen === 'dashboard' && (
              <Dashboard
                overallScore={liveScore}
                categories={liveCategoryScores}
                findings={findings}
                activeOrg={enrichedActiveOrg}
                onNavigate={setScreen}
                onOpenFinding={handleOpenFinding}
                onRescan={handleRescan}
                onOpenCopilot={openCopilotWith}
                showReleaseGuardBanner={t.showReleaseGuardBanner}
              />
            )}
            {screen === 'backlog' && (
              <FixBacklog
                findings={findings}
                activeOrg={enrichedActiveOrg}
                onOpenFinding={handleOpenFinding}
                onSetStatus={setStatus}
              />
            )}
            {screen === 'automap' && (
              <AutomationMap
                map={window.AUTOMATION_MAP}
                findings={findings}
                onOpenFinding={handleOpenFinding}
              />
            )}
            {screen === 'ai' && (
              <AIReadiness
                readiness={window.AI_READINESS}
                findings={findings}
                onOpenFinding={handleOpenFinding}
                onNavigate={setScreen}
              />
            )}
            {screen === 'portfolio' && (
              <OrgPortfolio
                orgs={orgs.map(o => o.id === activeOrgId ? { ...o, score: Math.round(liveScore) } : o)}
                activeOrgId={activeOrgId}
                onSwitchOrg={switchOrg}
              />
            )}
          </div>
        </div>
      </div>

      {openFinding && (
        <IssueDrawer
          finding={openFinding}
          onClose={handleCloseFinding}
          onSetStatus={setStatus}
          onShowToast={showToast}
        />
      )}

      {toast && (
        <Toast message={toast.msg} variant={toast.variant} onDismiss={() => setToast(null)}/>
      )}

      <CopilotLauncher open={copilotOpen} onClick={() => setCopilotOpen(o => !o)}/>
      <AICopilot
        open={copilotOpen}
        onClose={() => setCopilotOpen(false)}
        initialPrompt={copilotInitialPrompt}
        onConsumedInitialPrompt={() => setCopilotInitialPrompt(null)}
        activeOrg={activeOrg}
        overallScore={liveScore}
        categories={liveCategoryScores}
        findings={findings}
        onNavigate={setScreen}
      />

      <OrgLensTweaksPanel t={t} setTweak={setTweak}/>
    </div>
  );
}

// ===== Tweaks Panel =====
function OrgLensTweaksPanel({ t, setTweak }) {
  if (!window.TweaksPanel) return null;
  const { TweaksPanel, TweakSection, TweakRadio, TweakToggle } = window;
  return (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Layout">
        <TweakRadio label="Density" value={t.compactDensity ? 'compact' : 'comfortable'}
          options={[
            { value: 'comfortable', label: 'Comfortable' },
            { value: 'compact', label: 'Compact' },
          ]}
          onChange={(v) => setTweak('compactDensity', v === 'compact')}/>
      </TweakSection>
      <TweakSection label="Content">
        <TweakToggle label="ReleaseGuard cross-sell banner" value={!!t.showReleaseGuardBanner}
          onChange={(v) => setTweak('showReleaseGuardBanner', v)}/>
        <TweakToggle label="Headline AI / Agentforce angle" value={!!t.headlineAI}
          onChange={(v) => setTweak('headlineAI', v)}/>
      </TweakSection>
    </TweaksPanel>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App/>);
