// 工具函数类
//对应下拉列表 获取对应的label值 value对应的value arr对应OPRUNSTATUS
//OPRUNSTATUS = [{ label: "工作", value: "0" }, { label: "关机", value: "1" }]
export function getLabel(value, arr) {
    let temp = ''
    for (let item of arr) {
        if (value == item.value) {
            temp = item.label
        }
    }
    return temp
}
//key 根据key和val查询到对应的item,返回该item的reskey的值
export function getArrObjValue(key,val,resKey,arr) {
    let temp = null
    if(arr&&arr.length>0){
        for (let item of arr) {
            if (val == item[key]) {
                temp = item[resKey]
            }
        }
    }
    return temp
}
// 如果数组存在重复属性 筛取任意一个匹配的对象,取出对应下resKey值
export function getPluCodeToVal(key,val,resKey,arr){
  let temp = null;
  if(arr&&arr.length>0){
    for(let item of arr){
      if(item[key] == val){
        temp = item[resKey]
        break
      }
    }
  }
  return temp
}
//根据多条件定位一个对象 传入data:[{},{}],condition:{'test1':'111',test2:'222'}
export function getFilterArr(condition,data){
  return data.filter( item => {
      return Object.keys( condition ).every( key => {
         return String( item[ key ] ).toLowerCase().includes( 
                 String( condition[ key ] ).trim().toLowerCase() )
          } )
   } )
}
//将对应数组对象按传入的属性排列成字符串
// val 需要拼接的属性明   arr 数组对象   str拼接的中间字符
export function splicStr(val,arr,str){
    let temp = '';
    if(arr){
        for(let item of arr){
            temp = temp+item[val]+str
          }
    }
    return temp.slice(0,temp.length-1)
  }
  export function splicStrArr(arr,str){
    let temp = '';
    if(arr){
        for(let item of arr){
            temp = temp+item+str
        }
    }
    return temp.slice(0,temp.length-1)
}
//获取两位小数,不够补齐0
  export function toDecimal2(x) {
      var f = parseFloat(x);  
      if (isNaN(f)) {  
          return "0.00";  
      }  
      var f = Math.round(x*100)/100;  
      var s = f.toString();  
      var rs = s.indexOf('.');  
      if (rs < 0) {  
          rs = s.length;  
          s += '.';  
      }  
      while (s.length <= rs + 2) {  
          s += '0';  
      }  
      return s;  
  }
  //检验文本类型方法
  export function isEdit(str) { return /^[\s\S]*\.(xml|json|yml|yaml|bat|sh|c|ini|properties|txt|html|conf|css|js|ts)$/.test(str); }

  export function paramsToFormData(obj) {
    const formData = new FormData();
    Object.keys(obj).forEach((key) => {
        if (obj[key] instanceof Array) {
          obj[key].forEach((item) => {
            formData.append(key, item);
          });
          return;
        }
        formData.append(key, obj[key]);
      });
    return formData;
  }

