// app/faq-store.jsx — 자주묻는질문(FAQ) 공유 영속 스토어
// window.RibbonFaqStore 로 노출. data.jsx 다음에 로드(시드=window.RibbonData.FAQS).
//
// 문제: FAQ 관리 화면의 별(고정) 토글·등록·삭제가 컴포넌트 로컬 state 에만 있어
//  ① 사이드바 '고정 질문'에 즉시 반영 안 됨(사이드바는 정적 FAQS 를 읽음)
//  ② 새로고침하면 초기화(어디에도 저장 안 함).
// 해결: localStorage 영속 + 외부 스토어(useSyncExternalStore) 로 FaqManager·HistorySidebar 가
//  같은 상태를 구독 → 별을 누르면 두 곳이 즉시 갱신되고 새로고침해도 유지된다.

const FAQ_KEY = 'ribbon.faqs.v1';

function faqSeed() {
  // 시드(최초/파싱실패) — data.jsx 의 목업 FAQ 를 복제.
  return (window.RibbonData.FAQS || []).map((f) => ({ ...f }));
}
function faqLoad() {
  try {
    const a = JSON.parse(localStorage.getItem(FAQ_KEY) || 'null');
    if (Array.isArray(a)) return a;
  } catch (e) {}
  return faqSeed();
}
function faqPersist(list) {
  try { localStorage.setItem(FAQ_KEY, JSON.stringify(list)); } catch (e) {}
}

let _faqs = faqLoad();
const _subs = new Set();
function _emit(next) {
  _faqs = next;
  faqPersist(next);
  _subs.forEach((fn) => { try { fn(); } catch (e) {} });
}

const RibbonFaqStore = {
  // useSyncExternalStore 계약: getSnapshot 은 변경 없으면 동일 참조를 돌려줘야 한다(_faqs 는 set 때만 교체).
  get: () => _faqs,
  subscribe: (fn) => { _subs.add(fn); return () => _subs.delete(fn); },
  togglePin: (id) => _emit(_faqs.map((x) => (x.id === id ? { ...x, pinned: !x.pinned } : x))),
  add: (q, cat) => _emit([{ id: 'faq' + Date.now().toString(36), q, cat, uses: 0, pinned: false }, ..._faqs]),
  remove: (id) => _emit(_faqs.filter((x) => x.id !== id)),
  reset: () => _emit(faqSeed()),
};

// React 훅 — 구독형(FaqManager·HistorySidebar 공용). 변경 시 두 컴포넌트가 함께 리렌더.
function useFaqs() {
  return React.useSyncExternalStore(RibbonFaqStore.subscribe, RibbonFaqStore.get);
}

RibbonFaqStore.useFaqs = useFaqs;
window.RibbonFaqStore = RibbonFaqStore;
