import { BridgePlugin } from '../bridge';
import { getUrlNtvThird } from '../../utils/bridgeUtils';
import { get, stringify, extend } from 'para-utils';

interface IDataCallbackParam {
  tagName: string;
  result: string;
}

export class DataCallback<K> extends BridgePlugin<IDataCallbackParam, K>{

  protected get ntvPluginName() {
    return '_ntv_web_data_callback';
  }

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

  /**
   * 覆盖基类的默认生成NTV bridge调用参数字符串, 此处 data_callback always需要去parse URL参数
   * "ntv_third" 去获取上一个webview传递过来的cbPluginName.
   * @param pluginName 当前回调生成的cbPluginName
   */
  protected buildNtvParameter(pluginName) {
    const urlCbData = getUrlNtvThird();
    pluginName = get(urlCbData, 'cbPluginName', pluginName);
    return super.buildNtvParameter(pluginName);
  }

  protected bridgeExecChrome(pluginName?: string | undefined): void {
    // 可针对不同运行环境实现特定的调用逻辑来MOCK，弥补平台差异性.
    throw new Error('DataCallback() 未针对当前环境实现');
  }
}

/**
 * 回退上一个webview,并执行上一个webview定义的函数回调With特定的业务参数
 * @param cbBizData 回调给上一个webview的自定义业务参数
 */
export const dataCallbackToPreviousWebview = (cbBizData = {}) => {
  const urlCbData = getUrlNtvThird();
  new DataCallback<void>().invoke({
    tagName: 'ntv_data_callback',
    result: stringify(extend(true, get(urlCbData, 'cbData'), cbBizData)),
  });
}