/**
 * 定位服务检测工具
 * 功能：检测用户是否开启定位权限/服务
 * 支持平台：APP（Android/iOS）、微信小程序、H5
 */

export default {
  /**
   * 检查定位服务是否可用
   * @returns {Promise<boolean>} 返回Promise，true表示定位可用
   */
  isLocationEnabled() {
    return new Promise((resolve, reject) => {
      // APP端处理
      // #ifdef APP-PLUS
      this._checkAppLocation().then(resolve).catch(reject);
      // #endif
      
      // 微信小程序处理
      // #ifdef MP-WEIXIN
      this._checkWxLocation().then(resolve).catch(reject);
      // #endif
      
      // H5处理
      // #ifdef H5
      this._checkH5Location().then(resolve).catch(reject);
	  // resolve(false);
      // #endif
      
      // 默认处理（非上述平台）
      // #ifndef APP-PLUS || MP-WEIXIN || H5
      resolve(false);
      console.warn('当前平台不支持定位检测');
      // #endif
    });
  },
  
  /**
   * APP端检测定位
   * @private
   */
  _checkAppLocation() {
    return new Promise((resolve) => {
      plus.geolocation.getCurrentPosition(
        () => resolve(true),
        (err) => {
          // 错误码参考：https://www.html5plus.org/doc/zh_cn/geolocation.html#plus.geolocation.GeolocationError
		  console.log(err,"---------------------")
          if (err.code === 2 || err.code === 12) {
            resolve(false); // 权限被拒绝或定位服务未开启
          }else {
            resolve(false); // 其他错误也视为不可用
          }
        },
        { provider: 'system', enableHighAccuracy: false }
      );
    });
  },
  
  /**
   * 微信小程序检测定位
   * @private
   */
  _checkWxLocation() {
    return new Promise((resolve) => {
      wx.getSetting({
        success(res) {
          const authSetting = res.authSetting || {};
          // undefined表示尚未询问过权限，也视为可用
          resolve(authSetting['scope.userLocation'] !== false);
        },
        fail() {
          resolve(false);
        }
      });
    });
  },
  
  /**
   * H5端检测定位
   * @private
   */
  _checkH5Location() {
    return new Promise((resolve) => {
      // 现代浏览器 Permissions API
      if (navigator.permissions && navigator.permissions.query) {
        navigator.permissions.query({ name: 'geolocation' })
          .then(permissionStatus => {
            resolve(permissionStatus.state !== 'denied');
          })
          .catch(() => {
            resolve('geolocation' in navigator);
          });
      } 
      // 传统浏览器检测
      else {
        resolve('geolocation' in navigator);
      }
    });
  },
  
  /**
   * 请求定位权限
   * @returns {Promise<boolean>} 返回是否成功获取权限
   */
  requestLocationPermission() {
    return new Promise((resolve) => {
      uni.authorize({
        scope: 'scope.userLocation',
        success: () => resolve(true),
        fail: () => resolve(false)
      });
    });
  },
  
  /**
   * 打开系统定位设置页面
   */
  openSystemLocationSetting() {
    // APP端
    // #ifdef APP-PLUS
    if (plus.os.name === 'Android') {
      const Intent = plus.android.importClass('android.content.Intent');
      const Settings = plus.android.importClass('android.provider.Settings');
      const main = plus.android.runtimeMainActivity();
      const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
      main.startActivity(intent);
    } else if (plus.os.name === 'iOS') {
      const UIApplication = plus.ios.importClass('UIApplication');
      const NSURL = plus.ios.importClass('NSURL');
      const url = NSURL.URLWithString('App-Prefs:root=Privacy&path=LOCATION');
      const sharedApplication = UIApplication.sharedApplication();
      plus.ios.invoke(sharedApplication, 'openURL:', url);
    }
    // #endif
    
    // 微信小程序
    // #ifdef MP-WEIXIN
    wx.openSetting();
    // #endif
    
    // H5无法直接打开系统设置
    // #ifdef H5
    console.warn('H5端无法直接打开系统定位设置');
    // #endif
  },
  /**
   * 跳转到当前应用的系统设置页面
   */
  openAppSettings() {
    // APP端处理
    // #ifdef APP-PLUS
    if (plus.os.name === 'Android') {
      const Intent = plus.android.importClass('android.content.Intent');
      const Settings = plus.android.importClass('android.provider.Settings');
      const Uri = plus.android.importClass('android.net.Uri');
      const main = plus.android.runtimeMainActivity();
      
      const intent = new Intent();
      intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
      const uri = Uri.fromParts("package", main.getPackageName(), null);
      intent.setData(uri);
      main.startActivity(intent);
    } 
    else if (plus.os.name === 'iOS') {
      var app = plus.ios.invoke('UIApplication', 'sharedApplication');
      var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
      plus.ios.invoke(app, 'openURL:options:completionHandler:', setting);
      plus.ios.deleteObject(setting);
      plus.ios.deleteObject(app);
    }
    // #endif
    
    // 微信小程序处理
    // #ifdef MP-WEIXIN
    wx.openSetting({
      success(res) {
        console.log('已打开小程序设置页面');
      }
    });
    // #endif
    
    // H5处理
    // #ifdef H5
    console.warn('H5端无法直接打开应用设置');
    alert('请在浏览器设置中修改权限');
    // #endif
  },
  /**
   * 获取当前位置（封装了权限检测）
   * @param {Object} options 同uni.getLocation参数
   * @returns {Promise<Object>} 返回位置信息
   */
  async getCurrentPosition(options = {}) {
    const isEnabled = await this.isLocationEnabled();
    if (!isEnabled) {
	 //  uni.showModal({
	 //  	title: '提示',
	 //  	content: '您的系统位置权限未开启，无法为您提供服务。',
		// success: (res)=> {
		// 	if (res.confirm) {
		// 		this.openSystemLocationSetting()
		// 	} else if (res.cancel) {
				
		// 	}
		// }
	 //  })
	  return isEnabled;
      throw new Error('定位服务未开启或没有权限');
    }
    return isEnabled;
  //   return new Promise((resolve, reject) => {
  //     uni.getLocation({
		// type: 'gcj02',
		// geocode: true,
  //       ...options,
  //       success: resolve,
  //       fail: reject
  //     });
  //   });
  }
};