/* Cloud-sync helpers
 *
 * window.useCloudState(k, default)  — alias 給 storage.jsx 的強制 cloud sync 版
 *                                     (定義在 storage.jsx；本檔僅保留 useCloudMirror)
 *
 * window.useCloudMirror()  — 全域 mirror。在最上層 mount 一次即可：
 *   - 訂閱整個 userState/{uid} doc，把 CLOUD_KEYS 的最新值即時寫回 localStorage
 *   - 讓 lib 內的純函數（如 FinMind.getToken()）能讀到雲端值，無需重構為 hook
 *   - 首次登入時把本機既有設定推上 cloud
 *   - 順帶遷移舊版 chart.draw.{symbol} → chart.drawings 字典
 *
 * Firestore 結構：collection "userState" → doc {uid} → fields CLOUD_KEYS
 * 需要的 security rule（見 firestore.rules）：
 *   match /userState/{uid} { allow read, write: if request.auth.uid == uid; }
 */

const CLOUD_COLLECTION = "userState";
const LEGACY_DRAW_PREFIX = "twstock.chart.draw.";

function getFirestore() {
  try { return window.firebase && window.firebase.firestore && window.firebase.firestore(); }
  catch (e) { return null; }
}

/* 掃 localStorage 把 chart.draw.{sym} 合併成 chart.drawings 字典
 * （只在 chart.drawings 還沒生出時觸發） */
function migrateLegacyDrawings() {
  if (!window.localStorage) return null;
  const merged = {};
  for (let i = 0; i < window.localStorage.length; i++) {
    const k = window.localStorage.key(i);
    if (!k || !k.startsWith(LEGACY_DRAW_PREFIX)) continue;
    const sym = k.slice(LEGACY_DRAW_PREFIX.length);
    try {
      const raw = window.localStorage.getItem(k);
      const v = raw ? JSON.parse(raw) : null;
      if (v) merged[sym] = v;
    } catch (e) {}
  }
  return Object.keys(merged).length > 0 ? merged : null;
}

function useCloudMirror() {
  const [user, setUser] = React.useState(() => {
    try { return window.firebase?.auth?.().currentUser || null; } catch (e) { return null; }
  });

  React.useEffect(() => {
    if (!window.firebase || !window.firebase.auth) return;
    let unsub;
    try { unsub = window.firebase.auth().onAuthStateChanged((u) => setUser(u)); }
    catch (e) { console.warn("[cloud-mirror] auth not ready", e.message); }
    return () => { if (unsub) unsub(); };
  }, []);

  React.useEffect(() => {
    if (!user) return;
    const db = getFirestore();
    if (!db) return;
    const ref = db.collection(CLOUD_COLLECTION).doc(user.uid);
    const SYNCED = Array.from(window.CLOUD_KEYS || []);

    let cancelled = false;
    (async () => {
      try {
        const snap = await ref.get();
        if (cancelled) return;
        const cloud = snap.exists ? snap.data() : null;
        const toPush = {};
        for (const key of SYNCED) {
          if (cloud && cloud[key] !== undefined) {
            if (window.TWStorage) window.TWStorage.set(key, cloud[key]);
          } else {
            let local = window.TWStorage ? window.TWStorage.get(key) : undefined;
            if (key === "chart.drawings" && local === undefined) {
              const migrated = migrateLegacyDrawings();
              if (migrated) {
                window.TWStorage && window.TWStorage.set("chart.drawings", migrated);
                local = migrated;
              }
            }
            if (local !== undefined) toPush[key] = local;
          }
        }
        if (Object.keys(toPush).length > 0) {
          toPush.updatedAt = window.firebase.firestore.FieldValue.serverTimestamp();
          await ref.set(toPush, { merge: true });
        }
      } catch (e) {
        console.warn("[cloud-mirror] initial sync failed", e.message);
      }
    })();

    const unsub = ref.onSnapshot({ includeMetadataChanges: true }, (snap) => {
      if (snap.metadata.hasPendingWrites) return;
      const data = snap.data();
      if (!data) return;
      for (const key of SYNCED) {
        if (data[key] !== undefined && window.TWStorage) {
          window.TWStorage.set(key, data[key]);
        }
      }
    }, (e) => console.warn("[cloud-mirror] snapshot error", e.message));

    return () => { cancelled = true; unsub(); };
  }, [user?.uid]);
}

window.useCloudMirror = useCloudMirror;
