/**
 * 微信相关工具方法
 * 包含网页授权、JS-SDK功能等
 */

import api from './api.js';

// 微信配置
const WECHAT_CONFIG = {
  appId: '', // 需要配置你的微信公众号AppID
  scope: {
    BASE: 'snsapi_base', // 静默授权，获取openid
    USERINFO: 'snsapi_userinfo' // 用户授权，获取用户信息
  },
  jsApiList: [
    'chooseImage',
    'uploadImage',
    'getLocation',
    'openLocation',
    'hideMenuItems'
  ]
};

/**
 * 微信网页授权相关方法
 */
export const WechatAuth = {
  /**
   * 检查是否在微信浏览器中
   */
  isWechatBrowser() {
    const ua = navigator.userAgent.toLowerCase();
    return ua.includes('micromessenger');
  },

  /**
   * 获取URL参数
   */
  getUrlParam(name) {
    const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
    const r = window.location.search.substr(1).match(reg);
    return r ? decodeURIComponent(r[2]) : null;
  },

  /**
   * 微信网页授权登录
   * @param {string} redirectUri - 授权后重定向的回调地址
   * @param {string} scope - 授权作用域 'snsapi_base' | 'snsapi_userinfo'
   * @param {string} state - 重定向后会带上state参数
   */
  authorize(redirectUri, scope = WECHAT_CONFIG.scope.BASE, state = 'STATE') {
    if (!this.isWechatBrowser()) {
      console.warn('当前不在微信浏览器环境中');
      return false;
    }

    const encodedUri = encodeURIComponent(redirectUri);
    const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${WECHAT_CONFIG.appId}&redirect_uri=${encodedUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`;
    
    window.location.href = authUrl;
    return true;
  },

  /**
   * 处理授权回调，获取code
   */
  handleAuthCallback() {
    const code = this.getUrlParam('code');
    const state = this.getUrlParam('state');
    
    if (code) {
      return { code, state };
    }
    return null;
  },

  /**
   * 通过code获取access_token和用户信息
   * 注意：这个接口需要在后端调用，前端不能直接调用
   * @param {string} code - 授权码
   */
  async getAccessToken(code) {
    try {
      // 这里应该调用你的后端接口，后端再调用微信接口
      const response = await fetch('/api/wechat/auth', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ code })
      });
      
      return await response.json();
    } catch (error) {
      console.error('获取access_token失败:', error);
      throw error;
    }
  }
};

/**
 * 微信JS-SDK相关方法
 */
export const WechatJSSDK = {
  /**
   * 初始化微信JS-SDK
   * @param {Object} config - 配置信息
   * @param {string} config.appId - 公众号的唯一标识
   * @param {number} config.timestamp - 生成签名的时间戳
   * @param {string} config.nonceStr - 生成签名的随机串
   * @param {string} config.signature - 签名
   */
  async init(config) {
    return new Promise((resolve, reject) => {
      if (!window.wx) {
        reject(new Error('微信JS-SDK未加载'));
        return;
      }
      console.log('微信JS-SDK初始化中');
      window.wx.config({
        // debug: config.debug, // 开启调试模式
        debug: false,
        appId: config.appId,
        timestamp: config.timestamp,
        nonceStr: config.nonceStr,
        signature: config.signature,
        jsApiList: config.jsApiList,
        openTagList: ['wx-open-launch-weapp']
      });

      window.wx.ready(() => {
        console.log('微信JS-SDK初始化成功');
        resolve(true);
      });

      window.wx.error((res) => {
        console.error('微信JS-SDK初始化失败:', res);
        reject(new Error('微信JS-SDK初始化失败'));
      });
    });
  },

  /**
   * 获取JS-SDK配置信息
   * 需要后端提供签名等信息
   */
  async getJSSDKConfig() {
    try {
      const local_w_c = localStorage.getItem('w_c')? JSON.parse(localStorage.getItem('w_c')):null;
      const response = local_w_c?{data:local_w_c}:await api.wechatAPI.getWechatAppId();
      return await response.data;
    } catch (error) {
      console.error('获取JS-SDK配置失败:', error);
      throw error;
    }
  }
};

/**
 * 微信图片相关方法
 */
export const WechatImage = {
  /**
   * 选择图片
   * @param {Object} options - 配置选项
   * @param {number} options.count - 最多可以选择的图片张数，默认9
   * @param {Array} options.sizeType - 可以指定是原图还是压缩图，默认二者都有
   * @param {Array} options.sourceType - 可以指定来源是相册还是相机，默认二者都有
   */
  chooseImage(options = {}) {
    return new Promise((resolve, reject) => {
      if (!window.wx) {
        reject(new Error('微信JS-SDK未初始化'));
        return;
      }

      window.wx.chooseImage({
        count: options.count || 9,
        sizeType: options.sizeType || ['original', 'compressed'],
        sourceType: options.sourceType || ['album', 'camera'],
        success: (res) => {
          resolve(res.localIds); // 返回选定照片的本地ID列表
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  },

  /**
   * 上传图片
   * @param {string} localId - 需要上传的图片的本地ID
   * @param {boolean} isShowProgressTips - 是否显示进度提示
   */
  uploadImage(localId, isShowProgressTips = true) {
    return new Promise((resolve, reject) => {
      if (!window.wx) {
        reject(new Error('微信JS-SDK未初始化'));
        return;
      }

      window.wx.uploadImage({
        localId: localId,
        isShowProgressTips: isShowProgressTips ? 1 : 0,
        success: (res) => {
          resolve(res.serverId); // 返回图片的服务器端ID
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  },

  /**
   * 预览图片
   * @param {string} current - 当前显示图片的http链接
   * @param {Array} urls - 需要预览的图片http链接列表
   */
  previewImage(current, urls) {
    if (!window.wx) {
      console.error('微信JS-SDK未初始化');
      return;
    }

    window.wx.previewImage({
      current: current,
      urls: urls
    });
  }
};

/**
 * 微信地理位置相关方法
 */
export const WechatLocation = {
  /**
   * 获取地理位置
   * @param {string} type - 默认为wgs84的gps坐标，如果要返回直接给openLocation用的火星坐标，可传入'gcj02'
   */
  getLocation(type = 'wgs84') {
    return new Promise((resolve, reject) => {
      if (!window.wx) {
        reject(new Error('微信JS-SDK未初始化'));
        return;
      }

      window.wx.getLocation({
        type: type,
        success: (res) => {
          console.log('res',res)
          resolve({
            latitude: res.latitude,
            longitude: res.longitude,
            speed: res.speed,
            accuracy: res.accuracy
          });
        },
        fail: (error) => {
          console.log('error',error)
          reject(error);
        }
      });
    });
  },

  /**
   * 使用微信内置地图查看位置
   * @param {Object} location - 位置信息
   * @param {number} location.latitude - 纬度
   * @param {number} location.longitude - 经度
   * @param {string} location.name - 位置名
   * @param {string} location.address - 地址详情说明
   * @param {number} location.scale - 地图缩放级别
   * @param {string} location.infoUrl - 在查看位置界面底部显示的超链接
   */
  openLocation(location) {
    if (!window.wx) {
      console.error('微信JS-SDK未初始化');
      return;
    }

    window.wx.openLocation({
      latitude: location.latitude,
      longitude: location.longitude,
      name: location.name || '',
      address: location.address || '',
      scale: location.scale || 14,
      infoUrl: location.infoUrl || ''
    });
  }
};

/**
 * 微信扫一扫相关方法
 */
export const WechatScan = {
  /**
   * 调起微信扫一扫接口
   * @param {Object} options - 配置选项
   * @param {number} options.needResult - 默认为0，扫描结果由微信处理，1则直接返回扫描结果
   * @param {Array} options.scanType - 可以指定扫二维码还是一维码，默认二者都有
   */
  scanQRCode(options = {}) {
    return new Promise((resolve, reject) => {
      if (!window.wx) {
        reject(new Error('微信JS-SDK未初始化'));
        return;
      }

      window.wx.scanQRCode({
        needResult: options.needResult || 0,
        scanType: options.scanType || ['qrCode', 'barCode'],
        success: (res) => {
          resolve(res.resultStr);
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  }
};

/**
 * 微信分享相关方法
 */
export const WechatShare = {
  /**
   * 分享给朋友
   * @param {Object} shareData - 分享数据
   * @param {string} shareData.title - 分享标题
   * @param {string} shareData.desc - 分享描述
   * @param {string} shareData.link - 分享链接
   * @param {string} shareData.imgUrl - 分享图标
   */
  shareToFriend(shareData) {
    if (!window.wx) {
      console.error('微信JS-SDK未初始化');
      return;
    }

    window.wx.updateAppMessageShareData({
      title: shareData.title,
      desc: shareData.desc,
      link: shareData.link,
      imgUrl: shareData.imgUrl,
      success: () => {
        console.log('分享给朋友设置成功');
      }
    });
  },

  /**
   * 分享到朋友圈
   * @param {Object} shareData - 分享数据
   * @param {string} shareData.title - 分享标题
   * @param {string} shareData.link - 分享链接
   * @param {string} shareData.imgUrl - 分享图标
   */
  shareToTimeline(shareData) {
    if (!window.wx) {
      console.error('微信JS-SDK未初始化');
      return;
    }

    window.wx.updateTimelineShareData({
      title: shareData.title,
      link: shareData.link,
      imgUrl: shareData.imgUrl,
      success: () => {
        console.log('分享到朋友圈设置成功');
      }
    });
  },

  hideAllNonBaseMenuItem(){
    if (!window.wx) {
      console.error('微信JS-SDK未初始化');
      return;
    }
    console.log('隐藏分享菜单');
    window.wx.hideAllNonBaseMenuItem();
  }

};

/**
 * 微信工具类 - 统一入口
 */
export default class WechatUtils {
  constructor(appId) {
    WECHAT_CONFIG.appId = appId;
    this.auth = WechatAuth;
    this.jsSDK = WechatJSSDK;
    this.image = WechatImage;
    this.location = WechatLocation;
    this.scan = WechatScan;
    this.share = WechatShare;
  }

  /**
   * 初始化微信功能
   * @param {string} appId - 微信公众号AppID
   */
  static async init(appId) {
    const wechat = new WechatUtils(appId);
    
    // 如果在微信浏览器中，自动初始化JS-SDK
    if (WechatAuth.isWechatBrowser()) {
      try {
        localStorage.removeItem('w_c');
        const config = await WechatJSSDK.getJSSDKConfig();
        console.log('微信JS-SDK配置:', config);
        await WechatJSSDK.init(config);
        console.log('微信工具初始化成功');
      } catch (error) {
        console.error('微信JS-SDK初始化失败:', error);
      }
    }
    
    return wechat;
  }
}