import * as service from '../AffairPage/publicApiService';
import moment from 'moment';
import { isJSON } from '@/baseComponent/utils';
import { getDefaultValues } from '../AffairPage/destruction';
import { message } from 'antd';

const text = [
	'BINARY',
	'BIT',
	'BLOB',
	'CHAR',
	'GEOMETRY',
	'GEOMETRYCOLLECTION',
	'JSON',
	'LINESTRING',
	'LONGBLOB',
	'LONGTEXT',
	'MEDIUMBLOB',
	'MEDIUMINT',
	'MEDIUMTEXT',
	'MULTILINESTRING',
	'MULTIPOINT',
	'MULTIPOLYGON',
	'POINT',
	'POLYGON',
	'REAL',
	'DECIMAL',
	'ENUM',
	'SET',
	'TEXT',
	'TINYBLOB',
	'TIBYTEXT',
	'VARBINARY',
	'VARCHAR',
];

const optionsStatus = [
	{
		label: '未提交',
		value: 'un_audit',
	},
	{
		label: '审核中',
		value: 'in_audit',
	},
	{
		label: '已通过',
		value: 'audited',
	},
  {
    label: '已驳回',
    value: 'reject',
  },
	// { label: '已拒绝', value: 'refuse' },
	{
		label: '已失效',
		value: 'invalid',
	},
	// { label: '已挂起', value: 'hang_up' },
	{
		label: '已终止',
		value: 'termination',
	},
	// { label: '已驳回', value: 'reject' },
	// { label: '已同意', value: 'agree' },
	{
		label: '重新提交',
		value: 're_apply',
	},
	{
		label: '己拒绝',
		value: 'bad_audited',
	},
];

const number = ['BIGINT', 'DOUBLE', 'FLOAT', 'INT', 'INTEGER', 'NUMERIC', 'SMALLINT', 'TINYINT'];

const date = ['DATE', 'DATETIME', 'TIME', 'TIMESTAMP', 'YEAR'];

const format = {
	// 欢哥那边定义好的 时间格式类型
	DATE: 'YYYY-MM-DD HH:mm',
	DATETIME: 'YYYY-MM-DD HH:mm:ss',
	TIME: 'HH:mm:ss',
	TIMESTAMP: 'HH:mm:ss',
	YEAR: 'YYYY',
};
const taskNode = ['TASKNODE'];

/**
 * 将时间格式转化为unix时间戳
 * */
const transLateTimeTOUnix = (value, dataType) => {
	if (date.indexOf(dataType) > -1 && value) {
		return moment(value).format('x');
	} else {
		return value;
	}
};

const getFormArrayConfig = (header) => {
	let config = [];
	for (let item of header) {
		if (item.isPrimaryKey || item.isHidden || item.dataIndex === 'operationEdit') {
			// 主键
			continue;
			/* config.push(
         {
           key: item.name,
           name: item.title,
           type: 'input',
           placeholder: `请输入${item.name}`,
           required: !item.isNull,
         }
       );*/
		} else if (item.options && Array.isArray(item.options) && item.options.length) {
			config.push({
				key: item.name,
				name: item.title,
				type: 'select',
				required: !item.isNull,
				base52: item.base52,
				options: item.options,
			});
		} else if (text.indexOf(item.type) > -1) {
			config.push({
				key: item.name,
				name: item.title,
				type: 'input',
				placeholder: `请输入${item.title}`,
				required: !item.isNull,
				base52: item.base52,
			});
		} else if (number.indexOf(item.type) > -1) {
			config.push({
				key: item.name,
				name: item.title,
				type: 'inputNumber',
				placeholder: `请输入${item.title}`,
				required: !item.isNull,
				min: 0,
				base52: item.base52,
			});
		} else if (date.indexOf(item.type) > -1) {
			config.push({
				key: item.name,
				name: item.title,
				type: 'datePicker',
				placeholder: `请输入${item.title}`,
				required: !item.isNull,
				format: format[item.type],
				base52: item.base52,
			});
		} else {
			config.push({
				key: item.name,
				name: item.title,
				type: 'input',
				placeholder: `请输入${item.title}`,
				required: !item.isNull,
				base52: item.base52,
			});
		}
	}
	return config;
};

const transLate = {
	TextArea: 'textarea',
	Radio: 'radioGroup',
	Label: 'text',
	Checkbox: 'checkBoxMutiple',
	Select: 'select',
	Switch: 'switch',
	DatePicker: 'datePicker',
	RangePicker: 'rangePicker',
	UploadCom: 'buttonUpload',
	ImgUploadCom: 'upload',
	VideoUploadCom: 'upload',
	Input: 'input',
	TableSelect: 'tableSelect', // 表格选择
	ChildForm: 'childForm', // 最终保存的数据还有问题
	InputNumber: 'inputNumber',
	PartForm: 'partForm', // 还未开发 相当于选了一个选项 表单字段变更
	Echart: 'echart', //  不做
	Description: 'input', // 'description', // 还未开发
	Table: 'table', // 表格 未开发
};

const getOpts = async (item) => {
	let options = [];
	if (item.optionType === 'reference') {
		options = await service.getOptions(
			item.dataId,
			item.filterSql,
			item.referenceCodeName,
			item.referenceNameName,
		);
	} else if (item.optionType === 'sql') {
		options = await service.getSqlOptions(item.dataId, item.sqlKey, item.valueName, item.labelName);
	} else {
		options = item.options;
	}
	return options;
};

