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 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.name}`,
				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.name}`,
				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.name}`,
				required: !item.isNull,
				format: format[item.type],
				base52: item.base52,
			});
		} else {
			config.push({
				key: item.name,
				name: item.title,
				type: 'input',
				placeHolder: `请输入${item.name}`,
				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;
			});
		}
	});
  // 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.name && !!g.row_id;
          }).map((y) => {
            return {
              key: y[item.referenceCodeName],
              name: y[item.referenceNameName],
            };
          });
        }else {
          return [];
        }
      });
    }

    if (item.isGroupQuery && item.id && (!item.options || !item.options.length)) {
			// 获取下拉搜索条件的枚举项
			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,
};
