// Main app — connects UI to backend API + WebSocket

const TWEAK_DEFAULS = /*EDITMODE-BEGIN*/{
  "theme": "auto",
  "aurora": "auto",
  "hour": -1
}/*EDITMODE-END*/;

const auroraFromHour = (h) => {
  if (h >= 6 && h < 12)  return 'var(--aurora-morning)';
  if (h >= 12 && h < 17) return 'var(--aurora-noon)';
  if (h >= 17 && h < 22) return 'var(--aurora-evening)';
  return 'var(--aurora-night)';
};

const App = () => {
  // ---- Auth gate ----
  // Babanın her sabah login olması gerek. Token localStorage'da bir sonraki 05:00 İstanbul'a kadar.
  // URL ?logout=1 → token + tüm boot flags temizlenir, login ekranına döner
  React.useEffect(() => {
    if (typeof window === 'undefined') return;
    const params = new URLSearchParams(window.location.search);
    if (params.has('logout') || params.has('fresh')) {
      try { localStorage.clear(); } catch {}
      // URL'i temizle
      window.history.replaceState({}, '', window.location.pathname);
      // State'i hemen sıfırla (React mount sonrası)
      setTimeout(() => window.location.reload(), 0);
    }
  }, []);

  const [authed, setAuthed] = React.useState(() => KW.isAuthed());
  const [authChecked, setAuthChecked] = React.useState(false);

  // Cmd+Shift+L (Mac) / Ctrl+Shift+L (Win/Linux) → force logout (her yerden)
  React.useEffect(() => {
    const onKey = (e) => {
      if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === 'l') {
        e.preventDefault();
        if (confirm('Çıkış yapılsın ve tüm yerel veriler temizlensin mi?')) {
          try { localStorage.clear(); } catch {}
          window.location.reload();
        }
      }
    };
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, []);

  // Schedule auto-logout at expiresAt + listen for 401 events
  React.useEffect(() => {
    if (!authed) { setAuthChecked(true); return; }
    const exp = KW.authExpiresAt();
    if (!exp) { KW.logout(); setAuthed(false); setAuthChecked(true); return; }
    const ms = exp.getTime() - Date.now();
    if (ms <= 0) { KW.logout(); setAuthed(false); setAuthChecked(true); return; }
    setAuthChecked(true);
    const timer = setTimeout(() => {
      console.log('[auth] 05:00 reached → auto logout');
      KW.logout();
      setAuthed(false);
    }, ms);
    const onExpired = () => { setAuthed(false); };
    window.addEventListener('kw:auth-expired', onExpired);
    return () => { clearTimeout(timer); window.removeEventListener('kw:auth-expired', onExpired); };
  }, [authed]);

  // ─── Dev mode tespiti (global, tüm component'ler için) ────────
  // ?dev=1 URL paramı VEYA sessionStorage flag → dev mode aktif (sadece bu tab için)
  // Tab kapanınca sıfırlanır. localStorage'a YAZILMAZ → Babam'ın normal link'i etkilenmez.
  if (typeof window.KW_STAGE === 'undefined') {
    try {
      const params = new URLSearchParams(window.location.search);
      if (params.has('dev')) sessionStorage.setItem('kw_dev_mode', '1');
      window.KW_IS_DEV = sessionStorage.getItem('kw_dev_mode') === '1';
      window.KW_STAGE = window.KW_IS_DEV ? sessionStorage : localStorage;
    } catch {
      window.KW_IS_DEV = false;
      window.KW_STAGE = localStorage;
    }
  }
  const isDev = window.KW_IS_DEV;
  const stage = window.KW_STAGE;

  // Boot stage: 'welcome' | 'tutorial' | 'cockpit'
  // Dev mode → her oturumda sıfırdan başla. Normal mod → localStorage persist.
  const [welcomeDone, setWelcomeDone] = React.useState(() => {
    try { return stage.getItem('kw_welcome_done') === 'true'; }
    catch { return false; }
  });
  const [tutorialDone, setTutorialDone] = React.useState(() => {
    try { return stage.getItem('kw_tutorial_done') === 'true'; }
    catch { return false; }
  });

  // Tutorial aktifken Cockpit hangi view'dadır (sidebar/main hedefler için view 'home' olmalı)
  const [tutorialCockpitView, setTutorialCockpitView] = React.useState('home');

  const completeWelcome = (skipped = false) => {
    try {
      stage.setItem('kw_welcome_done', 'true');
      if (skipped) {
        stage.setItem('kw_welcome_skipped_at', new Date().toISOString());
        // Skip → tutorial da skip
        stage.setItem('kw_tutorial_done', 'true');
        setTutorialDone(true);
      }
    } catch {}
    setWelcomeDone(true);
  };

  const completeTutorial = (skipped = false) => {
    try {
      stage.setItem('kw_tutorial_done', 'true');
      if (skipped) stage.setItem('kw_tutorial_skipped_at', new Date().toISOString());
    } catch {}
    setTutorialDone(true);
  };

  // Login render — auth yoksa cockpit hiç mount olmasın (KW.init çağrısı dahil)
  if (!authChecked) return null;
  if (!authed) {
    return <LoginScreen onSuccess={() => setAuthed(true)} />;
  }

  // Welcome aşaması (auth ok, henüz görmemiş)
  if (!welcomeDone && window.WelcomeScreen) {
    return <WelcomeScreen
      onContinue={() => completeWelcome(false)}
      onSkip={() => completeWelcome(true)}
      onLogout={() => { KW.logout(); setAuthed(false); }}
    />;
  }

  // Tutorial aşaması — Cockpit arka planda mock'la render edilir, üstüne overlay
  if (!tutorialDone && window.TutorialOverlay) {
    return (
      <>
        <Cockpit
          onLogout={() => { KW.logout(); setAuthed(false); }}
          forcedView={tutorialCockpitView}
          tutorialActive={true}
        />
        <TutorialOverlay
          onComplete={() => completeTutorial(false)}
          onSkip={() => completeTutorial(true)}
          onSkipAllStages={() => {
            // DEV: tutorial + onboarding hepsini geç → cockpit'e doğrudan
            try {
              stage.setItem('kw_tutorial_done', 'true');
              stage.setItem('kw_onboarding_skipped', 'true');
            } catch {}
            setTutorialDone(true);
          }}
          currentView={tutorialCockpitView}
          onSetView={setTutorialCockpitView}
        />
      </>
    );
  }

  return <Cockpit onLogout={() => { KW.logout(); setAuthed(false); }} />;
};

