import { EditorState, convertFromRaw, convertToRaw, CompositeDecorator } from 'draft-js';
import { message } from 'antd';
import { stateToHTML } from 'draft-js-export-html';
import moment from 'moment';
import { isJSON } from '@/webPublic/one_stop_public/copy';
import React from "react";

function findLinkEntities(contentBlock, callback, contentState) {
	contentBlock.findEntityRanges(
		(character) => {
			const entityKey = character.getEntity();
			return entityKey !== null && contentState.getEntity(entityKey).getType() === 'LINK';
		},
		function() {
			console.log(arguments);
			callback(...arguments);
		},
	);
}

const Link = (props) => {
	const { url } = props.contentState.getEntity(props.entityKey).getData();

	return (
		<a href={url} target="_blank">
			{props.children}
		</a>
	);
};

const decorator = new CompositeDecorator([
	{
		strategy: findLinkEntities,
		component: Link,
	},
]);

export function changeHtml(msg) {
	var msg = msg.replace(/<\/?[^>]*>/g, ''); //去除HTML Tag
	msg = msg.replace(/[|]*\n/, ''); //去除行尾空格
	msg = msg.replace(/&npsp;/gi, ''); //去掉npsp
	return msg;
}

export function changeToDraftState(blocks) {
	if (blocks == null || blocks == '') {
		return EditorState.createEmpty(decorator);
	}
	let x;
	if (typeof blocks === 'string' && blocks) {
		try {
			x = JSON.parse(blocks);
		} catch (e) {
			return EditorState.createEmpty(decorator);
		}
	} else {
		x = blocks;
	}

	if (!x.blocks) {
		return EditorState.createEmpty(decorator);
	}

	const b = convertFromRaw(x);
	return EditorState.createWithContent(b, decorator);
}

export function changeFromDraftState(editorState) {
	const x = editorState.getCurrentContent();
	const blocks = JSON.stringify(convertToRaw(x));
	const content = stateToHTML(x);

	return { content, blocks };
}

export function changeToDraftState2(blocks) {
	const b = convertFromRaw(blocks);
	return EditorState.createWithContent(b, decorator);
}

export function changeFromDraftState2(editorState) {
	if (editorState == null) return;
	const x = editorState.getCurrentContent();
	const blocks = convertToRaw(x);

	return blocks;
}

export function preHandle(values) {
	for (var key in values) {
		if (!values[key]) continue;
		if (key.indexOf('$') > -1) {
			var xx = key.split('$');
			for (var i = 0; i < xx.length; i++) {
				if (values[key][i] instanceof moment) {
					values[xx[i]] = values[key][i].valueOf();
				} else {
					values[xx[i]] = values[key][i];
				}
			}
			delete values[key];
		} else {
			if (values[key] != null) {
				if (values[key] instanceof moment) {
					values[key] = values[key].valueOf();
				} else if (values[key] instanceof Date) {
					values[key] = values[key].valueOf();
				} else if (values[key] instanceof Boolean) {
					values[key] = values[key] ? 0 : 1;
				} else if (values[key] instanceof Object && key != 'defaultValues') {
					//处理子表单中的日期值
					let objValues = values[key];
					for (let k in objValues) {
						if (k != '' && objValues[k] instanceof Object) {
							let childObj = objValues[k];
							for (let j in childObj) {
								if (childObj[j] != null) {
									if (childObj[j] instanceof moment) {
										values[key][k][j] = values[key][k][j].valueOf();
									} else if (childObj[j] instanceof Date) {
										values[key][k][j] = values[key][k][j].valueOf();
									} else if (childObj[j] instanceof Boolean) {
										values[key][k][j] = values[key][k][j] ? 0 : 1;
									}
								}
							}
						}
					}
				}
			}
		}
	}
}


/**
 * 深拷贝函数 一站式使用
 * */
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 && moment.isMoment(temp)){
      result[key] = temp.clone();
    }else if (temp && typeof temp === 'object') { // 如果字段的值也是一个对象
      // 递归执行深拷贝 将同级的待拷贝对象与新对象传递给 parent 方便追溯循环引用
      result[key] = deepCopy(temp, {
        originalParent: obj,
        currentParent: result,
        parent: parent,
      });
    } else {
      result[key] = temp;
    }
  }
  return result;
}
