import { createAxiosByinterceptors } from '@/api/request';
import Stomp from "@/lib/stompjs";
import { Decrypt,Encrypt } from "@/utils/crypto";
import SockJS from "@/utils/sockjs";
import qs from 'qs';
import { lbsDictionary } from '@/common/js/BaseDictionary';
import uni from './uniHooks';

export function getMobileOperatingSystem() {
  // #ifdef H5
  const userAgent = navigator.userAgent || navigator.vendor || window.opera;

  // Windows Phone must come first because its UA also contains "Android"
  if ( /windows phone/i.test(userAgent) ) {
    return 'Windows Phone';
  }

  if ( /android/i.test(userAgent) ) {
    return 'Android';
  }

  // iOS detection from: http://stackoverflow.com/a/9039885/177710
  if ( /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream ) {
    return 'iOS';
  }

  return 'unknown';
  // #endif

  // #ifndef H5
  return 'unknown';
  // #endif
}

export function getQueryParam() {
  // let query: Record<string, string> = {};
  let query = {};
  query = location.search
    .slice(1)
    .split('&')
    .map(( p ) => p.split('='))
    // .reduce((obj: Record<string, string>, pair) => {
    .reduce(( obj,pair ) => {
      const [key,value] = pair.map(decodeURIComponent);
      obj[key] = value;
      return obj;
    },{});
  return query;
}

//
export function isInWeixinH5() {
  // TODO: 发布前取消注释
  return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1;
  // return true;
}

// 判断当前运行平台
export function getPlatform() {
  const userAgent = navigator.userAgent.toLowerCase();
  // 微信小程序
  if ( /miniprogram/g.test(userAgent) ) {
    return 'miniprogram';
  }
  // 微信公众号
  if ( /micromessenger/g.test(userAgent) ) {
    return 'micromessenger';
  }
  return 'miniprogram'; // TODO: 上线前改为其他
}

// 是否是支付宝
export function isAlipay() {
  const userAgent = navigator.userAgent.toLowerCase();
  return /alipayclient/g.test(userAgent)
}
// 是否在微信小程序中运行
export function getIsMin() {
  const platform = getPlatform();
  return platform === 'miniprogram';
}

// 是否在微信公众号中运行
export function getIsWxh5() {
  const platform = getPlatform();
  return platform === 'micromessenger';
}


// 获取appid
export function getAppIdByGroupIdAndMallId( {groupId,mallId,type} ) {
  const platform = getPlatform();
  if ( platform === 'miniprogram' ) {
    return 'wx92c3e55fbef6b2af';
  }
  if ( platform === 'micromessenger' ) {
    // 后期在其他公众号上线H5应用，appid需要根据地址栏的 project 动态处理, 已预留入口
    // console.log(89);
    const env = window.env === 'qa' ? 'qa' : 'prod';
    let appInfo = {};
    Object.keys(lbsDictionary).forEach(( lbsId ) => {
      const elm = lbsDictionary[lbsId];
      // console.log(92, env, elm[env].groupId, groupId, elm[env].mallId, mallId);
      if ( elm[env].groupId === groupId && elm[env].mallId === mallId ) {
        appInfo = {
          appid: elm[env].appid,
          // secret: elm[env].secret,
          projectId: elm[env].projectId,
        };
      }
    });
    // console.log(101, appInfo);
    if ( JSON.stringify(appInfo) === '{}' ) {
      // groupId, mallId 错误
      return;
    }
    if ( type === 'appid' ) {
      return appInfo.appid;
    }
    if ( type === 'all' ) {
      return appInfo;
    }
    return 'wx907c27f16841a919';
  }
  return '';
}

export function getUrlParams( url = window.location.href ) {
  const str = `${ url }`.split('?')[1];
  if ( !str ) return {};
  return qs.parse(str);
}

// 根据不同环境和lsbid返回 groupId 和 mallId
export function getGroupIdAndMallIdByLsbId( lbsId ) {
  console.log(125,lbsId);
  const lbsObj = lbsDictionary[lbsId];
  if ( window.env === 'prod' ) {
    return lbsObj['prod'];
  }
  if ( window.env === 'dev' ) {
    return lbsObj['dev'];
  }
  return lbsObj['qa'];
}

// 微信小程序端登录之后的回调
export function wxToLoginCallback( path,callback ) {
  const oldPath = uni.getStorageSync('oldPath');
  // 如果是在微信小程序内部运行的话
  if ( getIsMin() && oldPath !== path ) {
    uni.setStorageSync('oldPath',path);
    // 前往登录
    window.toWXSendMsg({
      type: 'toLogin',
      options: {
        path: path,
      },
    });
    window.subscribe('callback',( options ) => {
      console.log('登录页面的回调',JSON.stringify(options));
      if ( options.isReload ) {
        console.log('刷新页面');
        window.location.reload();
      } else {
        console.log('刷新页面:callback');
        callback && callback(options);
        uni.setStorageSync('oldPath','');
      }
    });
    return;
  }
  // 如果是在微信公众号环境运行的话
  /*if ( getIsWxh5() ) {
   return
   }*/
}

