/** 消息类别的code */
export const msgTypeEnum = {
	//#region 在线互动
	文本消息: 1000,
	图片消息: 1001,
	文本消息: 1000,
	图片消息: 1001,
	文件消息: 1002,
	视频消息: 1003,
	患教资料: 1004,
	问卷量表: 1005,

	患教已读: 1104,
	问卷已填写: 1105,

	申请: 2000,
	申请通过: 2001,
	申请拒绝: 2002,
	申请取消: 2003,
	申请超时: 2004,

	结束服务: 3000,
	//#endregion

	//#region 随访消息
	随访群发消息: 0,
	随访问卷通知: 1,
	随访文章通知: 2,
	随访复诊提醒: 3,
	随访用药提醒: 4,
	随访换药提醒: 5,
	随访手术提醒: 6,
	随访注意事项: 7,
	随访检查预约提醒: 8,
	随访报告已出提醒: 9,
	随访体征上传提醒: 10,
	//#endregion
};

/** 列表显示的消息 */
class ContentExtractFactory {
	//#region 在线互动
	[msgTypeEnum.文本消息](content) {
		const obj = this.parse(content);
		return decodeURI(obj.content);
	}
	[msgTypeEnum.图片消息]() {
		return '[图片消息]';
	}
	[msgTypeEnum.视频消息]() {
		return '[视频通话]';
	}
	[msgTypeEnum.患教资料]() {
		return '[健康宣教]';
	}
	[msgTypeEnum.问卷量表]() {
		return '[问卷量表]';
	}
	[msgTypeEnum.申请]() {
		return '[申请交流互动]';
	}
	[msgTypeEnum.申请通过](content) {
		const obj = this.parse(content);
		return `[申请通过]：${obj.content}`;
	}
	[msgTypeEnum.申请拒绝](content) {
		const obj = this.parse(content);
		return `[申请被拒绝]：您好，您的互动申请暂未通过，${obj.content}`;
	}
	[msgTypeEnum.申请取消](content) {
		const obj = this.parse(content);
		return `[申请取消]：${obj.content}`;
	}
	[msgTypeEnum.申请超时](content) {
		const obj = this.parse(content);
		return `[申请超时]：${obj.content}`;
	}
	[msgTypeEnum.结束服务](content) {
		const obj = this.parse(content);
		return `[系统]：${obj.content}`;
	}

	[msgTypeEnum.问卷已填写](content) {
		const obj = this.parse(content);
		return obj.content;
	}
	[msgTypeEnum.患教已读]() {
		return '[健康宣教]';
	}
	//#endregion

