/**
 * api-hooks/loader.js — Rich Browser API 拦截器（V2）
 *
 * 在 manifest.json 注册为 content_script，run_at: document_start, world: MAIN。
 * 在页面任何 JS 执行之前运行，安装 fetch + XHR Hook，把所有 JSON 响应缓存到
 * window.__capturedResponses。技能（如 shop-monitor）切换店铺/路由后可以直接读
 * 这个对象，免去 DOM 扫描。
 *
 * 设计原则：
 *   - 只挂 hook，不做业务逻辑（业务在技能侧做）
 *   - 不远程加载代码（Chrome MV3 政策硬约束）
 *   - 失败不抛错，永远静默降级（保护页面正常运行）
 *   - 给 hook 标个 source name，技能可以判断有没有命中
 *
 * 字段：
 *   window.__hookSource         = 'extension-v2-bundled'    标识 hook 已就位
 *   window.__hookInstalledAt    = Date.now()                安装时间戳
 *   window.__hookHost           = location.hostname         运行宿主
 *   window.__capturedResponses  = { [url]: {ts, data, status} }
 */

(function () {
  'use strict';

  // 防重复安装：如果同一帧已经装过，跳过
  if (window.__hookSource) return;

  try {
    window.__hookSource = 'extension-v2-bundled';
    window.__hookInstalledAt = Date.now();
    window.__hookHost = location.hostname;
    window.__capturedResponses = {};

    // ── 容量上限：单个 url 的响应只保留最后一份；总条数最多 200 条 ──
    var MAX_ENTRIES = 200;
    function recordResponse(url, data, status) {
      try {
        if (!url || typeof url !== 'string') return;
        var captured = window.__capturedResponses;
        if (!captured) return;
        var keys = Object.keys(captured);
        if (keys.length >= MAX_ENTRIES && !captured[url]) {
          // 简单 LRU：删最早一条
          delete captured[keys[0]];
        }
        captured[url] = {
          ts: Date.now(),
          data: data,
          status: status
        };
      } catch (e) { /* 任何写入失败都吞掉，不能影响页面 */ }
    }

    // ── 1. fetch hook ─────────────────────────────────────────────────────
    var origFetch = window.fetch;
    if (typeof origFetch === 'function') {
      window.fetch = function () {
        var args = arguments;
        var url = '';
        try {
          var first = args[0];
          if (typeof first === 'string') url = first;
          else if (first && first.url) url = first.url;
        } catch (e) {}
        url = String(url).slice(0, 800);

        var promise;
        try {
          promise = origFetch.apply(this, args);
        } catch (e) {
          // origFetch 自己抛了，直接回传给调用方
          throw e;
        }

        // 异步采集响应，不阻塞调用方
        promise.then(function (resp) {
          try {
            if (!resp || typeof resp.clone !== 'function') return;
            var ct = '';
            try { ct = resp.headers.get('content-type') || ''; } catch (e) {}
            if (ct.indexOf('json') === -1) return;
            resp.clone().json().then(function (data) {
              recordResponse(url, data, resp.status);
            }).catch(function () { /* 解析失败，忽略 */ });
          } catch (e) {}
        }).catch(function () { /* 网络错误，忽略 */ });

        return promise;
      };
    }

    // ── 2. XMLHttpRequest hook ────────────────────────────────────────────
    var XHRProto = window.XMLHttpRequest && window.XMLHttpRequest.prototype;
    if (XHRProto && typeof XHRProto.open === 'function' && typeof XHRProto.send === 'function') {
      var origOpen = XHRProto.open;
      var origSend = XHRProto.send;

      XHRProto.open = function (method, url) {
        try { this.__rb_url = String(url || '').slice(0, 800); } catch (e) {}
        return origOpen.apply(this, arguments);
      };

      XHRProto.send = function () {
        var self = this;
        try {
          self.addEventListener('load', function () {
            try {
              var ct = '';
              try { ct = self.getResponseHeader('content-type') || ''; } catch (e) {}
              if (ct.indexOf('json') === -1) return;
              if (!self.responseText) return;
              var data;
              try { data = JSON.parse(self.responseText); } catch (e) { return; }
              recordResponse(self.__rb_url, data, self.status);
            } catch (e) {}
          });
        } catch (e) {}
        return origSend.apply(this, arguments);
      };
    }

    // 让宿主页面/技能可见这次安装成功（用 console.debug 不打扰用户）
    try { console.debug('[Rich Browser] API hook v2 installed on', location.hostname); } catch (e) {}
  } catch (err) {
    // 顶层 try/catch：hook 失败永远不能让页面崩
    try { window.__hookSource = 'extension-v2-failed:' + (err && err.message || 'unknown'); } catch (e) {}
  }
})();
