// tslint:disable-next-line:export-just-namespace
import { AsyncUpdateResult } from '@w/wbapp';

export = HMS;
export as namespace HMS;

declare namespace HMS {
  /**
   * 埋点区分平台
   */
  type ActionType = {
    wb?: string;
    ajk?: string;
    jjr?: string;
    wbtz?: string;
  };

  /**
   * 老埋点方法
   * @param pageType
   * @param actionType
   * @param cate
   * @param params
   */
  function writeLog(
    pageType: string,
    actionType: ActionType,
    cate: string,
    params?: object
  ): void;

  /**
   * 新埋点 带sidDict参数
   * @param pageType string
   * @param actionType string
   * @param cate string
   * @param sidDict map
   * @param params map
   */
  function writeLogWithSid(
    pageType: string,
    actionType: ActionType,
    cate: string,
    sidDict: object,
    params?: object
  ): void;

  /**
   * 异步升级监听
   * @param url
   * @param appVersion
   * @param bizVersion
   * @param productorid
   * @param os
   * @param onCheckForUpdateCallback
   * @param onUpdateReadyCallback
   * @param onUpdateReadyCatchCallback
   * @param onUpdateFailedCallback
   */
  function addAsyncUpdateListener(
    url: string,
    appVersion: string,
    bizVersion: string,
    productorid: string,
    os: string,
    onCheckForUpdateCallback: (params: AsyncUpdateResult) => void,
    onUpdateReadyCallback: (params: any) => void,
    onUpdateReadyCatchCallback: (params: any) => void,
    onUpdateFailedCallback: () => void
  ): void;

  /**
   * 载体页返回
   */
  function goBack(): void;

  /**
   * 控制ios是否开启右滑返回
   * @param config "on"/"off"
   */
  function setGestureBackEnableIOS(config: string): void;

  /**
   * 打电话
   * @param phonenum
   * @param len
   * @param isencrypt
   * @param callback
   */
  function call(
    phonenum: string,
    len: string,
    isencrypt: string,
    callback: () => void
  ): void;

  /**
   * 通用打电话
   * @param phoneData
   * @param sucCall
   * @param failCall
   */
  function phoneCall(
    phoneData: object,
    sucCall?: () => void,
    failCall?: (errorMsg: string) => void
  ): void;

  /**
   * 认证
   * @param type 3:人脸认证，7:银行卡认证，100:法人认证,501:普通营业执照认证
   * @param callback 回调  0：成功 -1：失败
   * @param confirm 可变参数中的情况下 传不全 会进行校验
   * @param url: 同镇需要参数 
   */
  function certify(
    type: string,
    callback: (param: number) => void,
    confirm: boolean,
    url?: string,
  ): void;

  /**
   * 获取认证状态
   * @param type 3:人脸认证，7:银行卡认证，100:法人认证,501:普通营业执照认证
   * @param callback -2：其他错误 -1：未登录 0：未认证 1：已认证
   * @param confirm 可变参数中的情况下 传不全 会进行校验
   */
  function queryCertifyStatus(
    type: string,
    callback: (param: number) => void,
    confirm: boolean
  ): void;

  /**
   *  已不维护。推荐使用 jscout 代替
   */
  function errorReport(param: any): void;

  /**
   * 检查微信是否安装
   *
   * @callback 回调函数 `callback` ，其返回值: 安装:0,未安装:-1
   */
  function isWeixinInstalled(callback: (result: number) => void): void;

  /**
   * naitve初始化参数
   */
  type InitNativeParams = {
    jumpParams: any;
    httpHeader: any;
    publicParams: any;
  };
  /**
   *
   * @param callback 回调参数InitNativeParams
   * @param isRequest 是否是网络请求
   */
  function initNativeParams(
    callback: (params: InitNativeParams) => void,
    isRequest: boolean
  ): void;

  /**
   * 图片选择器
   * @param max 可选上限
   * @param defaultImage 图片选择器
   * @param callback 数组对象
   */
  function pickImagesFormGallery(
    max: number,
    defaultImage: string,
    callback: (params: any) => void
  ): void;