	//#region 随访消息
	[msgTypeEnum.随访群发消息](content) {
		const obj = this.parse(content);
		return `[通知]：${obj.txt}`;
	}
	[msgTypeEnum.随访问卷通知]() {
		return `[问卷量表]`;
	}
	[msgTypeEnum.随访文章通知]() {
		return `[健康宣教]`;
	}
	[msgTypeEnum.随访复诊提醒](content) {
		const obj = this.parse(content);
		return `[复诊提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访用药提醒](content) {
		const obj = this.parse(content);
		return `[用药提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访换药提醒](content) {
		const obj = this.parse(content);
		return `[换药提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访手术提醒](content) {
		const obj = this.parse(content);
		return `[手术提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访注意事项](content) {
		const obj = this.parse(content);
		return `[注意事项]：${obj.txt}`;
	}
	[msgTypeEnum.随访检查预约提醒](content) {
		const obj = this.parse(content);
		return `[检查预约提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访报告已出提醒](content) {
		const obj = this.parse(content);
		return `[报告已出提醒]：${obj.txt}`;
	}
	[msgTypeEnum.随访体征上传提醒](content) {
		const obj = this.parse(content);
		return `[体征上传提醒]：${obj.txt}`;
	}
	//#endregion
	parse(content) {
		if (typeof content == 'string') {
			try {
				const data = JSON.parse(content);
				return data;
			} catch (error) {
				return content;
			}
		}
	}
}

/** 消息内容提取 */
export const lastMsgContentExtract = (msg) => {
	const factory = new ContentExtractFactory();
	return factory[msg.contentType] ? factory[msg.contentType](msg.content) : '';
};

/** 消息内容组件 */
export const ContentComponents = {
	//#region 在线互动
	[msgTypeEnum['文本消息']]: 'textMsg',
	[msgTypeEnum['图片消息']]: 'imgMsg',
	[msgTypeEnum['视频消息']]: 'videoCallMsg',
	[msgTypeEnum['患教资料']]: 'articleMsg',
	[msgTypeEnum['问卷量表']]: 'questionnaireMsg',
	[msgTypeEnum['申请']]: 'applyMsg',
	[msgTypeEnum['申请通过']]: 'textMsg',
	[msgTypeEnum['申请拒绝']]: 'textMsg',
	[msgTypeEnum['申请取消']]: 'systemMsg',
	[msgTypeEnum['申请超时']]: 'systemMsg',
	[msgTypeEnum['结束服务']]: 'systemMsg',

	[msgTypeEnum['患教已读']]: 'articleMsg',
	[msgTypeEnum['问卷已填写']]: 'questionnaireMsg',
	//#endregion

	//#region 随访消息
	[msgTypeEnum['随访群发消息']]: 'textMsg',
	[msgTypeEnum['随访问卷通知']]: 'questionnaireMsg',
	[msgTypeEnum['随访文章通知']]: 'articleMsg',
	[msgTypeEnum['随访复诊提醒']]: 'textMsg',
	[msgTypeEnum['随访用药提醒']]: 'textMsg',
	[msgTypeEnum['随访换药提醒']]: 'textMsg',
	[msgTypeEnum['随访手术提醒']]: 'textMsg',
	[msgTypeEnum['随访注意事项']]: 'textMsg',
	[msgTypeEnum['随访检查预约提醒']]: 'textMsg',
	[msgTypeEnum['随访报告已出提醒']]: 'textMsg',
	[msgTypeEnum['随访体征上传提醒']]: 'textMsg',
	//#endregion
};

/** 消息内容组件内容prop */
const ContentProps = {
	//#region 在线互动
	[msgTypeEnum['文本消息']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['图片消息']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['视频消息']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['患教资料']]: {
		title: 'Content.title',
		id: 'Content.id',
		read: 'Content.read',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['患教已读']]: {
		title: 'Content.title',
		id: 'Content.id',
		read: 'Content.read',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['问卷量表']]: {
		title: 'Content.title',
		id: 'Content.subjectId',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['问卷已填写']]: {
		id: 'Content.subjectId',
		title: 'Content.title',
		content: 'Content.content',
		sampleId: 'Content.sampleId',
		recordId: 'Content.recordId',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['申请']]: {
		content: 'Content.content',
		imgList: 'Content.imgList',
		id: 'Id',
	},
	[msgTypeEnum['申请通过']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['申请拒绝']]: {
		content: 'Content.content',
		format(obj) {
			return `您好，您的互动申请暂未通过，${obj.content}`;
		},
	},
	[msgTypeEnum['申请超时']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['申请取消']]: {
		content: 'Content.content',
	},
	[msgTypeEnum['结束服务']]: {
		content: 'Content.content',
	},
	//#endregion

	//#region 随访消息
	[msgTypeEnum['随访群发消息']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访问卷通知']]: {
		title: 'Content.txt',
		id: 'Content.id',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['随访文章通知']]: {
		title: 'Content.txt',
		id: 'Content.id',
		msgId: 'Content.msgId',
		subTaskId: 'Content.subTaskId',
	},
	[msgTypeEnum['随访复诊提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访用药提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访换药提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访手术提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访注意事项']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访检查预约提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访报告已出提醒']]: {
		content: 'Content.txt',
	},
	[msgTypeEnum['随访体征上传提醒']]: {
		content: 'Content.txt',
	},
	//#endregion
};

/** 转换消息 */
export const parseMessageEntry = (message, type) => {
	const obj = {};
	const props = ContentProps[type];
	if (!props) return;
	let hasFormat = typeof props['format'] == 'function';
	Object.keys(props).map((key) => {
		if (key != 'format') {
			const path = props[key].split('.');
			if (path.length <= 1) {
				obj[key] = message[path];
			} else {
				obj[key] = path.reduce((item, p) => {
					if (item instanceof Array) {
						const [v] = item.filter((i) => i.key == p);
						return v?.value;
					} else {
						try {
							if (typeof item[p] == 'string') {
								const value = JSON.parse(item[p]);
								typeof value == 'object' && (item[p] = value);
							}
							return item[p];
						} catch (error) {
							return item[p];
						}
					}
				}, message);
			}
		}
	});
	hasFormat && (obj['content'] = props['format'](obj));
	return obj;
};

/** 会话记录排序*/
export const msgListSort = (
	list,
	props = {
		sendTime: 'CreateTime',
	}
) => {
	// 时间排序  从小到大  最新的在后面
	list.sort((a, b) => {
		return new Date(a[props.sendTime]).getTime() - new Date(b[props.sendTime]).getTime();
	});
	return list;
};
/** 判断消息是否显示时间 */
export const msgJudgeTime = (
	list,
	lastMsg = null,
	props = {
		sendTime: 'CreateTime',
	}
) => {
	for (let i = 0; i < list.length; i++) {
		if (i == 0) {
			list[i].showSendTime = lastMsg
				? compareTime(list[i][props.sendTime], lastMsg[props.sendTime])
				: true;
		} else {
			list[i].showSendTime = compareTime(list[i][props.sendTime], list[i - 1][props.sendTime]);
		}
		list[i].isNew = !!lastMsg;
	}
	return list;
};
/** 对比时间 */
export const compareTime = (startTime, endTime) => {
	const times = new Date(startTime).getTime();
	const preTimes = new Date(endTime).getTime();
	return times - preTimes >= 5 * 60 * 1000;
};
