import React from 'react';
import moment from 'moment';
import { Icon, message, notification } from 'antd';
import { getOnestopKey } from '../../Services';

let messageTime = new Date().getTime() - 3000;


/**
 * 校验 开始时间必须在结束时间之前的函数
 * */
export function checkDate(endTime = '2019-01-01', startTime = '2018-12-31') {
  return moment(endTime).isAfter(moment(startTime));
}

/**
 * 去除字符串中的所有html 标签
 * */
export function matchReg(str) {
  let reg = /<\/?.+?\/?>/g;
  return str.replace(reg, '').replace(/&nbsp;/g, ' ');
}

export function htmlFormat(str) {
  if(typeof str !== 'string'){
    return '';
  }
  const newTxt = str.replace(/\s+([^<>]+)(?=<)/g, function(match) {
    return match.replace(/\s/g, '&nbsp;');
  });
  return newTxt;
}

export function countSpecialField(filedSpanBig, nameSpanBig) {
  let style = {};
  if (document.body.clientWidth > 1400) {
    if (filedSpanBig === 5) { // 当设置一行排列5个字段时 自定义宽度为20%
      style = { width: '20%' };
    }
    if (filedSpanBig === 1 && nameSpanBig === 2) {  // 当一行显示一个字段 然后名字又特别长时 使用这个width
      style = { width: '6%' };
    }
  }
  return style;
};

/**
 * 深拷贝函数
 * */
export function deepCopy(obj, parent = null) {
  if (React.isValidElement(obj)) {
    return React.cloneElement(obj);
  }
  if (['boolean', 'string', 'number'].indexOf(typeof obj) > -1 || !obj) {
    return obj;
  }
  let result;
  if (obj.constructor === Array) {
    result = [];
  } else {
    result = {};
  }
  let keys = Object.keys(obj),
    key = null,
    temp = null,
    _parent = parent;
  // 该字段有父级则需要追溯该字段的父级
  while (_parent) {
    // 如果该字段引用了它的父级则为循环引用
    if (_parent.originalParent === obj) {
      // 循环引用直接返回同级的新对象
      return _parent.currentParent;
    }
    _parent = _parent.parent;
  }
  for (let i = 0; i < keys.length; i++) {
    key = keys[i];
    temp = obj[key];
    // 如果字段的值也是一个对象
    if (temp && typeof temp === 'object') {
      // 递归执行深拷贝 将同级的待拷贝对象与新对象传递给 parent 方便追溯循环引用
      result[key] = deepCopy(temp, {
        originalParent: obj,
        currentParent: result,
        parent: parent,
      });

    } else {
      result[key] = temp;
    }
  }
  return result;
}

/**
 * 获取表单元素中每个元素的值,
 * @param type
 * @param e
 * @param other
 * @returns {*|boolean}
 */
export function getFormElemValue(type, e, other) {
  let value = e;

  switch (type) {
    case 'input':
      value = e.target.value;
      break;
    case 'checkbox':
      value = e.target.checked;
      break;
    case 'textarea':
      value = e.target.value;
      break;
    case 'buttonUpload':
      value = e.url;
      break;
    case 'upload':
      value = Array.isArray(e) ? e.join(',') : '';
      break;
    default:
      break;
  }

  return value;
}

/**
 * 生成随机字符串
 * */
export function randomStr() {
  return Math.random().toString(36).substr(2);
}

export function isJSON(str) {
  if (typeof str == 'string') {
    try {
      JSON.parse(str);
      if (typeof JSON.parse(str) === 'number') {
        return false;
      }
      return true;
    } catch (e) {
      return false;
    }
  }
}

export function checkMustHaveValue(configFileds, data){
  for (let item of configFileds) {
    if (!data[item.key] && data[item.key] !== false && data[item.key] !== 0) {
      return false;
    }
  }
  return true;
}

export function mustHaveValue(configFields, data) {
  for (let item of configFields) {
    if (!item.required) continue;
    if (Array.isArray(data[item.key]) && data[item.key].length < 1) {
      message.warning(`${item.name}是必填项请填写`);
      return false;
    }
    if (!data[item.key] && data[item.key] !== false && data[item.key] !== 0) {
      message.warning(`${item.name}是必填项请填写`);
      return false;
    }
  }
  return true;
}

/**
 * 判断数组中是否有重复元素
 * 通过数组排序,比较临近元素
 * */
export function isRepeat(ary) {
  if (ary.length <= 1) {
    return false;
  }
  let nary = ary.sort();
  for (let i = 0; i < ary.length - 1; i++) {
    if (nary[i] === nary[i + 1]) {
      return nary[i];
      // alert("数组重复内容:" + nary[i]);
    }
  }
  return false;
}


export function displayRender(label) {
  if (label) {
    return label[label.length - 1];
  } else {
    return '';
  }
}

export function isEmptyValue(value) {
  return typeof value === 'undefined' || value === null || value === '';
}


// 全局的通知消息组件
export function controlNotification(props) {
  const nowTime = new Date().getTime();
  if (nowTime - messageTime < 3000) {
    return;
  }
  messageTime = nowTime;
  notification.info({
    ...props,
    icon:
      <Icon type="info-circle"
            style={{ color: '#fa8c16' }}
      />,
  });
  return true;
}

export function setOneStopConfig(value){
  if(typeof value !== 'string'){
    value = JSON.stringify(value);
  }
  localStorage.setItem('oneStopConfig', value);
}

export function getOneStopConfig(key){
  let configList = localStorage.getItem('oneStopConfig');
  if(configList && isJSON(configList)){
    let data = JSON.parse(configList);
    if(data && typeof data === 'object'){
      if(typeof data === 'undefined'){
        return '';
      }
      return data[key] || false;
    }
  }else{
    return getOnestopKey(key);
  }
}