export function initEnv() {
  const href = window.location.href;
  console.log('当前页面的url地址  ',href);
  if ( /dev-|808[0-9]/.test(href) ) {
    window.env = 'qa';
    window.profileApi = 'https://qa-apim.kerryplus.com/c/api';
    window.cmrApi = 'https://qa-crm.kerryplus.com/xcrm-api/api';
    window.api = 'qaApi';
    // window.env = 'dev';
    // window.profileApi = 'https://dev-gateway-kip.kerryonvip.com/api';
    // window.cmrApi = 'https://dev-crm.kerryplus.com/xcrm-api/api';
    // window.api = 'devApi';
    // window.env = 'prod';
    // window.profileApi = 'https://sl-apim.kerryplus.com/c/api';
    // window.cmrApi = 'https://sl-crm.kerryplus.com/xcrm-api/api';
    // window.api = 'api';
    return;
  }
  if ( /qa-/.test(href) ) {
    window.env = 'qa';
    window.api = 'qaApi';
    window.profileApi = 'https://qa-apim.kerryplus.com/c/api';
    window.cmrApi = 'https://qa-crm.kerryplus.com/xcrm-api/api';
    return;
  }
  if ( /sl-/.test(href) ) {
    window.env = 'prod';
    window.profileApi = 'https://sl-apim.kerryplus.com/c/api';
    window.cmrApi = 'https://sl-crm.kerryplus.com/xcrm-api/api';
    window.api = 'api';
    return;
  }
  window.env = 'prod';
  window.profileApi = 'https://apim.kerryplus.com/c/api';
  window.cmrApi = 'https://crm.kerryplus.com/xcrm-api/api';
  window.api = 'api';
}

export function requestInit() {
  let baseURL = window.profileApi + '/temporary-parking/v1';
  if (window.location.href.indexOf('parking.') < 0) {
    // baseURL = '/msApi';
  }
  window.requestms = createAxiosByinterceptors({
    // baseURL: `https://dev-kip-service-internal.kerryonvip.com/`,
    // baseURL: `http://tp.hht.test/`,
    // baseURL: window.profileApi, // TODO: 微服务发布到DEV环境之后取消注释
    baseURL,
    // baseURL: `/msApi`,
  });
}

// websocket 链接
export function getUrl() {
  return `https://crm.kerryplus.com/xcrm-api`; // TODO: 临时更改websocket域名为prod
  // 如果 kerry+ 这边的访问环境是 sl 或者 lt，需要把 wss 指向 qa 环境。
  const href = `${ window.location.href }`;
  if ( /dev-|8080/.test(href) ) {
    return 'https://qa-crm-kpl.kerryprops.com.cn/xcrm-api';
  }
  if ( /qa-/.test(href) ) {
    return 'https://qa-crm-kpl.kerryprops.com.cn/xcrm-api';
  }
  // return 'https://qa-crm-kpl.kerryprops.com.cn/xcrm-api';
  return `https://crm.kerryplus.com/xcrm-api`;
}

export function windowSendInit() {
  const token = window.token;
  window.toWXSendMsg = function ( {type = '',funcName = '',options = {}} ) {
    /**
     * 向小程序端发送消息
     */
    if ( !type ) return;
    window.stompClient.send(
      '/sendToWechat',
      {},
      JSON.stringify({
        token,
        data: Encrypt(
          JSON.stringify({
            type: type,
            funcName,
            options,
          })
        ),
      })
    );
  };

  // 主动订阅事件回调
  window.subscribe = function ( type,callback ) {
    const subscribeId = window.stompClient.subscribe('/user/' + token + '/toH5',function ( response ) {
      try {
        let res = {
          token: '', // 微信小程序端 页面的传递过来的token
          data: '', // 微信小程序端 页面的传递过来的信息（已加密）
        };
        if ( response.body ) {
          res = JSON.parse(response.body);
        }
        // 检查 微信小程序端 发送过来的信息和token是否与当前页面的 token一致。并且 res.data 携带信息，在解密之后是 json 格式
        if ( res.token && res.token === token && res.data ) {
          const msgJson = JSON.parse(Decrypt(res.data));
          const reg = new RegExp(type);
          // 获取 projectId
          if ( reg.test(msgJson.type) ) {
            callback(msgJson.options,subscribeId);
            subscribeId.unsubscribe();
            return;
          }
        }
      } catch ( err ) {
        console.log('stomp error',err);
      }
    });
  };
}


export function wssInit() {
  return new Promise(( resolve,reject ) => {
    try {
      const socket = new SockJS(`${ getUrl() }/hafengWebsocket?token=${ window.token }`);
      window.stompClient = Stomp.over(socket);
      window.stompClient.debug = null;
      windowSendInit();
      window.stompClient.connect({},( frame ) => {
        // 请求 projectId
        window.toWXSendMsg({
          type: 'getProjectId',
          options: {},
        });
        window.subscribe('projectId',( options ) => {
          resolve(options);
        });
      });
    } catch ( err ) {
      reject(err);
    }
  });
}
