/**
 * Browser Manager - AdsPower 指纹浏览器管理器
 * 统一管理浏览器的启动、连接、关闭等操作
 */

const puppeteer = require('puppeteer');
const axios = require('axios');
const logger = require('../../logger');

class BrowserManager {
  constructor(options = {}) {
    this.profileId = options.profileId || process.env.ADSPOWER_USER_ID;
    this.apiBase = options.apiBase || process.env.ADSPOWER_API || 'http://local.adspower.net:50325';
    this.apiKey = options.apiKey || process.env.ADSPOWER_API_KEY;
    this.siteName = options.siteName || 'Browser';
    
    this.browser = null;
    this.page = null;
  }
  
  /**
   * 启动 AdsPower 浏览器
   */
  async launch() {
    logger.info(this.siteName, '启动 AdsPower 指纹浏览器...');
    
    // 检查配置
    if (!this.profileId) {
      logger.error(this.siteName, '');
      logger.error(this.siteName, '❌ 未配置 ADSPOWER_USER_ID');
      logger.error(this.siteName, '');
      logger.error(this.siteName, '请在 .env 文件中配置或传入 profileId：');
      logger.error(this.siteName, 'ADSPOWER_USER_ID=your_profile_id');
      logger.error(this.siteName, '');
      throw new Error('未配置 AdsPower 用户ID');
    }
    
    const startUrl = `${this.apiBase}/api/v1/browser/start?user_id=${encodeURIComponent(this.profileId)}`;
    
    // 配置请求头
    const headers = {};
    if (this.apiKey && this.apiKey.trim()) {
      headers['Authorization'] = `Bearer ${this.apiKey}`;
      logger.info(this.siteName, '✓ 使用 API Key 认证');
    }
    
    logger.info(this.siteName, `  → 启动 AdsPower 配置: ${this.profileId}`);
    
    try {
      const response = await axios.get(startUrl, { headers });
      const data = response.data;
      
      if (data.code !== 0) {
        logger.error(this.siteName, '');
        logger.error(this.siteName, `AdsPower API 返回错误: ${JSON.stringify(data)}`);
        logger.error(this.siteName, '');
        logger.error(this.siteName, '解决方案：');
        logger.error(this.siteName, '1. 确保 AdsPower 应用已启动并登录');
        logger.error(this.siteName, `2. 检查配置文件 ID 是否正确: ${this.profileId}`);
        logger.error(this.siteName, '3. 如果需要 API Key，请在 AdsPower 设置中生成');
        logger.error(this.siteName, '4. 尝试在 AdsPower 中手动打开一次浏览器配置');
        logger.error(this.siteName, '');
        throw new Error(`AdsPower 启动失败: ${data.msg || JSON.stringify(data)}`);
      }
      
      // 获取 WebSocket 端点
      const wsEndpoint = data.data.ws && (
        data.data.ws.puppeteer || 
        data.data.ws.selenium || 
        data.data.ws.ws || 
        data.data.ws
      );
      
      if (!wsEndpoint) {
        throw new Error('AdsPower 未返回 WebSocket 端点');
      }
      
      logger.info(this.siteName, `  → WebSocket: ${wsEndpoint}`);
      
      // 连接到 AdsPower 浏览器
      this.browser = await puppeteer.connect({
        browserWSEndpoint: wsEndpoint,
        defaultViewport: null
      });
      
      // 获取已存在的页面
      const pages = await this.browser.pages();
      this.page = pages[0] || await this.browser.newPage();
      
      // 关闭多余的标签页
      if (pages.length > 1) {
        for (let i = 1; i < pages.length; i++) {
          try {
            await pages[i].close();
          } catch (e) {
            // 忽略关闭失败
          }
        }
      }
      
      logger.success(this.siteName, '✓ AdsPower 浏览器连接成功');
      logger.info(this.siteName, '✓ 使用真实指纹，可同时绕过 Cloudflare 和 Stripe');
      
      return { browser: this.browser, page: this.page };
      
    } catch (error) {
      logger.error(this.siteName, '');
      logger.error(this.siteName, `❌ AdsPower 连接失败: ${error.message}`);
      logger.error(this.siteName, '');
      throw error;
    }
  }
  
  /**
   * 获取当前页面
   */
  getPage() {
    if (!this.page) {
      throw new Error('浏览器页面未初始化，请先调用 launch()');
    }
    return this.page;
  }
  
