import { getWalletBalance } from "@/api/wallet";
import { getActivePlayerCurrencyFromStore } from "@/lib/player-currency";
import { useNetworkConnectionStore } from "@/stores/network-connection-store";

const POLLING_INTERVAL_MS = 30_000; // 30秒轮询间隔
const LIMITED_POLLING_DURATION_MS = 2 * 60 * 1000; // 2分钟限时轮询

/**
 * 非 Hook 钱包刷新工具 —— 供 Hook 与非 React 上下文共用。
 *
 * 立即拉取一次余额，并触发 `lottery-wallet-refresh` 全局事件。
 */
export async function refreshWalletNow(): Promise<void> {
  try {
    await getWalletBalance({ currency: getActivePlayerCurrencyFromStore() });
    window.dispatchEvent(new Event("lottery-wallet-refresh"));
  } catch {
    // 静默处理错误，避免频繁报错
  }
}

/**
 * 启动钱包限时轮询（2 分钟内每 30s 刷新一次）。
 * 先清除已有的钱包轮询计时器，避免泄漏。
 */
export function startLimitedWalletPolling(): void {
  const store = useNetworkConnectionStore.getState();
  store.clearWalletPolling();

  void refreshWalletNow();

  const expiryAt = Date.now() + LIMITED_POLLING_DURATION_MS;
  store.setWalletPollingExpiryAt(expiryAt);

  const intervalId = window.setInterval(() => {
    const s = useNetworkConnectionStore.getState();
    if (
      s.walletPollingExpiryAt !== null &&
      Date.now() > s.walletPollingExpiryAt
    ) {
      s.clearWalletPolling();
      return;
    }
    void refreshWalletNow();
  }, POLLING_INTERVAL_MS);

  store.setWalletPollingIntervalId(intervalId);
}

/**
 * 启动钱包持续轮询（直到手动停止）。
 * 先清除已有的钱包轮询计时器，避免泄漏。
 */
export function startPersistentWalletPolling(): void {
  const store = useNetworkConnectionStore.getState();
  store.clearWalletPolling();

  void refreshWalletNow();

  const intervalId = window.setInterval(() => {
    void refreshWalletNow();
  }, POLLING_INTERVAL_MS);

  store.setWalletPollingIntervalId(intervalId);
}

/** 停止钱包轮询 */
export function stopWalletPolling(): void {
  useNetworkConnectionStore.getState().clearWalletPolling();
}
