(function (global) {
  "use strict";

  const THEME_KEY = "xiaobaiTheme";

  function readTheme() {
    try {
      const stored = global.localStorage.getItem(THEME_KEY);
      if (stored === "dark" || stored === "light") return stored;
    } catch (_error) {
      return "light";
    }
    if (global.matchMedia && global.matchMedia("(prefers-color-scheme: dark)").matches) {
      return "dark";
    }
    return "light";
  }

  function applyTheme(theme) {
    const normalized = theme === "dark" ? "dark" : "light";
    const app = document.getElementById("m-app");
    app.dataset.theme = normalized;
    app.style.colorScheme = normalized;
    document.body.style.backgroundColor = normalized === "dark" ? "#141519" : "#f4f5f7";
    return normalized;
  }

  function toggle() {
    const next = readTheme() === "dark" ? "light" : "dark";
    try {
      global.localStorage.setItem(THEME_KEY, next);
    } catch (_error) {
      // Theme still applies for the current page when storage is unavailable.
    }
    applyTheme(next);
  }

  global.MobileTheme = { readTheme: readTheme, applyTheme: applyTheme, toggle: toggle };

  function syncKeyboardInset() {
    const app = document.getElementById("m-app");
    const visual = global.visualViewport;
    if (!visual) {
      app.style.setProperty("--m-keyboard-inset", "0px");
      return;
    }
    // 键盘高度 = 布局视口高度 - 可视视口高度。iOS 弹键盘时会同时抬升 offsetTop，
    // 若再扣 offsetTop 会把 inset 算成 0，导致输入区/底栏不避让，故只按高度差计算。
    const inset = Math.max(0, global.innerHeight - visual.height);
    app.style.setProperty("--m-keyboard-inset", inset + "px");
  }

  function bindViewport() {
    const visual = global.visualViewport;
    if (visual) {
      visual.addEventListener("resize", syncKeyboardInset);
      visual.addEventListener("scroll", syncKeyboardInset);
    }
    syncKeyboardInset();
  }

  async function boot() {
    applyTheme(readTheme());
    bindViewport();
    let session = { authenticated: false };
    try {
      session = await global.MobileSession.me();
    } catch (_error) {
      session = { authenticated: false };
    }
    const hash = global.location.hash || "";
    if (!session.authenticated) {
      if (!/^#\/?auth/.test(hash)) global.location.replace("#/auth");
    } else if (/^#\/?auth/.test(hash)) {
      global.location.replace("#/hub/market");
    }
    removeBootSplash();
    global.MobileRouter.init();
  }

  function removeBootSplash() {
    const splash = document.getElementById("m-boot-splash");
    if (splash) splash.remove();
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", boot, { once: true });
  } else {
    boot();
  }
})(window);
