/**
 * Network Preference Helper (Issue #455)
 *
 * `navigator.connection` (Network Information API) は Chrome/Edge/Opera のみ対応、
 * Safari / Firefox は未対応のため、回線状態に応じた初期化制御が片寄っていた。
 *
 * 本モジュールは以下の優先順位で「回線状況」を決定する単一の正本を提供する:
 *   1. `navigator.connection` (Chromium 系) — saveData / effectiveType を採用
 *   2. localStorage に蓄積した過去の slow 計測履歴 (7 日窓) — Safari/Firefox の実測 fallback
 *   3. デフォルト 'normal'
 *
 * 使い方:
 *   const pref = getNetworkPreference();        // 即時判定
 *   recordConnectionDuration(elapsedMs);        // 計測値を localStorage に記録
 *
 * 戻り値の意味:
 *   - 'save-data' — ユーザーがデータセーバーを有効化 (最強の節約モード)
 *   - 'slow'      — 低速回線 (slow-2g/2g) または実測で slow 履歴あり
 *   - 'normal'    — それ以外 (3g 以上、または計測実績なし)
 *
 * 関連: #439 Bot/crawler skip、#446 capability check + legacy CTA、#334 idle preload
 */

const SLOW_HISTORY_KEY = "ai-agent-slow-history";
const SLOW_HISTORY_WINDOW_MS = 7 * 24 * 60 * 60 * 1000; // 7 日
const SLOW_HISTORY_TRIGGER_COUNT = 3; // 直近 7 日で 3 回 slow なら "slow" 扱い
const SLOW_THRESHOLD_MS = 5000; // 5 秒超過を "slow" と判定 (issue #455 推奨)

/**
 * Chromium 系の navigator.connection (Network Information API) を取得する。
 * webkit/moz prefix も拾う (古い実装互換)。
 * @returns {{ effectiveType?: string, saveData?: boolean, type?: string } | null}
 */
function getConnectionInfo() {
  if (typeof navigator === "undefined") return null;
  return navigator.connection || navigator.mozConnection || navigator.webkitConnection || null;
}

/**
 * localStorage から過去の slow 計測タイムスタンプ配列を読み出し、7 日以内に絞る。
 * @returns {number[]}
 */
function readSlowHistory() {
  try {
    const raw = localStorage.getItem(SLOW_HISTORY_KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw);
    if (!Array.isArray(parsed)) return [];
    const cutoff = Date.now() - SLOW_HISTORY_WINDOW_MS;
    return parsed.filter((t) => typeof t === "number" && t > cutoff);
  } catch {
    // SecurityError / SyntaxError / QuotaExceededError 等は静かに無視
    return [];
  }
}

/**
 * localStorage に slow 計測履歴を書き戻す (7 日窓内のみ保持)。
 * 失敗時は静かに無視 (Safari Private Mode 等)。
 * @param {number[]} timestamps
 */
function writeSlowHistory(timestamps) {
  try {
    const cutoff = Date.now() - SLOW_HISTORY_WINDOW_MS;
    const filtered = timestamps.filter((t) => typeof t === "number" && t > cutoff);
    localStorage.setItem(SLOW_HISTORY_KEY, JSON.stringify(filtered));
  } catch {
    // ignore
  }
}

/**
 * 「現在の回線状況」を判定する。同期 API。
 *
 * @returns {'save-data' | 'slow' | 'normal'}
 */
export function getNetworkPreference() {
  const conn = getConnectionInfo();

  if (conn) {
    // saveData は最優先 (ユーザー明示の節約意思)
    if (conn.saveData === true) return "save-data";
    if (conn.effectiveType === "slow-2g" || conn.effectiveType === "2g") {
      return "slow";
    }
    // 3g 以上 = normal
    return "normal";
  }

  // navigator.connection 未対応環境 (Safari/Firefox) → localStorage 履歴判定
  const history = readSlowHistory();
  if (history.length >= SLOW_HISTORY_TRIGGER_COUNT) return "slow";
  return "normal";
}

/**
 * 接続所要時間 (ms) を記録する。SLOW_THRESHOLD_MS を超過した場合のみ
 * slow 履歴に追加し、以降の getNetworkPreference() 判定に反映させる。
 *
 * @param {number} elapsedMs - 接続にかかった時間 (ms)
 */
export function recordConnectionDuration(elapsedMs) {
  if (typeof elapsedMs !== "number" || !isFinite(elapsedMs) || elapsedMs < 0) return;
  if (elapsedMs < SLOW_THRESHOLD_MS) return;

  const history = readSlowHistory();
  history.push(Date.now());
  writeSlowHistory(history);
}

/**
 * デバッグ用: 現在の判定材料スナップショット。
 * telemetry/log にそのまま流す想定で、判定ロジックには使わないこと。
 *
 * @returns {{
 *   pref: 'save-data' | 'slow' | 'normal',
 *   source: 'navigator.connection' | 'localStorage-history' | 'default',
 *   effectiveType?: string,
 *   saveData?: boolean,
 *   slowHistoryCount: number
 * }}
 */
export function snapshot() {
  const conn = getConnectionInfo();
  const history = readSlowHistory();
  const pref = getNetworkPreference();
  let source = "default";
  if (conn) source = "navigator.connection";
  else if (history.length >= SLOW_HISTORY_TRIGGER_COUNT) source = "localStorage-history";
  return {
    pref,
    source,
    effectiveType: conn?.effectiveType,
    saveData: conn?.saveData,
    slowHistoryCount: history.length,
  };
}

/**
 * テスト用: 履歴をクリアする (本番コードからは呼ばないこと)。
 */
export function _resetForTest() {
  try { localStorage.removeItem(SLOW_HISTORY_KEY); } catch { /* ignore */ }
}
