/**
 * YOHO-SDK
 *
 * 与原生 APP 交互的代码
 * 所有函数要做降级处理
 * 假如不是 YOHO App,在浏览器实现对应的功能
 * 浏览器不支持的功能,给出提示,控制台不能报错,不影响后续代码执行
 *
 * 希望能与 微信 JS-SDK 一样方便
 */

/* 空方法 */
const nullFun = () => {};

let isYohoBuy = /YohoBuy/i.test(navigator.userAgent || '');
let $appLink = document.querySelector('#yoho-app-link');

if (isYohoBuy && !$appLink) {
  let body = document.querySelector('body');

  $appLink = document.createElement('a');
  $appLink.id = 'yoho-app-link';
  $appLink.href = 'javascript:;';
  $appLink.style.display = 'none';
  $appLink.className = 'no-intercept';

  body.appendChild($appLink);

  $appLink.onclick = (evt) => {
    evt.stopPropagation();
  };
}

const yoho = {
  /**
     * 判断是否是 APP
     */
  isApp: /YohoBuy/i.test(navigator.userAgent || '') || /YohoBuy/i.test(navigator.userAgent || ''),
  isiOS: /\(i[^;]+;( U;)? CPU.+Mac OS X/i.test(navigator.userAgent || ''),
  isAndroid: /Android/i.test(navigator.userAgent || ''),
  isYohoBuy: isYohoBuy,

  /**
     * JS 与 APP 共享的对象
     */
  data: window.yohoInterfaceData,


  ready(callback) {
    if (this.isApp || this.isYohoBuy) {
      document.addEventListener('deviceready', callback);
    } else {
      return callback();
    }
  },

  /**
     * 跳转至指定index的tab(从0开始)
     * @param args 传递给 APP 的参数 {"index":tab_index}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goTab(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      args.showScrollbar = 'no';
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.tab',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转至登录页面
     * @param args 传递给 APP 的参数 {""}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goLogin(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.login',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 获取app版本号
     * @param args {""}
     * @param success
     * @param fail
     */
  getAppVersion(args, success, fail) {
    if (window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'get.appversion',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 退出登录,清除本地用户数据
     * @param args {""}
     * @param success
     * @param fail
     */
  goLogout(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.loginout',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 设置shoppingkey
     * @param args 传递给 APP 的参数 {"shoppingkey":""}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goShopingKey(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.shoppingkey',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转至购物车页面
     * @param args 传递给 APP 的参数 {""}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goShopingCart(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.shopingCart',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转地址页面 1:地址选择页面 2:地址管理页面
     * @param args 传递给 APP 的参数 {"type":"1"}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goAddress(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.address',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转至图片浏览页面;images:浏览图片的url index:点击的图片序号
     * @param args 传递给 APP 的参数 {"images":[imgUrl1,imgUrl2...],"index":"1"}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goImageBrowser(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.imageBrowser',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转至新页面(页面内容为html)
     * @param args 传递给 APP 的参数 {"url":""}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goNewPage(args) {
    if (this.isYohoBuy) {

      let url = args.url;

      if (url.indexOf('openby:') < 0) {
        delete args.url;
        if (args.header && args.header.headerid !== void 0) {
          args.headerid = args.header.headerid;
          delete args.header;
        }
        url += (url.indexOf('?') >= 0 ? '&' : '?') + 'openby:yohobuy=' + JSON.stringify({
          action: 'go.h5',
          params: {
            islogin: 'N',
            type: 0,
            updateflag: Date.now() + '',
            url: url,
            param: args
          }
        });
      }

      $appLink.href = url;
      $appLink.click();
      if (this.isiOS) {
        $appLink.click();
      }
    } else {
      if (args.url) {
        window.open(args.url);
      }
    }
  },

  /**
     * 跳转至支付页面
     * @param args 传递给 APP 的参数 {"orderid":"098768"}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
  goPay(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.pay',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 返回上一级页面
     * @param args {""}
     * @param success
     * @param fail
     */
  goBack(args, success, fail) {
    if ((this.isApp || this.isYohoBuy) && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.back',
        arguments: args
      });
    } else {
      history.go(-1);
    }
  },

  /**
     * 新的返回上一级页面
     * @param args {""}
     * @param success
     * @param fail
     */
  goNewBack(args, success, fail) {
    if (this.isYohoBuy && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.newback',
        arguments: args
      });
    } else {
      history.go(-1);
    }
  },

  /**
     * 联系电话
     * @param args {""}
     * @param success
     * @param fail
     */
  goTel(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.tel',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 获取频道
     * @param args {""}
     * @param success
     * @param fail
     */
  getChannel(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'get.channel',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 设置频道
     * @param args {""}
     * @param success
     * @param fail
     */
  setChannel(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'set.channel',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 频道跳转
     * @param args {""}
     * @param success
     * @param fail
     */
  goChannel(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.channel',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 分享
     * @param args {"title":"标题","des":"描述","img":"icon地址","url":"网页地址"}
     * @param success
     * @param fail
     */
  goShare(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.share',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转到搜索页面
     * @param args {""}
     * @param success
     * @param fail
     */
  goSearch(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.search',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转到设置页面
     * @param args {""}
     * @param success
     * @param fail
     */
  goSetting(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.setting',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转到设置头像
     * @param args {""}
     * @param success
     * @param fail
     */
  goSetAvatar(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.setAvatar',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 跳转到收藏管理
     * @param args {""}
     * @param success
     * @param fail
     */
  goPageView(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.pageView',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 更新头部信息
     * @param args {""}
     * @param success
     * @param fail
     */
  updateNavigationBar(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'update.navigationBarStyle',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 显示 loading
     * @param args Boolen
     * @param success
     * @param fail
     */
  showLoading(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.loading',
        arguments: {
          show: args ? 'yes' : 'no'
        }
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 显示返回滑块
     * @param args Boolean
     * @param success
     * @param fail
     */
  blkBackStatus(args, success, fail) {
    if (this.isYohoBuy && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.blkBackStatus',
        arguments: {
          isHidden: args ? 'Y' : 'N'
        }
      });
    } else {

      // tip(tipInfo);
    }
  },

  /**
     * 原生调用 JS 方法
     * @param name 方法名
     * @param callback 回调
     */
  addNativeMethod(name, callback) {
    // 延迟 500ms 注入
    setTimeout(function() {
      if (window.yohoInterface) {
        window.yohoInterface[name] = callback;
      }
    }, 500);
  },

  /**
   * 跳转到 app 促销商品列表
   * @param args
   * @param success
   * @param fail
   */
  goCouponProductList(args, success, fail) {
    if (this.isApp && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.couponProductList',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  goPage: function(action, params) {
    var url = window.location.protocol + '//m.yohobuy.com/';

    if (this.isYohoBuy && window.yohoInterface) {
      url = url + '?openby:yohobuy=' + JSON.stringify({
        action,
        params
      });
    }

    if ($appLink) {
      $appLink.href = url;
      $appLink.click();
    }
  },

  finishPage(args, success, fail) {
    if (this.isYohoBuy && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.finish',
        arguments: args
      });
    } else {

      // tip(tipInfo);
    }
  },

  // 跳商品详情页
  goProductDetail(skn) {
    var url = window.location.protocol + '//m.yohobuy.com/';

    if (this.isYohoBuy && window.yohoInterface) {
      url = url + '?openby:yohobuy=' + JSON.stringify({
        action: 'go.productDetail',
        params: {product_skn: skn}
      });

      if ($appLink) {
        $appLink.href = url;
        $appLink.click();
      }
    } else {
      url = url + 'product/' + skn + '.html';
      window.open(url);
    }
  },

  getInput(args, success, fail) {
    if (this.isYohoBuy && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'get.Input',
        arguments: args
      });
    } else {
      // tip(tipInfo);
    }
  },

  share(args, success, fail) {
    if (this.isYohoBuy && window.yohoInterface) {
      window.yohoInterface.triggerEvent(success || nullFun, fail || nullFun, {
        method: 'go.showshareaction',
        arguments: args
      });
    } else {
      // tip(tipInfo);
    }
  }
};


export default yoho;