// live-feed.jsx — 전국 실시간 실거래가 피드
// 백엔드 /v1/molit/recent 를 전국 주요 시군구로 순회 호출해
// 국토부에 실제 등록된 최신 아파트 매매 거래를 보여준다.
// (백엔드 + MOLIT_API_KEY 연결 시 진짜 데이터, 미연결 시 안내)

// 전국 주요 시군구 법정동코드 (LAWD_CD 5자리)
const NATIONWIDE_LAWD = [
  // 서울 25구
  ['서울 강남구', '11680'], ['서울 서초구', '11650'], ['서울 송파구', '11710'],
  ['서울 강동구', '11740'], ['서울 마포구', '11440'], ['서울 용산구', '11170'],
  ['서울 성동구', '11200'], ['서울 광진구', '11215'], ['서울 동대문구', '11230'],
  ['서울 중랑구', '11260'], ['서울 성북구', '11290'], ['서울 강북구', '11305'],
  ['서울 도봉구', '11320'], ['서울 노원구', '11350'], ['서울 은평구', '11380'],
  ['서울 서대문구', '11410'], ['서울 양천구', '11470'], ['서울 강서구', '11500'],
  ['서울 구로구', '11530'], ['서울 금천구', '11545'], ['서울 영등포구', '11560'],
  ['서울 동작구', '11590'], ['서울 관악구', '11620'], ['서울 종로구', '11110'],
  ['서울 중구', '11140'],
  // 경기 주요
  ['성남 분당구', '41135'], ['성남 수정구', '41131'], ['수원 영통구', '41117'],
  ['수원 장안구', '41111'], ['용인 수지구', '41465'], ['용인 기흥구', '41463'],
  ['고양 일산동구', '41285'], ['고양 일산서구', '41287'], ['안양 동안구', '41173'],
  ['화성시', '41590'], ['하남시', '41450'], ['광명시', '41210'], ['부천시', '41190'],
  ['남양주시', '41360'], ['평택시', '41220'], ['김포시', '41570'], ['의왕시', '41430'],
  // 인천
  ['인천 연수구', '28185'], ['인천 서구', '28260'], ['인천 남동구', '28200'],
  ['인천 부평구', '28237'], ['인천 미추홀구', '28177'],
  // 광역시·도
  ['부산 해운대구', '26350'], ['부산 수영구', '26500'], ['부산 부산진구', '26230'],
  ['부산 동래구', '26260'], ['부산 남구', '26290'],
  ['대구 수성구', '27260'], ['대구 중구', '27110'], ['대구 달서구', '27290'],
  ['대전 유성구', '30200'], ['대전 서구', '30170'],
  ['광주 남구', '29155'], ['광주 서구', '29140'],
  ['울산 남구', '31140'], ['울산 중구', '31110'],
  ['세종특별자치시', '36110'],
  ['창원 성산구', '48125'], ['청주 흥덕구', '43113'], ['천안 서북구', '44133'],
  ['전주 완산구', '45111'], ['포항 남구', '47111'], ['제주시', '50110'],
];

function lastDealYmd(offsetMonths) {
  const d = new Date();
  d.setMonth(d.getMonth() - (offsetMonths || 0));
  return d.getFullYear() + ('' + (d.getMonth() + 1)).padStart(2, '0');
}
function manToWon(man) {
  if (man >= 10000) {
    const eok = Math.floor(man / 10000);
    const rest = man % 10000;
    return rest ? `${eok}억 ${rest.toLocaleString()}` : `${eok}억`;
  }
  return man.toLocaleString() + '만';
}

