import { EditorState, convertFromRaw, convertToRaw, CompositeDecorator } from 'draft-js';
import { stateToHTML } from 'draft-js-export-html';
import moment from 'moment';
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) {
  // console.trace('123');
	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 (j.indexOf('$') > -1 && Array.isArray(childObj[j]) && childObj[j].length === 2) {

								  j.split('$').map((g,index) => {
								    if(moment.isMoment(childObj[j][index])){
								      childObj[g] = childObj[j][index].valueOf();
                   //   childObj[j][index] = childObj[j][index].valueOf();
                    }
                  });
                  delete childObj[j];
                // 我写的代码

								  // 欢哥写的代码.
									// for (var i = 0; i < xxx.length; i++) {
									// 	if (childObj[j][i] instanceof moment) {
									// 		values[key][k][xxx[i]] = values[key][k][j][i].valueOf();
									// 	} else {
									// 		values[key][k][xxx[i]] = values[key][k][j][i];
									// 	}
									// }
									//delete values[key][k][j];
								} else {
									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(moment.isMoment(obj)){
	//   return moment().clone)
  // }
	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;
}