//树形结构多条件查询 arr过滤的数组 searchCon过滤的键值(list) nameList过滤的键名(list)未测试!!!
export function matchTreeData(arr, searchCon,nameList) {
  let newArr = [];
  let searchNameList = nameList;
  arr.forEach((item) => {
    for (let i = 0, len = searchNameList.length; i < len; i++) {
      let nameKey = searchNameList[i];
      if (item.hasOwnProperty(nameKey)) {
        if (item[nameKey] && item[nameKey].indexOf(searchCon) !== -1) {
          newArr.push(item);
          break;
        } else {
          if (item.childList && item.childList.length > 0) {
            let resultArr = this.matchTreeData(item.childList, searchCon);
            if (resultArr && resultArr.length > 0) {
              newArr.push({
                ...item,
                childList: resultArr
              })
              break;
            }
          }
        }
      } else {
        continue;
      }
    }
  })
  return newArr;
}
//去掉时分秒
export function getTimeNoHMS(value){
  return value.substr(0,10)
}
//el时间框默认获取一天
export function getDefaultTimeEL(){
  let time = []
  let end = new Date();
  let start = new Date();
  start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  time = [start,end]
  return time
}
//获取此刻前后任意一天
export function getDayNowAny(day){  
	let today = new Date();  
	let targetday_milliseconds=today.getTime() + 1000*60*60*24*day;          
	today.setTime(targetday_milliseconds); //注意,这行是关键代码
	let tDate = today.getFullYear()+ "-" + (today.getMonth()+1)+ "-" + today.getDate();  
	return tDate;  
}
//获取时间戳 传入天数 返回时间戳 num为- 之前 为+ 之后 返回[小,大] type (false?天;true?秒级)
export function getDayTime(num,type){
  let end = new Date().getTime()/1000 - 120;  
  let start =type?(end + num):(end + 60*60*24*num)
  return num>=0?[end,start]:[start,end]
}
export function timestampToTime(timestamp) {
  timestamp = timestamp ? timestamp : null;
  let date = new Date(timestamp*1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  let Y = date.getFullYear() + '/';
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '/';
  let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
  let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
  let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
  let s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
  return Y + M + D + h + m + s;
}
//提取继承obj方法
export function  extend(obj, obj2) {
  for (var k in obj2) {
    obj[k] = obj2[k];
  }
  return obj;
}

//校验 对象是否每一项都有值
export function paramsValidate(params){
  let flag = true;
  for(var key in params){
    if(params[key] != '0' && !params[key]){
      return false; // 终止程序
    }
  }
  return flag;
}
//数组对象 对象中的每一项都不为空 目前为固定字段后续改为全部字段校验
/**
 * 
 * @param {*} tempArr 
 * @returns 
 * 这里夹杂了业务逻辑 不可通用
 * 需要考虑 提示出 cpu告警/磁盘告警等。。。 未填写完全 等信息 而对于的是value
 */
export function arrObjIsVal(tempArr){
  let obj = {
    isVer:false,
    item:null,
    error:'pt',
    message:'' //pt 普通错误 未创建指标 ms 带提示信息 需要将item 的对应字段转化再进行拼接,message
  }

  let regPos = /^\d+(\.\d{0,2})?$/ //只能填写数字或两位小数
  let regPos2Str = /^([0-9]\d{0,1}|100$)(\.\d{1,2})?$/ //百分比
  try {
    if(tempArr.length==0){
       throw new Error()}
    tempArr.forEach((item, index) => {
      if(item.number1 === null||item.number1 === ''){
        obj.error = 'pt';
        obj.item = item;
        throw new Error()
      }
      if(item.number2 === null||item.number2 === ''){
        obj.error = 'pt';
        obj.item = item;
        throw new Error()
      }
      if(item.target === null||item.target === ''){
        obj.error = 'pt';
        obj.item = item;
        throw new Error()
      }
      if(!(regPos.test(item.number1)&®Pos.test(item.number2))){//是否是数字
        obj.error = 'ms';
        obj.item = item;
        obj.message = '只能填写数字或两位小数'
        throw new Error()
      }
      if(item.unit === '%'){//单位为百分比 数字不能超过100 小数点是两位
        if(!(regPos2Str.test(item.number1)&®Pos2Str.test(item.number2))){//是否是数字
          obj.error = 'ms';
          obj.item = item;
          obj.message = '整数部分<=100,小数部分不得超过两位'
          throw new Error()
        }

      }
    })
  } catch (e) {
    obj.isVer = true;
  };
  return obj
}
//给个键值
export function arrObjIsValObj(tempArr){
  let obj = {
    isVer:false,
    index:null,
    item:null,
  }
  try {
    if(tempArr.length==0){
       throw new Error(obj)}
    tempArr.forEach((item, index) => {
      if(Object.prototype.toString.call(item) === '[object Object]'){
        for(let key in item){
          if(item[key] === null||item[key] === ''||item[key] === undefined){
            obj.index = index;
            obj.item = item;
            throw new Error()
          }
        }
      }
    })
  } catch (e) {
    obj.isVer = true;
  };
  return obj
}

//数组去重
export function unique(arr) {
  return Array.from(new Set(arr));
}
//数组对象去重
export function uniqueFunc(arr, uniId){
  let res = new Map();
  return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
}