// 전국 실시간 실거래 피드 훅
function useNationwideFeed() {
  const [state, setState] = useState({ loading: true, connected: !!window.UJTrack.API_BASE, items: [], updatedAt: null, error: null, regionsScanned: 0 });

  const load = useCallback(async () => {
    const API = window.UJTrack.API_BASE;
    let lastDiag = '';
    if (!API) {
      // 실데이터 전용: 백엔드 미연결이면 데모를 넣지 않고 안내만
      setState({ loading: false, connected: false, demo: false, items: [], updatedAt: Date.now(), error: 'no_backend', regionsScanned: 0 });
      return;
    }
    setState(s => ({ ...s, loading: true }));
    window.UJTrack.track('nationwide_feed_load', {});
    // 전국에서 무작위로 12개 시군구 추출 (매번 다른 지역 → "전국" 느낌 + 부하 분산)
    const shuffled = [...NATIONWIDE_LAWD].sort(() => Math.random() - 0.5).slice(0, 12);
    const ymdCandidates = [lastDealYmd(1), lastDealYmd(2)]; // 지난달·지지난달
    const all = [];
    let scanned = 0;
    for (const [region, lawd] of shuffled) {
      let got = false;
      for (const ymd of ymdCandidates) {
        try {
          const r = await fetch(`${API}/v1/molit/recent?lawd_code=${lawd}&deal_ymd=${ymd}`);
          if (!r.ok) { lastDiag = 'HTTP ' + r.status; continue; }
          const d = await r.json();
          if (d.diag && !lastDiag) lastDiag = d.diag;
          const items = d.items || [];
          if (items.length) {
            items.slice(0, 4).forEach(it => {
              if (it.price > 0) all.push({ region, name: it.name, price: it.price, dong: it.dong || '', ymd, area: it.area || 0, floor: it.floor || 0, buildYear: it.buildYear || 0, day: it.day || 0 });
            });
            got = true;
            break;
          }
        } catch (e) { lastDiag = String(e); }
      }
      scanned++;
      if (got) setState(s => ({ ...s, regionsScanned: scanned, items: [...all] }));
    }
    // 실데이터 전용: RTMS가 비면 데모를 넣지 않고 재시도 안내
    if (all.length === 0) {
      setState({ loading: false, connected: true, demo: false, items: [], updatedAt: Date.now(), error: 'no_data', diag: lastDiag, regionsScanned: scanned });
      window.UJTrack.track('nationwide_feed_empty', { regions: scanned, diag: lastDiag });
      return;
    }
    // 가격 높은 순 일부 + 무작위 섞어서 다양하게
    all.sort(() => Math.random() - 0.5);
    setState({ loading: false, connected: true, items: all.slice(0, 30), updatedAt: Date.now(), error: null, regionsScanned: scanned });
    window.UJTrack.track('nationwide_feed_done', { count: all.length, regions: scanned });
  }, []);

  useEffect(() => {
    load();
    const id = setInterval(load, 90 * 1000); // 90초마다 전국 재스캔
    return () => clearInterval(id);
  }, [load]);

  return { ...state, reload: load };
}