  /**
   * 消息红点注册监听
   */
  function registerIMMessageListener(): void;

  /**
   *   监听红点数据返回的
   * @param callback 
   */
  function addMessageInfoListener(callback: (result: any) => void): void;
  /**
   *   移除红点监听
   */
  function removeMessageInfoListener(): void;

  /**
   * 跳转 安居客的跳转协议目前只能是明文的 如果加密或转义应该在跳转中心统一处理 否则需要在每一个目标页面进行转义成本高 切不安全
   * @param protocol
   */
  function jump(protocol: string): void;

  type alertParams = {
    title: string; // 标题
    message: string; // 内容信息
    btn: string; // 按钮名字
  }

  /**
   * 
   * @param params 
   * @param callBack 
   */

  function alert(params: alertParams, callBack: (index: number) => void): void;

  type confirmParams = {
    title: string; // 标题
    message: string; // 内容信息
    cancelBtn: string; // 取消名字
    confirmBtn: string;// 确定的名字
  }
  function confirm(params: confirmParams, callBack: (index: number) => void): void;
  type confirmPicParams = {
    title: string,
    content: string,
    negativeButtonTxt: string,
    positiveButtonTxt: string,
    imageUrl?: string
  }
  function confirmPicShow(params: confirmPicParams, callBack: (data: any) => void): void;
  function confirmPicDismiss(): void;
  /**
   * 跳转携带参数
   * @param group rn/core/house
   * @param page 页面
   * @param params
   */
  function jumpWithParams(group: string, page: string, params: object): void;

  /**
   * 58需要初始化loaidng
   * @param param
   */
  function initLoading(param?: object): void;

  /**
   * 显示loading
   * @param param
   */
  function showLoading(param?: object): void;

  /**
   * 隐藏loading
   * @param param
   */
  function hideLoading(param?: object): void;

  /**
   * 获取SP内容
   * @param key key
   * @param callback string
   */
  function getDataFromSP(key: string, callback: (params: string) => void): void;

  /**
   * 获取定位信息
   * @param callback 位置信息或定位失败
   */
  function getLocation(callback: (params: string) => void): void;

  /**
   * 登录
   * @param success 登录成功
   * @param other 其他
   * @param has 已经登录
   */
  function login(
    success: () => void,
    other?: () => void,
    has?: () => void
  ): void;

  /**
   * 是否登录
   * @param y 已登录回调
   * @param n 未登录回调
   */
  function hasLogin(y: () => void, n: () => void): void;

  /**
   * 设置状态栏
   * @param textStyle 'dark-content/light-content/default'
   * @param bgColor
   */
  function setStatusBarStyle(textStyle: string, bgColor: string): void;

  /**
   * 分享
   * @param info server返回一个协议（server当前应该已知平台信息）
   * @param callback 返回结果  成功:0,失败:-1
   */
  function share(info: string, callback: (param: number) => void): void;

  /**
   * 展示toast
   * @param message 内容
   * @param delay 持续时间
   */
  function showToast(message: string, delay?: number): void;

  /**
   * 获取用户信息
   * @param callback
   */
  function getUserInfoMap(callback: (param: object) => void): void;

  /**
   * 判断当前平台 && 定义对应平台包名
   * @param ifwb
   * @param ifajk
   * @param ifydjjr
   * @param ifwbtz
   */
  function findImpl(ifwb: () => void, ifajk: () => void, ifydjjr: () => void, ifwbtz: () => void): void;

  /**
   * get请求
   * @param url 请求地址
   * @param params 参数
   */
  function get(url: string, params?: object): Promise<object>;

  /**
   * get请求
   * @param url 请求地址
   * @param formData 表单
   * @param params 参数
   */
  function post(
    url: string,
    formData: FormData,
    params: object
  ): Promise<object>;

  /**
   * 构建请求url
   * @param requestUrl 请求地址
   * @param params
   */
  function buildRequestURL(requestUrl: string, params: object): string;