  /**
   * 获取浏览器实例
   */
  getBrowser() {
    if (!this.browser) {
      throw new Error('浏览器未初始化，请先调用 launch()');
    }
    return this.browser;
  }
  
  /**
   * 清除浏览器数据
   */
  async clearData() {
    if (!this.page) {
      logger.warn(this.siteName, '页面未初始化，跳过清除数据');
      return;
    }
    
    logger.info(this.siteName, '  → 清除所有浏览器数据（Cookies、Cache、Storage等）...');
    
    try {
      const client = await this.page.target().createCDPSession();
      
      // 1. 清除浏览器 Cookies
      await client.send('Network.clearBrowserCookies');
      logger.success(this.siteName, '  → ✓ 已清除所有 Cookies');
      
      // 2. 清除浏览器缓存
      await client.send('Network.clearBrowserCache');
      logger.success(this.siteName, '  → ✓ 已清除浏览器缓存');
      
      // 3. 清除所有存储数据
      await client.send('Storage.clearDataForOrigin', {
        origin: '*',
        storageTypes: 'all'
      });
      logger.success(this.siteName, '  → ✓ 已清除所有存储数据');
      
      // 4. 额外清理：访问目标网站并清除其存储
      const currentUrl = this.page.url();
      if (currentUrl && currentUrl.startsWith('http')) {
        await this.page.evaluate(() => {
          try {
            localStorage.clear();
            sessionStorage.clear();
          } catch (e) {}
        });
      }
      
      // 5. 关闭 CDP 会话
      await client.detach();
      
      logger.success(this.siteName, '  → ✓ 浏览器数据清除完成（全新状态）');
      
    } catch (e) {
      logger.warn(this.siteName, `  → 清除浏览器数据失败: ${e.message}`);
    }
  }
  
  /**
   * 关闭浏览器
   */
  async close() {
    if (!this.browser) {
      logger.warn(this.siteName, '浏览器未初始化，无需关闭');
      return;
    }
    
    try {
      logger.info(this.siteName, '  → 关闭浏览器...');
      
      // 1. 先关闭所有页面/标签页
      try {
        const pages = await this.browser.pages();
        logger.info(this.siteName, `  → 关闭所有标签页 (共 ${pages.length} 个)...`);
        
        for (const page of pages) {
          try {
            await page.close();
            logger.info(this.siteName, `  → ✓ 已关闭一个标签页`);
          } catch (e) {
            logger.warn(this.siteName, `  → 关闭标签页失败: ${e.message}`);
          }
        }
      } catch (e) {
        logger.warn(this.siteName, `  → 获取页面列表失败: ${e.message}`);
      }
      
      // 2. 断开 Puppeteer 连接
      await this.browser.disconnect();
      logger.success(this.siteName, '  → ✓ Puppeteer 连接已断开');
      
      // 3. 调用 AdsPower API 停止浏览器进程
      if (this.profileId) {
        const stopUrl = `${this.apiBase}/api/v1/browser/stop?user_id=${encodeURIComponent(this.profileId)}`;
        
        const headers = {};
        if (this.apiKey && this.apiKey.trim()) {
          headers['Authorization'] = `Bearer ${this.apiKey}`;
        }
        
        logger.info(this.siteName, `  → 调用 AdsPower API 停止浏览器进程...`);
        
        try {
          const response = await axios.get(stopUrl, { headers });
          const data = response.data;
          
          if (data.code === 0) {
            logger.success(this.siteName, '  → ✓ AdsPower 浏览器进程已停止');
          } else {
            logger.warn(this.siteName, `  → AdsPower stop API 返回: ${data.msg || JSON.stringify(data)}`);
          }
        } catch (e) {
          logger.warn(this.siteName, `  → 调用 AdsPower stop API 失败: ${e.message}`);
          logger.info(this.siteName, '  → 浏览器可能已经关闭，或需要手动关闭');
        }
      }
      
      this.browser = null;
      this.page = null;
      logger.success(this.siteName, '  → ✓ 浏览器完全关闭');
      
    } catch (error) {
      logger.error(this.siteName, `关闭浏览器失败: ${error.message}`);
      throw error;
    }
  }
  
  /**
   * 清除数据并关闭浏览器
   */
  async clearAndClose() {
    await this.clearData();
    await this.close();
  }
}

module.exports = BrowserManager;
