/**
 * 现代化系统信息工具类
 * 使用新的API替代已弃用的wx.getSystemInfoSync
 */

class ModernSystemInfo {
  constructor() {
    this.systemInfo = null;
    this.isInitialized = false;
  }

  /**
   * 获取完整的系统信息（推荐使用）
   */
  getSystemInfo() {
    try {
      // 使用新的API获取系统信息
      const windowInfo = wx.getWindowInfo();
      const deviceInfo = wx.getDeviceInfo();
      const appBaseInfo = wx.getAppBaseInfo();

      // 合并所有信息
      const systemInfo = {
        ...windowInfo,
        ...deviceInfo,
        ...appBaseInfo,
        // 添加一些常用的计算属性
        isIOS: deviceInfo.platform === 'ios',
        isAndroid: deviceInfo.platform === 'android',
        isDevtools: deviceInfo.platform === 'devtools'
      };

      this.systemInfo = systemInfo;
      this.isInitialized = true;

      return systemInfo;

    } catch (error) {
      console.error('获取系统信息失败，使用兜底方案:', error);
      return this.getFallbackSystemInfo();
    }
  }

  /**
   * 兜底方案：使用旧API
   */
  getFallbackSystemInfo() {
    try {
      const systemInfo = wx.getSystemInfoSync();
      this.systemInfo = {
        ...systemInfo,
        isIOS: systemInfo.platform === 'ios',
        isAndroid: systemInfo.platform === 'android',
        isDevtools: systemInfo.platform === 'devtools'
      };
      this.isInitialized = true;
      return this.systemInfo;
    } catch (error) {
      console.error('兜底方案也失败了:', error);
      // 返回默认值
      return {
        statusBarHeight: 44,
        windowHeight: 667,
        windowWidth: 375,
        screenHeight: 667,
        screenWidth: 375,
        platform: 'unknown',
        system: 'unknown',
        version: 'unknown',
        isIOS: false,
        isAndroid: false,
        isDevtools: false
      };
    }
  }

  /**
   * 获取导航栏相关信息
   */
  getNavigationInfo() {
    try {
      const systemInfo = this.systemInfo || this.getSystemInfo();
      const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

      const statusBarHeight = systemInfo.statusBarHeight;
      const menuButtonHeight = menuButtonInfo.height;
      const menuButtonTop = menuButtonInfo.top;
      const menuButtonBottom = menuButtonInfo.bottom;

      // 导航栏高度计算
      const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;

      return {
        statusBarHeight,
        menuButtonHeight,
        menuButtonTop,
        menuButtonBottom,
        navBarHeight,
        menuButtonInfo
      };
    } catch (error) {
      console.error('获取导航栏信息失败:', error);
      return {
        statusBarHeight: 44,
        menuButtonHeight: 32,
        menuButtonTop: 6,
        menuButtonBottom: 38,
        navBarHeight: 88,
        menuButtonInfo: {}
      };
    }
  }

  /**
   * 获取安全区域信息
   */
  getSafeAreaInfo() {
    try {
      const systemInfo = this.systemInfo || this.getSystemInfo();
      const safeArea = systemInfo.safeArea || {};

      return {
        safeAreaTop: safeArea.top || 0,
        safeAreaBottom: systemInfo.screenHeight ? systemInfo.screenHeight - safeArea.bottom : 0,
        safeAreaLeft: safeArea.left || 0,
        safeAreaRight: systemInfo.screenWidth ? systemInfo.screenWidth - safeArea.right : 0,
        safeArea: safeArea
      };
    } catch (error) {
      console.error('获取安全区域信息失败:', error);
      return {
        safeAreaTop: 0,
        safeAreaBottom: 0,
        safeAreaLeft: 0,
        safeAreaRight: 0,
        safeArea: {}
      };
    }
  }

  /**
   * 一次性获取页面所需的所有系统信息
   */
  getPageSystemInfo() {
    const systemInfo = this.getSystemInfo();
    const navigationInfo = this.getNavigationInfo();
    const safeAreaInfo = this.getSafeAreaInfo();

    return {
      ...systemInfo,
      ...navigationInfo,
      ...safeAreaInfo
    };
  }
}

// 创建单例实例
const modernSystemInfo = new ModernSystemInfo();

/**
 * 简化的页面系统信息初始化函数
 * 用于快速替换页面中的 wx.getSystemInfoSync() 调用
 */
function initPageSystemInfo() {
  try {
    const windowInfo = wx.getWindowInfo();
    const deviceInfo = wx.getDeviceInfo();
    const appBaseInfo = wx.getAppBaseInfo();
    const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

    // 合并系统信息
    const systemInfo = {
      ...windowInfo,
      ...deviceInfo,
      ...appBaseInfo
    };

    // 计算导航栏相关信息
    const statusBarHeight = windowInfo.statusBarHeight;
    const menuButtonHeight = menuButtonInfo.height;
    const menuButtonTop = menuButtonInfo.top;
    const menuButtonBottom = menuButtonInfo.bottom;
    const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;
    const windowHeight = windowInfo.windowHeight;
    const safeAreaBottom = windowInfo.safeArea ? windowInfo.screenHeight - windowInfo.safeArea.bottom : 0;

    return {
      systemInfo,
      statusBarHeight,
      menuButtonHeight,
      menuButtonTop,
      navBarHeight,
      windowHeight,
      safeAreaBottom,
      menuButtonInfo
    };
  } catch (error) {
    console.error('现代API获取系统信息失败，使用兜底方案:', error);
    // 兜底方案
    try {
      const systemInfo = wx.getSystemInfoSync();
      const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

      const statusBarHeight = systemInfo.statusBarHeight;
      const menuButtonHeight = menuButtonInfo.height;
      const menuButtonTop = menuButtonInfo.top;
      const menuButtonBottom = menuButtonInfo.bottom;
      const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;
      const windowHeight = systemInfo.windowHeight;
      const safeAreaBottom = systemInfo.safeArea ? systemInfo.screenHeight - systemInfo.safeArea.bottom : 0;

      return {
        systemInfo,
        statusBarHeight,
        menuButtonHeight,
        menuButtonTop,
        navBarHeight,
        windowHeight,
        safeAreaBottom,
        menuButtonInfo
      };
    } catch (fallbackError) {
      console.error('兜底方案也失败了:', fallbackError);
      return {
        systemInfo: {},
        statusBarHeight: 44,
        menuButtonHeight: 32,
        menuButtonTop: 6,
        navBarHeight: 88,
        windowHeight: 667,
        safeAreaBottom: 0,
        menuButtonInfo: {}
      };
    }
  }
}

module.exports = {
  modernSystemInfo,
  initPageSystemInfo
};
