export default {
  /** ****************** ReactNative通信 ********************/
  /**
   * 生成唯一ID
   * @returns {string} 唯一ID
   */
  generateUniqueId() {
    return `cb_${Date.now()}_${Math.floor(Math.random() * 1000)}`;
  },
  /**
   * @desc 检查是否在ReactNative环境中
   * @returns {Boolean} 是否在ReactNative WebView中
   */
  isInReactNative() {
    return typeof window !== 'undefined' && !!window.ReactNativeWebView;
  },

  /**
   * @desc 发送消息到ReactNative
   * @param {Object} message 消息对象
   * @returns {Boolean} 发送是否成功
   */
  postMessageToRN(data) {
    if (!this.isInReactNative()) {
      return false;
    }
    try {
      window.ReactNativeWebView.postMessage(JSON.stringify(data));
      return true;
    } catch (error) {
      return false;
    }
  },

  /**
   * @desc 控制头部导航栏显示/隐藏
   * @param {Boolean} visible 是否显示导航栏
   * @returns {Boolean} 操作是否成功
   */
  setHeaderShown(visible = false) {
    return this.postMessageToRN({
      type: 'headerShown',
      visible
    });
  },

  /**
   * @desc 关闭当前页面，触发返回操作
   * @returns {Boolean} 操作是否成功
   */
  navigateBack() {
    if (!this.isInReactNative()) {
      return false;
    }
    try {
      window.ReactNativeWebView.postMessage(
        JSON.stringify({
          type: 'back',
          data: {
            // 不强制返回，让原生端判断是否可以返回
            force: false
          }
        })
      );
      return true;
    } catch (error) {
      return false;
    }
  },

  /**
   * @desc 设置头部导航栏标题
   * @param {String} title 标题文本
   * @returns {Boolean} 操作是否成功
   */
  setTitle(title) {
    if (title) {
      return this.postMessageToRN({
        type: 'title',
        title
      });
    }
  },

  /**
   * @desc 设置系统状态栏明暗主题
   * @param {String} style 主题风格，'light'为浅色，'dark'为深色
   * @returns {Boolean} 操作是否成功
   */
  setStatusBarStyle(style = 'light') {
    return this.postMessageToRN({
      type: 'statusBar',
      style
    });
  },

  /**
   * @desc 跳转到APP页面
   * @param {String} url APP内页面路由
   * @returns {Boolean} 操作是否成功
   */
  navigateToAppPage(url) {
    return this.postMessageToRN({
      type: 'navigate',
      url
    });
  },

  // /**
  //  * @desc 跳转到H5页面
  //  * @param {String} h5Url 目标H5链接
  //  * @param {String} name 导航头中的标题文案
  //  * @param {Boolean} fullscreen 是否全屏显示（隐藏导航头）
  //  * @returns {Boolean} 操作是否成功
  //  */
  // navigateToH5(h5Url, name, fullscreen = false) {
  //   if (fullscreen) {
  //     h5Url = this.appendQueryParam(h5Url, 'fullscreen', 'true');
  //   }
  //   return this.postMessageToRN({
  //     type: 'navigate',
  //     url: `authH5?url=${encodeURIComponent(h5Url)}&name=${name}`
  //   });
  // },

  // /**
  //  * @desc 给URL添加查询参数
  //  * @param {String} url 原始URL
  //  * @param {String} key 参数名
  //  * @param {String} value 参数值
  //  * @returns {String} 添加参数后的URL
  //  * @private
  //  */
  // appendQueryParam(url, key, value) {
  //   const separator = url.includes('?') ? '&' : '?';
  //   return `${url}${separator}${key}=${value}`;
  // },

  /**
   * @desc 禁用原生返回（Android）
   * @returns {Boolean} 操作是否成功
   */
  takeOverAndroidBack() {
    return this.postMessageToRN({
      type: 'takeOverAndroidBack'
    });
  },

  /**
   * @desc 跳转到手机浏览器中打开页面
   * @param {String} url 要打开的URL
   * @returns {Boolean} 操作是否成功
   */
  openInBrowser(url) {
    return this.postMessageToRN({
      type: 'openLink',
      url
    });
  },

  /**
   * @desc 使用原生扫码工具
   * @param {Function} callback 扫码结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  scanCode(callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'scanCode',
      cbId
    });
  },

  /**
   * @desc 分享链接到微信
   * @param {Object} options 分享选项
   * @param {String} options.title 分享标题
   * @param {String} options.description 分享副标题
   * @param {String} options.thumbImageUrl 缩略图URL
   * @param {String} options.webpageUrl 网页链接
   * @param {Number} options.scene 分享场景：0为微信好友，1为朋友圈
   * @param {Function} callback 分享结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  shareToWeChat(options, callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'shareToWx',
      title: options.title,
      description: options.description,
      thumbImageUrl: options.thumbImageUrl,
      webpageUrl: options.webpageUrl,
      scene: options.scene || 0,
      cbId
    });
  },

  /**
   * @desc 分享视频到抖音
   * @param {Object} options 分享选项
   * @param {String} options.title 分享标题
   * @param {String} options.shortTitle 抖音短标题
   * @param {Array<String>} options.videos 视频地址数组
   * @param {Boolean} options.isPublish 是否直接跳转到发布页
   * @param {Boolean} options.tip 是否显示APP自带的提示与loading
   * @param {Function} callback 分享结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  shareVideoToDouyin(options, callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'shareVideoToDouyin',
      title: options.title,
      shortTitle: options.shortTitle,
      videos: options.videos,
      isPublish: options.isPublish !== false,
      tip: options.tip !== false,
      cbId
    });
  },

  /**
   * @desc 唤起抖音
   * @param {Function} callback 操作结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  openDouyin(callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'openDouyin',
      cbId
    });
  },

  /**
   * @desc 分享文本到微博
   * @param {String} content 要分享的文本内容
   * @param {Function} callback 分享结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  shareTextToWeibo(content, callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'shareTextToWeibo',
      content,
      cbId
    });
  },

  /**
   * @desc 保存到相册
   * @param {String} src 媒体资源URL（图片或视频）
   * @param {Function} callback 保存结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  save2Album(src, callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'save2Album',
      src,
      cbId
    });
  },

  /**
   * @desc 请求安卓权限
   * @param {String} permission 权限名称，如'android.permission.CAMERA'
   * @param {Function} callback 请求结果回调函数
   * @returns {Boolean} 操作是否成功
   */
  requestAndroidPermission(permission, callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'androidPermission',
      permission,
      cbId
    });
  },
  /**
   * @desc 获取新的认证令牌
   * @param {Function} callback 获取结果回调函数，参数格式为：
   *                            {status: 0|1, msg: string, data: string}
   *                            status: 0成功，1失败
   *                            msg: 错误信息
   *                            data: 新token
   * @returns {Boolean} 操作是否成功
   */
  getNewAuthToken(callback) {
    const cbId = this.generateUniqueId();
    window[cbId] = callback;
    return this.postMessageToRN({
      type: 'newAuthToken',
      cbId
    });
  },
  /**
   * @desc H5历史记录
   */
  routerCanGoBack(router) {
    const position = router.options.history.state?.position;
    return typeof position === 'number' && position > 1;
  },
  /**
   * @desc 当前系统h5返回
   * @returns {Boolean} 操作是否成功
   */
  async h5RouterBack(router) {
    const routerCanGoBack = () => {
      const position = router.options.history.state?.position;
      return typeof position === 'number' && position > 0;
    };
    if (routerCanGoBack()) {
      router.go(-1);
    } else {
      appBridge.navigateBack();
    }
  }
};
