// 경제 요약 — main app

const { useState, useEffect, useMemo, useCallback } = React;

function App() {
  // ---- Tweaks (persisted) ----
  const tweaksDefaults = window.__TWEAK_DEFAULTS || {};
  const [tweaks, setTweak] = useTweaks(tweaksDefaults);

  // ---- Theme ----
  const theme = tweaks.theme || 'light';
  useEffect(() => {
    document.body.setAttribute('data-theme', theme);
  }, [theme]);

  const toggleTheme = () => {
    setTweak('theme', theme === 'dark' ? 'light' : 'dark');
  };

  // ---- News data (mutable — server cron adds) ----
  const [newsData, setNewsData] = useState(() => [...window.NEWS_DATA]);

  // ---- Tickers (mutable — updated via server) ----
  const [tickers, setTickers] = useState(() => [...window.MARKET_TICKERS]);

  // ---- Filters ----
  const [activeCat, setActiveCat] = useState('all');
  const [sourceFilter, setSourceFilter] = useState('all');
  const [query, setQuery] = useState('');
  const [starFilter, setStarFilter] = useState(0);

  // ---- Main tab: 'news' | 'community' ----
  const [mainTab, setMainTab] = useState('news');

  // ---- Bookmarks (localStorage) ----
  const [saved, setSaved] = useState(() => {
    try {
      const v = localStorage.getItem('economy-bookmarks');
      return v ? JSON.parse(v) : [];
    } catch { return []; }
  });
  useEffect(() => {
    try { localStorage.setItem('economy-bookmarks', JSON.stringify(saved)); } catch {}
  }, [saved]);
  const toggleSave = useCallback((id) => {
    setSaved(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]);
  }, []);

  // ---- Modal ----
  const [openArticle, setOpenArticle] = useState(null);
  const [drawerOpen, setDrawerOpen] = useState(false);

  // ---- Article merge helper ----
  const addArticles = useCallback((newArticles) => {
    setNewsData(prev => {
      const merged = [...newArticles, ...prev];
      window.NEWS_DATA = merged;
      return merged;
    });
  }, []);

  // ---- Dynamic categories with counts ----
  const categories = useMemo(() => {
    const catMap = {};
    newsData.forEach(a => {
      catMap[a.category] = (catMap[a.category] || 0) + 1;
    });
    const baseCats = [
      { id: 'all',        label: '전체',       count: newsData.length },
      { id: 'macro',      label: '거시경제',   count: catMap.macro || 0 },
      { id: 'market',     label: '시장·증시',  count: catMap.market || 0 },
      { id: 'tech',       label: '기술·AI',    count: catMap.tech || 0 },
      { id: 'trade',      label: '무역·통상',  count: catMap.trade || 0 },
      { id: 'policy',     label: '정책·규제',  count: catMap.policy || 0 },
      { id: 'crypto',     label: '암호화폐',   count: catMap.crypto || 0 },
      { id: 'energy',     label: '에너지',     count: catMap.energy || 0 },
      { id: 'realestate', label: '부동산',     count: catMap.realestate || 0 },
    ];
    return baseCats.filter(c => c.id === 'all' || c.count > 0);
  }, [newsData]);

  // ---- Filtered & sorted list ----
  const filtered = useMemo(() => {
    return newsData
      .filter(a => {
        if (activeCat !== 'all' && a.category !== activeCat) return false;
        if (sourceFilter !== 'all' && a.sourceType !== sourceFilter) return false;
        if (starFilter > 0 && (a.stars || 0) < starFilter) return false;
        if (query.trim()) {
          const q = query.trim().toLowerCase();
          const hay = `${a.headline_ko} ${a.headline_en} ${a.summary_ko} ${a.source} ${a.keywords.join(' ')} ${a.keywords_en.join(' ')}`.toLowerCase();
          if (!hay.includes(q)) return false;
        }
        return true;
      })
      .sort((a, b) => {
        return new Date(b.publishedAt) - new Date(a.publishedAt);
      });
  }, [activeCat, sourceFilter, query, starFilter, newsData]);

  const hero = filtered[0];
  const rest = filtered.slice(1);

  // ---- 서버에서 최신 데이터 fetch 함수 ----
  const refreshFromServer = useCallback(() => {
    if (!window.loadCachedArticles) return Promise.resolve();
    return window.loadCachedArticles().then(cached => {
      if (cached.articles && cached.articles.length > 0) {
        setNewsData(prev => {
          const existIds = new Set(prev.map(a => a.id));
          const newOnly = cached.articles.filter(a => !existIds.has(a.id));
          if (newOnly.length === 0) return prev;
          const merged = [...newOnly, ...prev];
          window.NEWS_DATA = merged;
          console.log(`[Refresh] +${newOnly.length} new articles`);
          return merged;
        });
      }
      if (cached.tickers && cached.tickers.length > 0) {
        setTickers(cached.tickers);
        window.MARKET_TICKERS = cached.tickers;
      }
    }).catch(err => {
      console.warn('[Refresh] Failed:', err.message);
    });
  }, []);

  // ---- Load on mount + 5분마다 자동 갱신 (시세 & 기사) ----
  useEffect(() => {
    // 커뮤니티 30일 보존 정리 시작
    if (window.startRetentionCleanup) window.startRetentionCleanup();

    // 초기 로드
    refreshFromServer();

    // 5분(300초)마다 최신 시세 + 기사 자동 갱신
    const interval = setInterval(refreshFromServer, 5 * 60 * 1000);
    return () => clearInterval(interval);
  }, [refreshFromServer]);

  // ---- 1개월(30일) 이상 된 뉴스 자동 정리 ----
  useEffect(() => {
    const THIRTY_DAYS = 30 * 24 * 60 * 60 * 1000;
    const cleanup = () => {
      const cutoff = Date.now() - THIRTY_DAYS;
      setNewsData(prev => {
        const filtered = prev.filter(a => {
          const ts = new Date(a.publishedAt).getTime();
          return isNaN(ts) || ts > cutoff;
        });
        if (filtered.length !== prev.length) {
          console.log(`[Retention] ${prev.length - filtered.length}건 오래된 뉴스 정리`);
          window.NEWS_DATA = filtered;
        }
        return filtered.length !== prev.length ? filtered : prev;
      });
    };
    cleanup(); // 초기 정리
    const timer = setInterval(cleanup, 60 * 60 * 1000); // 1시간마다
    return () => clearInterval(timer);
  }, []);

  // ---- Tweaks panel ----
  const tweaksUI = (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Appearance">
        <TweakRadio
          label="Theme"
          value={tweaks.theme}
          onChange={v => setTweak('theme', v)}
          options={[
            { value: 'light', label: 'Light' },
            { value: 'dark',  label: 'Dark' },
          ]}
        />
      </TweakSection>
      <TweakSection label="Display">
        <TweakToggle
          label="헤드라인 아래 영문 원문 표시"
          value={tweaks.showOriginalUnderHeadline}
          onChange={v => setTweak('showOriginalUnderHeadline', v)}
        />
        <TweakToggle
          label="키워드 하이라이트"
          value={tweaks.highlightKeywords}
          onChange={v => setTweak('highlightKeywords', v)}
        />
      </TweakSection>
      <TweakSection label="Ticker">
        <TweakSlider
          label="시세 스크롤 속도 (초)"
          value={tweaks.tickerSpeed}
          min={30} max={180} step={10}
          onChange={v => setTweak('tickerSpeed', v)}
        />
      </TweakSection>
    </TweaksPanel>
  );

  const starSummary = starFilter > 0
    ? `★${starFilter}↑ · ${filtered.length}건`
    : `${filtered.length} ARTICLES`;

  return (
    <React.Fragment>
      <TickerBar tickers={tickers} speed={tweaks.tickerSpeed || 90} />

      <Masthead
        theme={theme}
        onToggleTheme={toggleTheme}
        savedCount={saved.length}
        onOpenSaved={() => setDrawerOpen(true)}
      />

      <SubNav
        categories={categories}
        activeCat={activeCat}
        setActiveCat={setActiveCat}
        query={query}
        setQuery={setQuery}
        sourceFilter={sourceFilter}
        setSourceFilter={setSourceFilter}
        starFilter={starFilter}
        setStarFilter={setStarFilter}
      />

      {/* Main Tab Bar */}
      <div className="main-tabs">
        <div className="container">
          <div className="main-tabs-row">
            <button className={`main-tab ${mainTab === 'news' ? 'active' : ''}`} onClick={() => setMainTab('news')}>
              <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M4 22h16a2 2 0 002-2V4a2 2 0 00-2-2H8a2 2 0 00-2 2v16a2 2 0 01-2 2zm0 0a2 2 0 01-2-2v-9c0-1.1.9-2 2-2h2"/></svg>
              뉴스
            </button>
            <button className={`main-tab ${mainTab === 'community' ? 'active' : ''}`} onClick={() => setMainTab('community')}>
              <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>
              커뮤니티
            </button>
          </div>
        </div>
      </div>

      <main>
        <div className="container">
          {/* NEWS TAB */}
          {mainTab === 'news' && (
            <React.Fragment>
              {hero && (
                <Hero
                  article={hero}
                  onOpen={setOpenArticle}
                  highlightOn={tweaks.highlightKeywords}
                  showEnglish={tweaks.showOriginalUnderHeadline}
                />
              )}

              {rest.length > 0 ? (
                <React.Fragment>
                  <div className="section-head">
                    <h2>최신 헤드라인</h2>
                    <span className="meta">{starSummary} · AI 번역</span>
                  </div>
                  <div className="news-grid">
                    {rest.map(a => (
                      <NewsCard
                        key={a.id}
                        article={a}
                        onOpen={setOpenArticle}
                        isSaved={saved.includes(a.id)}
                        onToggleSave={toggleSave}
                        highlightOn={tweaks.highlightKeywords}
                        showEnglish={tweaks.showOriginalUnderHeadline}
                      />
                    ))}
                  </div>
                </React.Fragment>
              ) : !hero ? (
                <div className="empty-state">
                  <h3>일치하는 기사가 없어요</h3>
                  <p>다른 검색어나 카테고리를 시도해 보세요.</p>
                </div>
              ) : null}
            </React.Fragment>
          )}

          {/* COMMUNITY TAB */}
          {mainTab === 'community' && (
            <CommunityBoard />
          )}
        </div>
      </main>

      <Footer />

      {openArticle && (
        <ArticleModal
          article={openArticle}
          onClose={() => setOpenArticle(null)}
          isSaved={saved.includes(openArticle.id)}
          onToggleSave={toggleSave}
        />
      )}

      {drawerOpen && (
        <BookmarksDrawer
          saved={saved}
          articles={newsData}
          onClose={() => setDrawerOpen(false)}
          onOpen={(a) => { setDrawerOpen(false); setOpenArticle(a); }}
          onToggleSave={toggleSave}
        />
      )}

      {tweaksUI}
    </React.Fragment>
  );
}

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