const getSearchCondition = async (id, appId = undefined) => {
	const searchHeaders = await service.getHead(id).then((res) => {
		if (res && res.length) {
			return res.filter((x) => {
				return x.isShowQuery !== false && x.isHidden === false;
			});
		} else {
			return [];
		}
	});
	// console.log(JSON.stringify(searchHeaders));
	for (let item of searchHeaders) {
		// H:\project\one_stop_front\src\pages\AdminSystem\pages\ddl\formList\index.js
		if (item.referenceObjId && item.id && item.referenceCodeName && item.referenceNameName) {
			//通过引用去查枚举
			item.options = await service.getBatchOptions(item.id).then((res) => {
				if (res && res[item.id]) {
					return res[item.id]
						.filter((g) => {
							return !!g[item.referenceNameName] && !!g[item.referenceCodeName];
						})
						.map((y) => {
							return {
								key: y[item.referenceCodeName],
								name: y[item.referenceNameName],
							};
						});
				} else {
					return [];
				}
			});
		}

		if (item.isGroupQuery && item.id && (!item.options || !item.options.length)) {
			// 获取下拉搜索条件的枚举项

			if (item.name === 'process_status') {
				/**
				 * 29890 活动发布管理/活动申报审核/通知活动审核,“活动名称”没有显示;筛选输入有误(103123,bdk@2022*$)
				 * 2022年9月26日
				 * 可能需要修改 流程审核状态的枚举
				 *
				 * 2023-04-17 和雅职2.0的枚举 保持一致!!
				 * 解决禅道 34123
				 * */
				// item.name = 'formStatusId';
				item.options = optionsStatus.map((x) => {
					return {
						key: x.value,
						name: x.label,
					};
				});
				// item.options = [
				//   {
				//     key: '0',
				//     name: '已通过',
				//   },
				//   {
				//     key: '1',
				//     name: '已拒绝',
				//   },
				//   {
				//     key: '2',
				//     name: '已驳回',
				//   },
				//   {
				//     key: '-1',
				//     name: '审核中',
				//   },
				// ];
			} else {
				item.options = await service
					.getGroupList({
						columnId: item.id,
						appId,
					})
					.then((res) => {
						if (res && Array.isArray(res)) {
							return res
								.filter((x) => {
									return x.value !== item.title && x.value;
								})
								.map((x) => {
									return {
										key: x.value,
										name: x.value,
									};
								});
						} else {
							return [];
						}
					});
			}
		}
	}

	const condition = getFormArrayConfig(searchHeaders);

	condition.forEach((x) => {
		x.required = false;
	});
	return condition;
};

const translateAddFields = async (data, tableInfo) => {
	let key = [];
	let res = [];
	for (let item of data) {
		if (key.indexOf(item.key) > -1) {
			continue;
		} else {
			key.push(item.key);
		}
		item.type = transLate[item.comName] || 'input';
		if (typeof item.key === 'undefined' || !item.key) {
			item.key = item.c1;
		}
		switch (item.comName) {
			case 'Input':
				if (number.indexOf(item.dataType) > -1) {
					item.type = 'inputNumber';
				}
				break;
			case 'DatePicker':
				item.format = item.format || format[item.dataType];
				// console.log(item.format);
				if (item.format && item.format.indexOf('HH') > -1) {
					item.showTime = true;
				}
				break;
			case 'RangePicker':
				item.name = item.name || '起止时间';
				item.endKey = item.c2;
				item.format = item.format || format[item.dataType];
				if (item.format.indexOf('HH') > -1) {
					item.showTime = true;
				}
				break;
			case 'ChildForm':
				item.componentProps.thisFields = await translateAddFields(
					item.componentProps.thisFields,
					tableInfo,
				);
				break;
			case 'Radio':
				item.options = await getOpts(item);
				break;
			case 'Select':
				item.options = await getOpts(item);
				break;
			case 'Checkbox':
				item.options = await getOpts(item);
				item.options = item.options.map((x) => {
					return {
						label: x.name,
						value: x.key,
					};
				});
				break;
			case 'TableSelect':
				let info = await service.handleSqlfind(item.componentProps.sqlKey);
				if (isJSON(info.cols)) {
					info.cols = JSON.parse(info.cols);
				}
				item.componentProps.columnsData = info;
				item.componentProps.allValues = JSON.stringify(getDefaultValues(data, tableInfo));
				break;
			default:
				break;
		}
		res.push(item);
	}
	return res;
};

const mustHaveValue = (configFields, data) => {
	for (let item of configFields) {
		if (item.required && !data[item.key] && data[item.key] !== false && data[item.key] !== 0) {
			message.warning(`${item.name}是必填项请填写`);
			return false;
		}
		if (item.required && typeof data[item.key] === 'object') {
			if (data[item.key].selects && JSON.stringify(data[item.key].selects) === '{}') {
				message.warning(`${item.name}是必填项请填写`);
				return false;
			}
		}
	}
	return true;
};

export {
	text,
	number,
	date,
	getFormArrayConfig,
	translateAddFields,
	transLateTimeTOUnix,
	format,
	mustHaveValue,
	taskNode,
	getSearchCondition,
};