import validate from './validate.js'
// 默认校验规则
const rules = {
	// 自定义规则
	...validate,
	// 数据类型
	type: function(val, param) {
		let msgObj = {'string': '字符串', 'boolean': '布尔值', 'objec': '对象'}
		if(param[0] == 'number') {
			if(val == '' || isNaN(Number(val))) {
				return '不是一个数字'
			}
		} else if(typeof val != param[0]){
			return msgObj[param[0]] ? '不是' + msgObj[param[0]] : '数据类型不符合'
		}
		return true
	},
	// 值 小于等于
	max: function(val, param) {
		let msg = this.type(val,['number'])
		if(msg !== true) {
			return msg
		}
		if(val > param[0]) {
			return '值不能超过' + param[0]
		}
		return true
	},
	// 值 大于等于
	min: function(val, param) {
		let msg = this.type(val,['number'])
		if(msg !== true) {
			return msg
		}
		if(val.length < param[0]) {
			return '值不能小于' + param[0]
		}
		return true
	},
	/*
	* 长度范围
	* 1. length:2   长度等于某值
	* 2. length:0,2 长度在某区间
	* 3. length:2,~ 长度不小于
	* 4. length:~,5 长度不大于
	*/
	length: function(val, param) {
		if(param.length > 1) {
			if(param[1].trim() == '~' && val.length < param[0]) {
				return '长度不能小于' + param[0]
			} else if (param[0].trim() == '~'  && val.length > param[1]){
				return '长度不能超过' + param[1]
			} else if(val.length < param[0] || val.length > param[1]) {
				return '长度应在' + param[0] + '~' + param[1] + '之间'
			}
		}else if(val.length != param[0]){
			return '长度应等于' + param[0]
		}
		return true
	},
	// 值的范围
	between: function(val, param) {
		if(param.length > 1) {
			if(Number(val) < Number(param[0]) || Number(val) > Number(param[1])) {
				return '应在' + param[0] + '~' + param[1] + '之间'
			}
		}else if(val != param[0]){
			return '应等于' + param[0]
		}
		return true
	},
	// 校验值在给定的值中
	in: function(val, param) {
		if(!param.includes(val)){
			return '应该在' + param.join() + '之中'
		}
		return true
	},
	// 校验值是否与某字段值相等
	eq: function(val, param, from) {
		if(from[param[0]] && val != from[param[0]]){
			return '与' + param[0] + '不相等'
		}
		return true
	},
	reg: function(val, param) {
		var reg = new RegExp(param);
		if (!reg.test(val)) {
			return '不符合正则'
		}
		return true
	},
	date: function(val) {
		if (new Date(val).getDate()!=val.substring(val.length-2)) {
			return '不是一个有效的日期'
		}
		return true
	},
}
// 字符串转数组
function getArr(val,str) {
	return val.split ? val.split(str) : val
}
// 表单默认规则校验 通过返回 true 不通过返回对象 {msg:'不通过原因','rule': '规则名'}
export const fromCheck = function(val, rule,form) {
	// 'type: string|length:5|in:1,3|between:0,5' 字符串形式
	// ['type: string','length:5','in:1,3','between:0,5'] // 数组、字符串混合
	// ['string',['length',5],['in',[1,3],['between', [0,5]]]] 最终形式
	rule = getArr(rule,'|')
	const len = rule.length;
	for (let i = 0; i < len; ++i ) {
		let key = '',param = ''
		if(rule[i].indexOf('reg') == 0){
			// 正则
			key = 'reg'
			param = rule[i].slice(rule[i].indexOf(':') + 1)
		}else{
			rule[i] = getArr(rule[i],':')
			key = rule[i][0].trim()
			param = rule[i][1] ? getArr(rule[i][1],',') : [];
		}
		if(!rules[key]) continue
		let msg = rules[key](val, param, form)
		if(msg !== true) {
			return {msg:msg,rule: key}
		}
	}
	return true
}