// 대시보드용 전국 실거래 피드 패널
function NationwideFeed({ isMobile }) {
  const feed = useNationwideFeed();
  const [selected, setSelected] = useState(null);

  // 같은 단지의 거래들을 묶어 trades 배열 구성 → 상세 모달로 전달
  const openDetail = (item) => {
    // 데모: 해당 단지의 전체 실거래 이력(다건)을 가져온다
    let trades = window.tradesForName ? window.tradesForName(item.name, item.region) : [];
    if (!trades || trades.length === 0) {
      const sameName = feed.items.filter(x => x.name === item.name && x.region === item.region);
      trades = (sameName.length ? sameName : [item]).map(x => ({
        name: x.name, price: x.price, dong: x.dong, area: x.area, floor: x.floor, buildYear: x.buildYear, ymd: x.ymd, day: x.day,
      }));
    }
    window.UJTrack.track('feed_item_click', { name: item.name, region: item.region, price: item.price });
    setSelected({ apt: { name: item.name, dong: item.dong, trades, area: item.area, buildYear: item.buildYear }, region: item.region });
  };

  return (
    <Panel title="전국 실시간 실거래" subtitle={feed.connected ? '국토부 RTMS · 클릭 시 AI 분석' : '데모 · 클릭 시 AI 분석'} action={
      <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
        <span className={feed.loading ? 'uj-blink' : ''} style={{ width: 7, height: 7, borderRadius: 4, background: feed.connected ? T.up : T.hot, boxShadow: '0 0 8px ' + (feed.connected ? T.up : T.hot) }} />
        <span style={{ fontSize: 10, fontFamily: T.mono, color: feed.connected ? T.up : T.hot }}>{feed.loading ? 'SCAN…' : feed.connected ? 'LIVE' : '연결 필요'}</span>
        <button onClick={feed.reload} disabled={feed.loading} style={{ padding: '2px 8px', borderRadius: 3, background: T.card, color: T.fgDim, border: '1px solid ' + T.line, fontFamily: T.mono, fontSize: 10, cursor: 'pointer' }}>↻</button>
      </div>
    }>
      {feed.loading ? (
        <div style={{ padding: 24, textAlign: 'center', fontSize: 13, color: T.fgMuted }}>
          <span className="uj-blink">국토부 RTMS 실거래가 불러오는 중…</span>
        </div>
      ) : feed.error === 'no_backend' ? (
        <div style={{ padding: 24, textAlign: 'center', fontSize: 13, color: T.fgMuted, lineHeight: 1.7 }}>
          백엔드(api.uri-jib.com)에 연결되지 않았습니다.<br/>잠시 후 ↻ 로 다시 시도해주세요.
        </div>
      ) : feed.error === 'no_data' ? (
        <div style={{ padding: 24, textAlign: 'center', fontSize: 13, color: T.fgMuted, lineHeight: 1.7 }}>
          방금 스캔한 지역에 최근 신고된 실거래가 없습니다.<br/>↻ 버튼으로 다른 지역을 다시 스캔하세요.
          {feed.diag && <div style={{ marginTop: 8, fontSize: 10, color: T.down, fontFamily: T.mono }}>RTMS: {feed.diag}</div>}
        </div>
      ) : (
        <div>
          <div style={{ fontSize: 10, color: T.fgMuted, fontFamily: T.mono, marginBottom: 10 }}>
            {feed.regionsScanned}개 시군구 스캔 · {feed.items.length}건 수신 · 클릭하면 상세
          </div>
          <div className="uj-scroll" style={{ maxHeight: isMobile ? 320 : 420, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 1 }}>
            {feed.items.map((it, i) => (
              <button key={i} onClick={() => openDetail(it)} data-track="feed_item"
                style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '9px 6px', borderBottom: '1px solid ' + T.line, background: 'transparent', border: 'none', borderBottomColor: T.line, borderBottomStyle: 'solid', borderBottomWidth: 1, cursor: 'pointer', textAlign: 'left', width: '100%', fontFamily: T.font, transition: 'background .12s' }}
                onMouseEnter={(e) => e.currentTarget.style.background = T.cardHi}
                onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}>
                <div style={{ width: 6, height: 6, borderRadius: 3, background: T.up, flexShrink: 0 }} />
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 13, fontWeight: 600, color: T.fg, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{it.name}</div>
                  <div style={{ fontSize: 10, color: T.fgMuted, fontFamily: T.mono }}>{it.region} {it.dong} · {it.ymd.slice(0, 4)}.{it.ymd.slice(4)}</div>
                </div>
                <div style={{ textAlign: 'right', flexShrink: 0 }}>
                  <div className="uj-num" style={{ fontSize: 14, fontWeight: 700, color: T.fg, whiteSpace: 'nowrap' }}>{manToWon(it.price)}</div>
                  <div style={{ fontSize: 9, color: T.ai, fontFamily: T.mono }}>AI 분석 →</div>
                </div>
              </button>
            ))}
            {feed.loading && feed.items.length === 0 && (
              <div style={{ padding: 24, textAlign: 'center', fontSize: 12, color: T.fgMuted }}>전국 실거래가 불러오는 중…</div>
            )}
          </div>
        </div>
      )}
      {selected && <TradeDetailModal data={selected} isMobile={isMobile} onClose={() => setSelected(null)} />}
    </Panel>
  );
}

Object.assign(window, { NationwideFeed, useNationwideFeed, NATIONWIDE_LAWD });