const Cockpit = ({ onLogout, forcedView, tutorialActive = false }) => {
  const [tweaks, setTweaks] = React.useState(TWEAK_DEFAULS);
  const [view, setView] = React.useState(forcedView || 'home');

  // Tutorial sırasında view'ı zorla sync (sidebar/main spotlight target'ları için)
  React.useEffect(() => {
    if (forcedView && forcedView !== view) setView(forcedView);
  }, [forcedView]);
  const [tasks, setTasks] = React.useState([]);
  const [conversations, setConvs] = React.useState([]);
  const [meetings, setMeetings] = React.useState([]);
  const [agents, setAgents] = React.useState(window.AGENTS);
  const [home, setHome] = React.useState(null);
  const [news, setNews] = React.useState(null);
  const [thread, setThread] = React.useState([]);
  const [activeConversationId, setActiveConversationId] = React.useState(null);
  const [activeAgent, setActiveAgent] = React.useState(null);
  const [activeMeeting, setActiveMeeting] = React.useState(null);
  const [showTweaks, setShowTweaks] = React.useState(false);
  const [showMeetingModal, setShowMeetingModal] = React.useState(false);
  const [backendOnline, setBackendOnline] = React.useState(false);
  const [busy, setBusy] = React.useState(false);
  const [onboardingDone, setOnboardingDone] = React.useState(() => {
    // DEV skip flag → onboarding'i hiç gösterme. Stage = sessionStorage (dev) | localStorage (Babam)
    try { return (window.KW_STAGE || localStorage).getItem('kw_onboarding_skipped') === 'true'; }
    catch { return true; }
  });
  const [onboardingChecked, setOnboardingChecked] = React.useState(false);

  // Files / Analytics / Team
  const [files, setFiles] = React.useState([]);
  const [activeFile, setActiveFile] = React.useState(null);
  const [charts, setCharts] = React.useState([]);
  const [insights, setInsights] = React.useState([]);
  const [agentInspector, setAgentInspector] = React.useState(null);
  const filesPollRef = React.useRef(null);

  // News v7 (3-category, AI-hooked, like-able, read-progress, threads)
  const [allNews, setAllNews] = React.useState([]);   // last 7 days × tr+us+global, flat
  const [activeNewsThread, setActiveNewsThread] = React.useState(null);

  // Sidebar unread badge
  const [unreadCount, setUnreadCount] = React.useState(0);

  // Solution Session (impossible-market-architect skill) — chat type tracking
  const [activeChatType, setActiveChatType] = React.useState('regular');

  const liveHour = new Date().getHours();
  const hour = tweaks.hour >= 0 ? tweaks.hour : liveHour;

  // Bootstrap: connect to backend, load initial data
  React.useEffect(() => {
    (async () => {
      await KW.init();
      setBackendOnline(KW.online);

      // Önce onboarding state — eksik soru varsa wizard açılır, cockpit datası beklenmesin
      let obState = { isComplete: true };
      try {
        obState = await KW.getOnboardingState();
        // DEV skip flag → backend henüz tamamlanmamış görse de override
        const skipped = (window.KW_STAGE || localStorage).getItem('kw_onboarding_skipped') === 'true';
        setOnboardingDone(skipped ? true : obState.isComplete);
      } catch (e) {
        console.warn('[onboarding] state fetch fail:', e);
      } finally {
        setOnboardingChecked(true);
      }

      const [a, c, t, m, h, n, fs, ch, ins, nw, uc] = await Promise.all([
        KW.listAgents(),
        KW.listConversations(),
        KW.listTasks(true),    // include done
        KW.listMeetings(),
        KW.getHome(),
        KW.getNews(),
        KW.listFiles(),
        KW.getCharts(),
        KW.getInsights(),
        KW.getNewsLastWeek(7),
        KW.getUnreadCount(),
      ]);
      setAgents(a);
      setConvs(c);   // boş array da geçerli (mock fallback yok)
      setTasks(t);
      setMeetings(m);
      setHome(h);
      setNews(n);
      setFiles(fs);
      setCharts(ch?.charts || []);
      setInsights(ins);
      // News v7 enrich — backend response'una source_trust, threadId, isRead alanları eklenir
      // (yeni NewsScreen v7 bu alanlara ihtiyaç duyuyor; aksi halde "siyah ekran" hatası)
      const enriched = (window.NEWS_V7 && typeof window.NEWS_V7.enrichNews === 'function')
        ? window.NEWS_V7.enrichNews(nw || [])
        : (nw || []);
      setAllNews(enriched);
      setUnreadCount(uc || 0);

      if (KW.online) {
        await KW.connectSocket({
          'triage:start': () => {
            setThread(prev => upsertTriage(prev, 'Chief of Staff düşünüyor…'));
          },
          'triage:done': (info) => {
            const ags = (info.agents || []).join(', ');
            const text = info.mode === 'direct'
              ? 'Cevap hazırlanıyor…'
              : `${ags ? '@' + info.agents.join(', @') + ' çağırıldı' : 'Ekip toplanıyor'} — sentez yapılıyor…`;
            setThread(prev => upsertTriage(prev, text));
          },
          'chat:reply': (payload) => {
            setThread(prev => {
              const cleaned = prev.filter(m => m.role !== 'triage');
              return [...cleaned, {
                role: 'agent',
                agent: payload.from,
                name: agentNameLookup(payload.from),
                text: payload.reply,
                meetingId: payload.meetingId,
                suggestions: payload.suggestions || [],
              }];
            });
            setBusy(false);
            KW.listMeetings().then(setMeetings);
            KW.listConversations().then(setConvs);
            // Auto-extract'ten yeni task'lar gelmiş olabilir
            KW.listTasks(true).then(setTasks);
            // Aktif sohbet okunuyor → mark read
            if (payload.conversationId) {
              KW.markConversationRead(payload.conversationId).then(({ totalUnread }) => {
                setUnreadCount(totalUnread || 0);
              });
            } else {
              KW.getUnreadCount().then(setUnreadCount);
            }
          },
          'chat:user-saved': (info) => {
            if (info.conversationId) {
              setActiveConversationId(info.conversationId);
              // Refresh sidebar immediately so the new chat appears as it's saved
              KW.listConversations().then(setConvs);
            }
          },
          'chat:error': (e) => {
            setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
              role: 'agent', agent: 'cos', name: 'Sistem',
              text: '⚠️ ' + (e.error || 'Bir aksaklık oldu, ekiple iletişimi yenileyeyim mi?')
            }]);
            setBusy(false);
          },
        });
      }
    })();
  }, []);

  // Theme
  React.useEffect(() => {
    const apply = () => {
      let theme = tweaks.theme;
      if (theme === 'auto') {
        theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
      }
      document.documentElement.setAttribute('data-theme', theme);
    };
    apply();
    const mq = window.matchMedia('(prefers-color-scheme: dark)');
    mq.addEventListener?.('change', apply);
    return () => mq.removeEventListener?.('change', apply);
  }, [tweaks.theme]);

  // Aurora
  React.useEffect(() => {
    const aurora = tweaks.aurora === 'auto' ? auroraFromHour(hour) :
      tweaks.aurora === 'morning' ? 'var(--aurora-morning)' :
      tweaks.aurora === 'noon'    ? 'var(--aurora-noon)' :
      tweaks.aurora === 'evening' ? 'var(--aurora-evening)' :
      tweaks.aurora === 'night'   ? 'var(--aurora-night)' : 'var(--aurora-morning)';
    document.documentElement.style.setProperty('--aurora-current', aurora);
  }, [tweaks.aurora, hour]);

  // Tweaks host integration
  React.useEffect(() => {
    const onMsg = (e) => {
      if (e.data?.type === '__activate_edit_mode')   setShowTweaks(true);
      if (e.data?.type === '__deactivate_edit_mode') setShowTweaks(false);
    };
    window.addEventListener('message', onMsg);
    window.parent.postMessage({ type: '__edit_mode_available' }, '*');
    return () => window.removeEventListener('message', onMsg);
  }, []);

  const setTweak = (k, v) => {
    const next = { ...tweaks, [k]: v };
    setTweaks(next);
    window.parent.postMessage({ type: '__edit_mode_set_keys', edits: { [k]: v } }, '*');
  };

  const agentNameLookup = (id) => {
    const a = agents.find(x => x.id === id);
    return a?.name || id?.toUpperCase() || 'Agent';
  };

  // Chat: Home → triage → backend
  const handleSendChat = async (text) => {
    setActiveAgent(null);
    setThread([{ role: 'user', text }]);
    setView('chat');
    setBusy(true);

    // WS varsa onunla gönder, yoksa (sandbox / proxy / kapanmışsa) REST fallback
    const wsOK = KW.online && KW.sendChatWS({ message: text, conversationId: activeConversationId, history: [] });
    if (wsOK) return;

    try {
      setThread(prev => upsertTriage(prev, 'Chief of Staff düşünüyor…'));
      const res = await KW.chat(text, activeConversationId);
      setActiveConversationId(res.conversationId);
      setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
        role: 'agent', agent: res.from, name: agentNameLookup(res.from),
        text: res.reply, meetingId: res.meetingId,
        suggestions: res.suggestions || [],
      }]);
      const c = await KW.listConversations(); setConvs(c);
      const m = await KW.listMeetings(); setMeetings(m);
    } catch (e) {
      setThread(prev => [...prev.filter(x => x.role !== 'triage'), {
        role: 'agent', agent: 'cos', name: 'Sistem', text: '⚠️ ' + e.message,
      }]);
    } finally {
      setBusy(false);
    }
  };

  const handleSendInChat = async (text) => {
    setThread(prev => [...prev, { role: 'user', text }]);
    setBusy(true);

    if (activeAgent) {
      try {
        setThread(prev => [...prev, { role: 'triage', text: `${activeAgent.name} cevap hazırlıyor…` }]);
        const res = await KW.askAgent(activeAgent.id, text);
        setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
          role: 'agent', agent: activeAgent.id, name: activeAgent.name, text: res.reply,
        }]);
      } catch (e) {
        setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
          role: 'agent', agent: activeAgent.id, name: activeAgent.name, text: '⚠️ ' + e.message,
        }]);
      } finally { setBusy(false); }
      return;
    }

    const history = thread.slice(-6).map(m => ({ role: m.role === 'user' ? 'user' : 'assistant', content: m.text }));

    // Solution session: REST only (orchestrator skip-triage path needs chat_type param)
    if (activeChatType === 'solution_session') {
      try {
        setThread(prev => [...prev, { role: 'triage', text: '🏗️ Çözüm Mimarı (MP+CSO) düşünüyor — Discovery → ICP → 3 yol süreci başlıyor…' }]);
        const res = await KW.chat(text, activeConversationId, history, 'solution_session');
        if (res.conversationId) setActiveConversationId(res.conversationId);
        setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
          role: 'agent', agent: res.from, name: agentNameLookup(res.from),
          text: res.reply, meetingId: res.meetingId,
        }]);
        const c = await KW.listConversations(); setConvs(c);
      } catch (e) {
        setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
          role: 'agent', agent: 'mp', name: 'Sistem', text: '⚠️ ' + e.message,
        }]);
      } finally { setBusy(false); }
      return;
    }

    const wsOK = KW.online && KW.sendChatWS({ message: text, conversationId: activeConversationId, history });
    if (wsOK) return;

    try {
      const res = await KW.chat(text, activeConversationId, history);
      setThread(prev => [...prev, {
        role: 'agent', agent: res.from, name: agentNameLookup(res.from),
        text: res.reply, meetingId: res.meetingId,
        suggestions: res.suggestions || [],
      }]);
      if (res.conversationId) setActiveConversationId(res.conversationId);
    } catch (e) {
      setThread(prev => [...prev, { role: 'agent', agent: 'cos', name: 'Sistem', text: '⚠️ ' + e.message }]);
    } finally { setBusy(false); }
  };

  const openConversation = async (cid) => {
    setActiveAgent(null);
    setActiveConversationId(cid);
    // Detect chat_type so subsequent messages route correctly (solution session vs regular)
    const conv = (conversations || []).find(c => c.id === cid);
    setActiveChatType(conv?.chat_type === 'solution_session' ? 'solution_session' : 'regular');
    setView('chat');
    if (KW.online) {
      const msgs = await KW.getConversationMessages(cid);
      setThread(msgs.length ? msgs : []);
      // Mark read → unread badge azalır + sidebar refresh
      KW.markConversationRead(cid).then(({ totalUnread }) => {
        setUnreadCount(totalUnread || 0);
        KW.listConversations().then(setConvs);
      });
    } else {
      setThread(window.SAMPLE_THREAD);
    }
  };

  const newConversation = () => {
    setActiveAgent(null);
    setActiveConversationId(null);
    setActiveChatType('regular');
    setThread([]);
  };

  const pickAgent = (agent) => {
    setActiveAgent(agent);
    setActiveConversationId(null);
    setThread([{
      role: 'agent', agent: agent.id, name: agent.name,
      text: `Merhaba Neşet Bey, ben ${agent.name}. ${agent.role || ''} alanında size nasıl yardımcı olabilirim?`
    }]);
    setView('chat');
  };

  const startMeeting = async ({ topic, agents: agentIds, agentIds: legacyIds, message }) => {
    const finalIds = agentIds || legacyIds || [];
    setShowMeetingModal(false);
    setView('chat');
    setActiveAgent(null);
    setThread([
      { role: 'user', text: `📅 Toplantı: ${topic}\n\n${message}` },
      { role: 'triage', text: `${finalIds.length} ekip üyesi toplandı, sentez hazırlanıyor…` },
    ]);
    setBusy(true);
    try {
      const res = await KW.startMeeting({ topic, agents: finalIds, message });
      setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
        role: 'agent', agent: 'mp', name: 'Managing Partner',
        text: res.synthesis || 'Toplantı tamamlandı.', meetingId: res.meetingId,
      }]);
      const m = await KW.listMeetings(); setMeetings(m);
    } catch (e) {
      setThread(prev => [...prev.filter(m => m.role !== 'triage'), {
        role: 'agent', agent: 'mp', name: 'Managing Partner',
        text: '⚠️ Toplantı kurulamadı: ' + e.message,
      }]);
    } finally { setBusy(false); }
  };

  // ---- Files & Analytics handlers ----
  const refreshFilesAndAnalytics = async () => {
    const [fs, ch, ins] = await Promise.all([
      KW.listFiles(), KW.getCharts(), KW.getInsights(),
    ]);
    setFiles(fs);
    setCharts(ch?.charts || []);
    setInsights(ins);
  };

  const handleFileUpload = async (fileList) => {
    if (!KW.online) {
      alert('Backend çevrimdışı — dosya yüklenemiyor.');
      return;
    }
    for (const f of fileList) {
      try {
        const uploaded = await KW.uploadFile(f, { category: 'monthly-tracking' });
        if (uploaded) setFiles(prev => [uploaded, ...prev]);
      } catch (e) {
        alert(`"${f.name}" yüklenemedi: ${e.message}`);
      }
    }
    // Arka planda işleniyor — 5 sn'de bir poll
    if (filesPollRef.current) clearInterval(filesPollRef.current);
    filesPollRef.current = setInterval(async () => {
      const fresh = await KW.listFiles();
      setFiles(fresh);
      const stillPending = fresh.some(x => x.status === 'uploaded' || x.status === 'parsed');
      if (!stillPending) {
        clearInterval(filesPollRef.current);
        filesPollRef.current = null;
        // Final refresh: charts + insights
        const [ch, ins] = await Promise.all([KW.getCharts(), KW.getInsights()]);
        setCharts(ch?.charts || []);
        setInsights(ins);
      }
    }, 5000);
  };

  const openFileInspector = async (file) => {
    if (file.status === 'analyzed') {
      // Analiz detayını çek
      const enriched = await KW.getFileWithAnalysis(file.id);
      setActiveFile(enriched || file);
    } else {
      setActiveFile(file);
    }
  };

  const handleDeleteFile = async (file) => {
    if (!confirm(`"${file.name}" silinsin mi? (Geri alınamaz)`)) return;
    await KW.deleteFile(file.id);
    setActiveFile(null);
    await refreshFilesAndAnalytics();
  };

  // ---- News v2 handlers ----
  const handleToggleNewsLike = async (id) => {
    // Optimistic update
    setAllNews(prev => prev.map(n => n.id === id ? { ...n, liked: !n.liked, isLiked: !n.liked } : n));
    try {
      const res = await KW.toggleNewsLike(id);
      // Authoritative update
      setAllNews(prev => prev.map(n => n.id === id ? { ...n, liked: res.liked, isLiked: res.liked } : n));
    } catch (e) {
      // Revert
      setAllNews(prev => prev.map(n => n.id === id ? { ...n, liked: !n.liked, isLiked: !n.liked } : n));
      console.warn('[news] toggle fail:', e);
    }
  };

  const handleTalkCoSAboutFile = (file) => {
    setActiveFile(null);
    const prompt = file.summary
      ? `"${file.name}" dosyasındaki analiz: "${file.summary}". Bu trende göre öncelik ne olmalı?`
      : `"${file.name}" dosyasını yükledim. Buradaki verilere göre önerilerin neler?`;
    handleSendChat(prompt);
  };

  const toggleTask = async (id) => {
    const t = tasks.find(x => x.id === id);
    if (!t) return;
    const newDone = !t.done;
    setTasks(ts => ts.map(x => x.id === id ? { ...x, done: newDone } : x));
    try { await KW.toggleTask(id, newDone); } catch (e) { console.warn(e); }
  };

  const createTaskFromMeeting = async (meeting) => {
    const title = `Takip: ${meeting.topic}`;
    await KW.createTask({ title, sourceMeetingId: meeting.id });
    const fresh = await KW.listTasks(); setTasks(fresh);
    setActiveMeeting(null);
  };

  return (
    <div className="app">
      <div className="aurora-bg"></div>

      {!backendOnline && (
        <div className="offline-banner">
          ⚠️ Backend offline · UI mock veri ile çalışıyor · Backend'i başlatın: <code>cd backend && npm run dev</code>
        </div>
      )}

      <Sidebar
        activeView={view}
        onNavigate={(v) => {
          // 'chats' sidebar'dan tıklandığında: tüm sohbetler listesine git (ChatsScreen)
          if (v === 'chats') { setView('chats'); return; }
          setView(v);
          if (v === 'home') newConversation();
        }}
        conversations={conversations}
        onPickConversation={openConversation}
        unreadCount={unreadCount}
        taskCount={tasks.filter(t => !t.done).length}
        onOpenSettings={() => setShowTweaks(s => !s)}
      />
      <main className="main">
        <div className={`main-inner ${view === 'chat' ? 'main-inner-chat' : ''}`}>
          {view === 'home' && <HomeScreen
            onSendChat={handleSendChat}
            onOpenMeeting={setActiveMeeting}
            tasks={tasks}
            onToggleTask={toggleTask}
            hour={hour}
            meetings={meetings}
            agents={agents}
            home={home}
            news={news}
          />}
          {view === 'chats' && window.ChatsScreenV2 && <ChatsScreenV2
            conversations={conversations}
            onOpen={(c) => openConversation(c.id)}
            onNewChat={() => { newConversation(); setView('chat'); }}
            onGoHome={() => setView('home')}
          />}
          {view === 'chats' && !window.ChatsScreenV2 && window.ChatsScreen && <ChatsScreen
            conversations={conversations}
            onPickConversation={openConversation}
            onNewChat={() => { newConversation(); setView('chat'); }}
            unreadCount={unreadCount}
          />}
          {view === 'solution-sessions' && window.SolutionSessionsScreen && <SolutionSessionsScreen
            conversations={conversations}
            onPickSession={(id) => {
              setActiveConversationId(id);
              setActiveChatType('solution_session');
              setActiveAgent(null);
              setThread([]);
              setView('chat');
            }}
            onStartNew={(id) => {
              setActiveConversationId(id);
              setActiveChatType('solution_session');
              setActiveAgent(null);
              setThread([{
                role: 'agent',
                agent: 'mp',
                name: 'Çözüm Mimarı (MP+CSO)',
                text: '🏗️ **Çözüm Sohbeti başladı.**\n\nBu özel mod — sizin "satılmaz/zor/olmaz" dediğiniz vakalar için yapılandırılmış 4-fazlı süreç işletiyorum:\n\n1. **Discovery** — 8 kategoride sorular (atlanmaz)\n2. **ICP Analizi** — 3 alıcı profili\n3. **3 Yol** — 2 pragmatik + 1 provokatif\n4. **Sezgi Testi** — 12-yıllık tecrübeniz hangi yola "olmaz" dedirtiyor\n\nSenaryonuzu anlatın — müteahhit kim, envanter nedir, ana itirazınız nedir? Ben gerekli soruları sorarak başlayacağım.',
              }]);
              setView('chat');
            }}
          />}
          {view === 'chat' && window.ChatScreenV2 && (() => {
            // ChatScreenV2 expects a single `conversation` object with rich meta.
            // Build it from current state.
            const found = conversations.find(c => c.id === activeConversationId);
            const conv = found ? {
              id: found.id,
              title: found.title || 'Yeni sohbet',
              chat_type: activeChatType || found.chat_type || 'regular',
              agents: activeAgent ? [activeAgent.id] : (found.agents || []),
              message_count: thread.length,
              updated_minutes_ago: 0,
            } : (activeConversationId ? {
              id: activeConversationId,
              title: 'Sohbet',
              chat_type: activeChatType || 'regular',
              agents: activeAgent ? [activeAgent.id] : [],
              message_count: thread.length,
              updated_minutes_ago: 0,
            } : (activeAgent ? {
              id: 'agent-' + activeAgent.id,
              title: activeAgent.name,
              chat_type: 'regular',
              agents: [activeAgent.id],
              message_count: thread.length,
              updated_minutes_ago: 0,
            } : null));
            return <ChatScreenV2
              conversation={conv}
              thread={thread.map(m => ({
                ...m,
                time: m.time || (m.created_at
                  ? new Date(m.created_at).toLocaleTimeString('tr-TR', { hour: '2-digit', minute: '2-digit' })
                  : ''),
                mode: m.mode || (activeChatType === 'solution_session' && m.role !== 'user' ? 'solution_session' : (m.mode || undefined)),
              }))}
              onSend={handleSendInChat}
              onBack={() => setView('chats')}
              onOpenMeeting={async (mid) => { const m = await KW.getMeeting(mid); setActiveMeeting(m); }}
              busy={busy}
            />;
          })()}
          {view === 'chat' && !window.ChatScreenV2 && <ChatScreen
            thread={thread}
            onSend={handleSendInChat}
            busy={busy}
            agentTitle={activeAgent ? activeAgent.name : (activeConversationId ? conversations.find(c => c.id === activeConversationId)?.title || 'Sohbet' : 'Yeni sohbet')}
            agentSubtitle={activeAgent ? (activeAgent.role || '') : 'Chief of Staff triage ediyor'}
            agents={agents}
            onOpenMeeting={async (mid) => { const m = await KW.getMeeting(mid); setActiveMeeting(m); }}
          />}
          {view === 'team' && <TeamScreen
            agents={agents}
            onPickAgent={pickAgent}
            onOpenAgent={setAgentInspector}
            onOpenMeeting={() => setShowMeetingModal(true)}
            onStartMeeting={() => setShowMeetingModal(true)}
          />}
          {view === 'meetings' && (window.MeetingsScreenV3
            ? <MeetingsScreenV3 onSendChat={handleSendChat} />
            : <MeetingsScreen meetings={meetings} onOpenMeeting={setActiveMeeting} agents={agents} />
          )}
          {view === 'news' && !activeNewsThread && <NewsScreen
            news={allNews}
            onToggleLike={handleToggleNewsLike}
            onToggleRead={async (id) => {
              setAllNews(prev => prev.map(n => n.id === id ? { ...n, isRead: !n.isRead } : n));
              try { await KW.markNewsRead?.(id, true); } catch {}
            }}
            onNavigate={setView}
            onSendChat={handleSendChat}
            onOpenThreadView={setActiveNewsThread}
          />}
          {view === 'news' && activeNewsThread && window.TopicThreadView && <TopicThreadView
            threadId={activeNewsThread}
            news={allNews}
            onBack={() => setActiveNewsThread(null)}
            onOpenReader={() => {}}
            onToggleLike={handleToggleNewsLike}
            onToggleRead={async (id) => {
              setAllNews(prev => prev.map(n => n.id === id ? { ...n, isRead: !n.isRead } : n));
              try { await KW.markNewsRead?.(id, true); } catch {}
            }}
          />}
          {view === 'liked-news' && <LikedNewsScreen
            news={allNews}
            onToggleLike={handleToggleNewsLike}
            onToggleRead={async (id) => {
              setAllNews(prev => prev.map(n => n.id === id ? { ...n, isRead: !n.isRead } : n));
              try { await KW.markNewsRead?.(id, true); } catch {}
            }}
            onNavigate={setView}
            onSendChat={handleSendChat}
          />}
          {view === 'tasks' && (window.TasksScreenV3
            ? <TasksScreenV3
                onSendChat={handleSendChat}
                onOpenMeeting={async (mid) => { const m = await KW.getMeeting(mid); setActiveMeeting(m); }}
                onOpenConversation={openConversation}
              />
            : <TasksScreen tasks={tasks} onToggleTask={toggleTask} onPickConversation={openConversation} onOpenMeeting={async (mid) => { const m = await KW.getMeeting(mid); setActiveMeeting(m); }} onReprioritize={async () => { const r = await KW.reprioritizeTasks(); const fresh = await KW.listTasks(true); setTasks(fresh); return r; }} onTaskAction={async (id, action) => { if (action.delete) await KW.deleteTask(id); else await KW.updateTask(id, action); const fresh = await KW.listTasks(true); setTasks(fresh); }} />
          )}
          {view === 'files' && <FilesScreen
            files={files}
            onUpload={handleFileUpload}
            onOpenFile={openFileInspector}
          />}
          {view === 'analytics' && <AnalyticsScreen
            charts={charts}
            insights={insights}
            onSendChat={handleSendChat}
          />}
        </div>
      </main>

      <Inspector
        meeting={activeMeeting}
        onClose={() => setActiveMeeting(null)}
        agents={agents}
        onCreateTask={async () => {
          // Inspector görev çıkardıysa global state refresh
          const fresh = await KW.listTasks(true);
          setTasks(fresh);
        }}
        onOpenTaskList={() => { setActiveMeeting(null); setView('tasks'); }}
      />

      {window.FileInspector && (
        <FileInspector
          file={activeFile}
          onClose={() => setActiveFile(null)}
          onTalkCoS={handleTalkCoSAboutFile}
          onDelete={handleDeleteFile}
        />
      )}

      {window.AgentInspector && (
        <AgentInspector
          agent={agentInspector}
          onClose={() => setAgentInspector(null)}
          onPickAgent={(a) => { setAgentInspector(null); pickAgent(a); }}
          onSendExample={(a, text) => { setAgentInspector(null); pickAgent(a); setTimeout(() => handleSendInChat(text), 250); }}
        />
      )}

      {onboardingChecked && !onboardingDone && backendOnline && !tutorialActive && (
        <OnboardingWizard
          onComplete={() => setOnboardingDone(true)}
        />
      )}

      <MeetingModal
        open={showMeetingModal}
        onClose={() => setShowMeetingModal(false)}
        onStart={(payload) => { setShowMeetingModal(false); startMeeting(payload); }}
      />

      {showTweaks && (
        <div className="tweak-panel">
          <h3>Tweaks</h3>
          <div className="tweak-row">
            <label>Tema</label>
            <div className="tweak-segments">
              {['auto','light','dark'].map(t => (
                <button key={t} className={tweaks.theme === t ? 'active' : ''} onClick={() => setTweak('theme', t)}>{t}</button>
              ))}
            </div>
          </div>
          <div className="tweak-row">
            <label>Aurora</label>
            <div className="tweak-segments">
              {['auto','morning','noon','evening'].map(t => (
                <button key={t} className={tweaks.aurora === t ? 'active' : ''} onClick={() => setTweak('aurora', t)}>{t === 'auto' ? 'oto' : t === 'morning' ? 'sab' : t === 'noon' ? 'öğl' : 'akş'}</button>
              ))}
            </div>
          </div>
          <div className="tweak-row">
            <label>Saat</label>
            <div className="tweak-segments">
              {[{v:-1,l:'oto'},{v:8,l:'sab'},{v:14,l:'öğl'},{v:19,l:'akş'},{v:23,l:'gec'}].map(t => (
                <button key={t.v} className={tweaks.hour === t.v ? 'active' : ''} onClick={() => setTweak('hour', t.v)}>{t.l}</button>
              ))}
            </div>
          </div>
          {/* DEV-only: yönetim araçları sadece ?dev=1 ile gelen tab'da görünür */}
          {window.KW_IS_DEV && (
            <>
              <div className="tweak-row">
                <label>Tekrar göster</label>
                <div className="tweak-segments">
                  <button onClick={() => { try { sessionStorage.removeItem('kw_welcome_done'); } catch {} location.reload(); }}>Welcome</button>
                  <button onClick={() => { try { sessionStorage.removeItem('kw_tutorial_done'); } catch {} location.reload(); }}>Tutorial</button>
                  <button onClick={async () => {
                    try { sessionStorage.removeItem('kw_onboarding_skipped'); } catch {}
                    try { await KW.resetOnboarding(); } catch {}
                    location.reload();
                  }}>Onboarding</button>
                </div>
              </div>
              <div className="tweak-row">
                <label>Verileri sıfırla</label>
                <div className="tweak-segments">
                  <button
                    style={{ color: 'var(--kw-red)' }}
                    onClick={async () => {
                      if (!confirm('Tüm test verisi (görevler, toplantılar, sohbetler, kararlar, beğeniler) silinsin mi?\n\nHaberler ve dosyalar korunur.\n\nGeri alınamaz.')) return;
                      try {
                        await KW.resetAllData();
                        alert('Veriler sıfırlandı. Sayfa yenileniyor.');
                        location.reload();
                      } catch (e) {
                        alert('Sıfırlama başarısız: ' + e.message);
                      }
                    }}
                  >🗑️ Tüm test verisini sil</button>
                </div>
              </div>
              <div className="tweak-row">
                <label>Dev tab</label>
                <div className="tweak-segments">
                  <button
                    onClick={() => {
                      try { sessionStorage.removeItem('kw_dev_mode'); } catch {}
                      const url = new URL(window.location.href);
                      url.searchParams.delete('dev');
                      window.location.href = url.toString();
                    }}
                  >Dev'i kapat (normal moda dön)</button>
                </div>
              </div>
            </>
          )}
          <div className="tweak-row">
            <label>Oturum</label>
            <div className="tweak-segments">
              <button onClick={onLogout} style={{ color: 'var(--kw-red)' }}>Çıkış yap</button>
            </div>
          </div>
        </div>
      )}
    </div>
  );
};

function upsertTriage(prev, text) {
  const others = prev.filter(m => m.role !== 'triage');
  return [...others, { role: 'triage', text }];
}

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