// 赛博宝宝前端（2026-10-21 从 index.html 的内联 <script type="text/babel"> 原样搬出）：主应用 App（各段在 app-*.jsx）＋ 挂载。
// index.html 按顺序加载 app/*.jsx，前面文件定义的全局（函数、常量、组件）后面的文件直接用。
// ═══════════════ 主应用 ═══════════════
function App() {
  const bag = {};
  Object.assign(bag, useAppState(bag));
  Object.assign(bag, useAppEffects(bag));
  const { endingData, loading, refresh, setLoading, setState, state } = bag;

  // ===== 登录 =====
  if (loading) return <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}>
    <div style={{ fontSize: 16, color: '#D79B6D' }}>加载中...</div>
  </div>;

  if (!state) return <LoginPage onLogin={() => { setLoading(true); refresh().then(() => setLoading(false)); }} />;

  // ===== 故事结束之后：进来就是那一天，回不到主界面 =====
  // 2026-08-05 小玉：「然后画面就封上吧。」童话定格在最好的那天，不再往下过日子。
  // 信是从库里读的（baby.ending_letter），所以重进来还是同一封，不会变。
  if (state.gameEnded && !endingData) {
    return <EndingScreen
      data={{ letter: state.storyEnded?.letter || '', babyName: state.name }}
      onRestart={() => { localStorage.removeItem('xz_token'); setState(null); }}
    />;
  }

  // ===== 取名流程 =====
  if (!state.name) {
    return <NamingPage onName={async (name) => {
      const res = await api('/name', 'POST', { name });
      if (!res.error) await refresh();
    }} />;
  }

  Object.assign(bag, appActions(bag));
  Object.assign(bag, appStoryActions(bag));
  Object.assign(bag, appDerived(bag));
  return renderApp(bag);
}

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