import {char_dict, pinyin, polyphone} from "@/libs/base/pinyin";
import XEUtils from "xe-utils";

/**
 * @desc   : 处理数据
 * @author : 周兴
 * @date   : 2022/11/21 15:27
 */
String.prototype.handleStr = function () {
  if (!this || this === 'undefined' || this === 'null') {
    return '';
  }
  return this.trim();
}

/**
 * @desc   : 字符串转数值类型
 * @author : 周兴
 * @date   : 2022/11/21 13:35
 */
String.prototype.toNum = function (digits) {
  if(digits == undefined){
    digits = 0;
  }
  return XEUtils.round(this, digits);
}

/**
 * @desc   : 字符串是否是数值
 * @author : 周兴
 * @date   : 2022/11/21 14:49
 */
String.prototype.isNumber = function (){
  if(!this) return false;
  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(this);
}

/**
 * @desc   : 字符串转数值类型（千分位）
 * @author : 周兴
 * @date   : 2022/11/21 13:35
 */
String.prototype.toThousandth = function (digits) {
  if(digits == undefined){
    digits = 0;
  }
  return XEUtils.commafy(XEUtils.round(this, digits), {digits});
}

/**
 * @desc   : 首字母大写
 * @author : 周兴
 * @date   : 2022/11/21 14:43
 */
String.prototype.getInitialUpper = function () {
  if(!this) return '';
  return this.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
}


/**
 * @desc   : 中划线转驼峰
 * @author : 周兴
 * @date   : 2022/11/21 14:46
 */
String.prototype.getCamelCase = function () {
  if(!this) return '';
  return this.replace(/-[a-z]/g, (str) => str.substr(-1).toUpperCase());
}

/**
 * @desc   : 驼峰转中划线
 * @author : 周兴
 * @date   : 2023/9/8 13:04
 */
String.prototype.getKebabCase = function () {
  if(!this) return '';
  return this.replace( /[A-Z]/g, function( i ) {
    return '-' + i.toLowerCase();
  })
}

/**
 * @desc   : 获取首字母
 * @author : 周兴
 * @date   : 2022/11/21 10:44
 */
String.prototype.getInitialPy = function (){
  if(!this)return '';
  let chars = new Array(); //保存中间结果的数组
  for (let i = 0, len = this.length; i < len; i++) {
    //获得unicode码
    let ch = this.charAt(i);
    //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
    chars.push(_getChar(ch));
  }
  //处理arrResult,返回所有可能的拼音首字母串数组
  let result = _getResult(chars);
  if(result && result.length > 0){
    return result[0]
  }
  return '';
}

/**
 * @desc   : 中文获取拼音
 * @author : 周兴
 * @date   : 2022/11/21 11:51
 */
String.prototype.getFullPy = function (){
  if(!this)return '';
  let len = this.length;
  let result = "";
  for (let i = 0; i < len; i++) {
    let ch = this.substr(i, 1);
    let unicode = ch.charCodeAt(0);
    //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
    if (unicode > 40869 || unicode < 19968) {
      result += ch;
    } else {
      let name = _getFullChar(ch);
      if (name !== false) {
        result += name;
      }
    }
  }
  return result;
}

/**
 * @desc   : 中文获取拼音(都小写）
 * @author : 周兴
 * @date   : 2022/11/21 11:51
 */
String.prototype.getFullPy2 = function (){
  if(!this)return '';
  let len = this.length;
  let result = "";
  for (let i = 0; i < len; i++) {
    let ch = this.substr(i, 1);
    let unicode = ch.charCodeAt(0);
    //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
    if (unicode > 40869 || unicode < 19968) {
      result += ch;
    } else {
      let name = _getFullChar2(ch);
      if (name !== false) {
        result += name;
      }
    }
  }
  return result;
}


/**
 * @desc   : 获取文件后缀名
 * @author : 周兴
 * @date   : 2022/12/7 16:31
 */
String.prototype.getSuffix = function () {
  if(!this)return ''
  const index = this.lastIndexOf('.');
  if(index === -1)return ''
  return this.substr(index + 1);
}


/**
 * @desc   : 获取全部拼音
 * @author : 周兴
 * @date   : 2022/11/21 13:07
 */
export const _getFullChar = function (ch) {
  for (let key in pinyin) {
    if (pinyin[key].indexOf(ch) != -1) {
      return _capitalize(key);
      break;
    }
  }
  return false;
}

/**
 * @desc   : 获取全部拼音（不大写）
 * @author : 周兴
 * @date   : 2022/11/21 13:07
 */
export const _getFullChar2 = function (ch) {
  for (let key in pinyin) {
    if (pinyin[key].indexOf(ch) != -1) {
      return key;
      break;
    }
  }
  return false;
}

/**
 * @desc   : 首字母大写
 * @author : 周兴
 * @date   : 2022/11/21 13:06
 */
export const _capitalize = function (str){
  if (str.length > 0) {
    let first = str.substr(0, 1).toUpperCase();
    let spare = str.substr(1, str.length);
    return first + spare;
  }
}

/**
 * @desc   : 获取字母
 * @author : 周兴
 * @date   : 2022/11/21 13:21
 */
export const _getChar = function (ch) {
  let unicode = ch.charCodeAt(0);
  //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
  if (unicode > 40869 || unicode < 19968)
    return ch; //dealWithOthers(ch);
  //检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母
  // if (!this.options.checkPolyphone)
  //   return this.char_dict.charAt(unicode - 19968);
  return polyphone[unicode] ? polyphone[unicode] : char_dict.charAt(unicode - 19968);
}

/**
 * @desc   : 获取结果
 * @author : 周兴
 * @date   : 2022/11/21 13:22
 */
export const _getResult = function (chars) {
  // if (!this.options.checkPolyphone)
  //   return chars.join('');
  let result = [''];
  for (let i = 0, len = chars.length; i < len; i++) {
    let str = chars[i];
    let strlen = str.length;
    if (strlen == 1) {
      for (let j = 0; j < result.length; j++) {
        result[j] += str;
      }
    } else {
      let swap1 = result.slice(0);
      result = [];
      for (let j = 0; j < strlen; j++) {
        //复制一个相同的arrRslt
        let swap2 = swap1.slice(0);
        //把当前字符str[k]添加到每个元素末尾
        for (let k = 0; k < swap2.length; k++) {
          swap2[k] += str.charAt(j);
        }
        //把复制并修改后的数组连接到arrRslt上
        result = result.concat(swap2);
      }
    }
  }
  return result;
}