  /**
   * 创建验签
   * @param postfix 和server商定的key
   * @param params 参数
   */
  function createSignature(postfix: string, params: object): string;

  /**
   * 已不维护。推荐使用DeviceStorage
   */
  function initAsyncStorage(): void;

  /**
   * 深拷贝
   * @param data 数据
   */
  function deepClone(data: object): string;

  /**
   * 防止多次点击
   * @param callback 方法
   */
  function callOnceWrapper(callback: () => void): void;

  /**
   * 开始一个native动画，默认linear
   * @param duration
   * @param type
   * @param callback
   */
  function startLayoutAnimation(
    duration?: number,
    type?: any,
    callback?: () => void
  ): void;

  /**
   * 项目初始化
   * @param callback 初始化后调用
   */
  function initPackage(callback: () => void): void;

  // /**
  //  * 获取安全高度
  //  */
  // function getSafeTop(): number;

  // /**
  //  * 获取安全底部高度
  //  */
  // function getSafeBottom(): number;

  // /**
  //  * 是否是iphoneX以上系列
  //  */
  // function isX(): boolean;

  /**
   * 是否是有效列表
   */
  function isEffectiveList(data: any): boolean;

  /**
   * 是否是有效对象
   */
  function isEffectiveObject(data: any): boolean;

  /**
   * 是否是高版本
   * 版本相等返回 0,第一个传入的版本高于第二个版本 1，第一个传入的版本低于第二个版本 －1.
   * @param firstVersion
   * @param secondVersion
   */
  function isHigherVersion(firstVersion: string, secondVersion: string): number;

  /**
   * 校验方法是否有
   * @param args 参数
   * @param types 类型
   * @param track
   */
  function checker(args: any, types: string, track: any): any;

  /**
   * md5加密
   * @param key
   */
  function encryptionMD5(key: string): string;

  /**
   *  监听
   *
   *  已有事件
   *  - "view_resume" 载体页显示
   *  - "view_pause" 载体页隐藏
   *
   * @param 入参 `eventName: string` 事件类型
   *
   * @param 回调函数 `callback` ，其返回值见文档
   *
   * @see http://rn.58corp.com/react-native/api/APIAddListener.html
   *
   */
  function addListener(
    eventName: string,
    callback: (result?: any) => void
  ): any;

  /**
   *  移除监听
   *
   * @param 入参 `eventName: string` 事件类型
   */
  function removeAllListeners(eventName: string): void;

  type ViewControllerPushAction = {
    deviceEventName: string;
    callback: (result: any) => void;
    action: string | object;
  };

  type ViewControllerPopAction = {
    deviceEventName: string;
    result: any;
  };

  /**
   * 带回调的跳转
   * @function `push()` - 监听并跳转
   * @function `pop()` - 返回，并通过触发监听回调传递任意数据
   * @see http://rn.58corp.com/react-native/api/APIViewController.html
   */
  namespace viewController {
    /**
     * 监听，并跳转
     *
     * @param 入参 `action: ViewControllerPushAction`:
     * - `deviceEventName: string` - 自定义返回监听事件名，值和pop中的要一样。
     * - `callback: (result: any) => void` - 监听回调函数。返回值是 pop 的result参数。
     * - `action: string | object` - 跳转协议。
     *
     * @see http://rn.58corp.com/react-native/api/APIChangeview.html
     */
    function push(action: ViewControllerPushAction): void;

    /**
     * 通过触发监听回调传递任意数据，并返回
     *
     * @param 入参 `action: ViewControllerPopAction`:
     * - `deviceEventName: string` - 自定义返回监听事件名，值和push中的要一样。
     * - `result: any` - 给 push 监听回调 callback 的数据。
     *
     * @see http://rn.58corp.com/react-native/api/APIChangeview.html
     */
    function pop(action: ViewControllerPopAction): void;
  }

  /**
   * 安居客二手房 wmda埋点
   * @param action string
   * @param params object
   * @param callback () => void
   */
  function wmdaLog(action: string, params: object, callback?: () => void): void;
}
