import { get, isNil } from 'lodash-es';

/** 根据配置中的 formatter 将文本格式并返回 */
export function getFormattedText(data: any, formatter: string, trans?: Record<string, string>, defaultValue?: any): string {
  const defval = defaultValue === undefined ? '-' : defaultValue;
  if (!data) return defval;

  // e.g. 'pre${prop[0].name}suf' => ['pre${prop[0].name}suf', 'prop[0].name']
  const exp = /\$\{([\w|\.|\[|\]]*)\}/g;
  const res = exp.exec(formatter);

  // 如果 formatter 中没有需要动态获取的值则直接返回
  if (!res) return formatter;

  const [__, prop] = res;
  const txt = get(data, prop);

  // 如果指明了需要进行翻译，那么根据 txt 的值查找翻译内容，必要时进行二次翻译
  if (trans) {
    const translated = get(trans, txt, trans.default);
    // 如果查不出翻译内容则返回原本的值
    if (translated === undefined) return txt;
    const result = getFormattedText(data, translated);
    return formatter.replace(exp, isNil(result) ? defval : result);
  }
  return formatter.replace(exp, isNil(txt) ? defval : txt);
}

/** 获取 formatter 需要取的源 prop，用于在一些不支持 formatter 的组件中使用 */
export function getRawProp(formatter: string): string {
  // e.g. 'pre${prop[0].name}suf' => ['pre${prop[0].name}suf', 'prop[0].name']
  const exp = /\$\{([\w|\.|\[|\]]*)\}/g;
  const res = exp.exec(formatter);
  if (!res) return '';

  const [__, prop] = res;
  return prop;
}

// 获取模块所依赖的数据的方法
export function getData(raw, readFrom, parser?) {
  const result = readFrom ? get(raw, readFrom) : raw;
  console.log()
  if (!result) return result;
  switch (parser) {
    case 'json':
      return JSON.parse(result);
    default:
      return result;
  }
}
