import { BridgePlugin } from '../bridge';
import { modifyQueryString, parse, get } from 'para-utils';
import { setUrlNtvThird } from '../../utils/bridgeUtils';

interface IOpenNewUrlParam {
  openParams: string;
  jumpUrl: string;
  // used on openNewUrlWithDataCallback();
  cbData?: object;
}

export class OpenNewUrl<K> extends BridgePlugin<IOpenNewUrlParam, K> {

  protected get ntvPluginName() {
    return '_ntv-web_open_new_url';
  }

  protected get availableMinVersion() {
    return '1.0.0';
  }

  /**
   * 覆盖基类的默认生成NTV bridge调用参数字符串，这里需要在URL上拼装cbPluginName, cbData
   * @override
   * @param cbPluginName 当前回调生成的cbPluginName,
   */
  protected buildNtvParameter(pluginName) {
    if (this.param && pluginName) {
      this.param.jumpUrl = setUrlNtvThird(this.param.jumpUrl, {
        cbPluginName: pluginName, cbData: this.param.cbData
      });
      // we don't need to pass cbData to native.
      delete this.param.cbData;
    }
    return super.buildNtvParameter();
  }

  protected bridgeExecChrome(pluginName?: string | undefined): void {
    console.warn('当前浏览器环境:bridgeExecChrome()');
    if (this.param) {
      window.location.href = this.param.jumpUrl;
    } else {
      throw new Error('请指定浏览器跳转的URL全路径地址');
    }
  }
}

/**
 * 打开新窗口H5地址或者合法的client://协议地址
 * @param url URL地址
 */
export const openNewUrl = (url: string) => {
  new OpenNewUrl<void>({
    openParams: 'newWindow,needSlide',
    jumpUrl: url
  }).invoke();
}

/**
 * 打开新窗口H5地址或者合法的client://协议地址, 同时自动生成一个callback函数绑定，
 * 可允许下一个webview 调用调用dataCallbackToPreviousWebview();
 * 注意每次调用都会生成一个新的实例，回调不同
 * @param url 有效的URL地址
 * @param query 可选， 直接拼接到url地址上面 key=value&key1=value1
 * @param cbData 可选，可以把当前页面的部分关键数据传递到下一个WEBVIEW，待下一个webview 调用data_callback再带上新的业务参数回调回来.
 * 这样就不用参数上拼来拼去了
 */
export const openNewUrlWithDataCallback = (url: string, query = {}, cbData = {}) => {
  const newUrl = modifyQueryString(url, query);
  return new OpenNewUrl({
    openParams: 'newWindow,needSlide',
    jumpUrl: newUrl,
    cbData
  }).invokeOnce().then(result => {
    console.log('openNewUrlWithDataCallback: ', result);
    return parse(get(result, 'cbData', {}));
  })
}



