/**
 * BrowserAutomator (Hybrid Orchestration Engine)
 * 
 * 这个类将“混合编排”和“浏览器控制”固化为插件的底层基础能力。
 * 任何新的原子化技能（Ozon, 1688, Amazon 等）只需要导入此类，
 * 即可默认继承跨环境的 Tab 管理、DOM 注入、等待加载等能力。
 * 绝不允许在各个业务技能文件里重复手写 chrome.tabs / chrome.scripting API。
 */
export class BrowserAutomator {
  
  /**
   * 创建一个后台或前台标签页
   */
  static async createTab(url, active = false) {
    return await chrome.tabs.create({ url, active });
  }

  /**
   * 导航到新地址
   */
  static async navigate(tabId, url) {
    return await chrome.tabs.update(tabId, { url });
  }

  /**
   * 通用的页面加载等待器
   */
  static waitForLoad(tabId, timeoutMs = 45000, extraDelayMs = 2000) {
    return new Promise((resolve, reject) => {
      const timeout = setTimeout(() => {
        chrome.tabs.onUpdated.removeListener(listener);
        reject(new Error("Page load timeout"));
      }, timeoutMs);
      
      function listener(tid, info) {
        if (tid === tabId && info.status === "complete") {
          chrome.tabs.onUpdated.removeListener(listener);
          clearTimeout(timeout);
          setTimeout(resolve, extraDelayMs);
        }
      }
      chrome.tabs.onUpdated.addListener(listener);
    });
  }

  /**
   * 在目标 Tab 注入并执行代码
   * @param {string} world "MAIN" (共享宿主环境, 可读取原网页 JS 变量) 或 "ISOLATED" (安全沙盒)
   */
  static async execute(tabId, func, args = [], world = "MAIN") {
    const results = await chrome.scripting.executeScript({
      target: { tabId },
      world: world,
      func: func,
      args: args
    });
    return results?.[0]?.result;
  }

  /**
   * 在目标 Tab 注入并立刻执行（通常用于拦截网络请求或覆盖对象）
   */
  static async executeImmediately(tabId, func, args = [], world = "MAIN") {
    const results = await chrome.scripting.executeScript({
      target: { tabId },
      world: world,
      injectImmediately: true,
      func: func,
      args: args
    });
    return results?.[0]?.result;
  }

  /**
   * 安全关闭标签页
   */
  static async closeTab(tabId) {
    if (tabId) {
      try {
        await chrome.tabs.remove(tabId);
      } catch (e) {
        // Tab might already be closed
      }
    }
  }
}
