import { traduction } from '@/utils/language';
import { IRule } from '@/model/Service/vnc-interface';
import { securityColors } from '@/model/colors';
import { pwdLevelFn } from '@/validators/get-security-level';
export function rangeVerification(rule: IRule, val: string | number, callback: any) {
const { max, min, message, required, isInteger } = rule;
if (required && !val && val !== 0) {
callback(new Error(message));
return false;
}
if (val || val === 0) {
const reg = /^[+-]?(0|([1-9]\d*))(\.\d+)?$/;
if (!reg.test(String(val))) {
callback(new Error(message));
return false;
}
if (isInteger && String(val).indexOf('.') >= 0) {
callback(new Error(message));
return false;
}
const valTemp = Number(val);
if (!rangeVerificationOfMinMax({ max, min, valTemp, callback, message })) {
return false;
}
}
callback();
return true;
}
function rangeVerificationOfMinMax(actions: any) {
const { max, min, valTemp, callback, message } = actions;
if ((min || min === 0) && valTemp < min) {
callback(new Error(message));
return false;
}
if ((max || max === 0) && valTemp > max) {
callback(new Error(message));
return false;
}
return true;
}
function lenAndMatchValidate(
val: string,
callback: any,
containsEmptyString: any,
matchRule: any,
minLength?: number,
message?: string,
maxLength?: number
): boolean {
if (minLength && val.length < minLength) {
callback(new Error(message));
return false;
}
if (maxLength && val.length > maxLength) {
callback(new Error(message));
return false;
}
if (!containsEmptyString && val.indexOf(' ') > -1) {
callback(new Error(message));
return false;
}
if (matchRule) {
if (matchRule instanceof RegExp && !matchRule.test(val)) {
callback(new Error(message));
return false;
} else if (matchRule instanceof Array) {
for (let i = 0; i < matchRule.length; i++) {
if (matchRule[i] instanceof RegExp && !matchRule[i].test(val)) {
callback(new Error(message));
return false;
}
}
}
}
return true;
}
export function strVerification(rule: IRule, val: string, callback: any) {
const {
maxLength,
minLength,
message,
errorMsg,
required,
matchRule,
equals,
containsEmptyString
} = rule;
const str = traduction('COMMON_FORMAT_ERROR');
if (required && !val) {
callback(new Error(str));
return false;
}
const errMsg = message || errorMsg;
if (val) {
if (
!lenAndMatchValidate(
val,
callback,
containsEmptyString,
matchRule,
minLength,
errMsg,
maxLength
)
) {
return false;
}
}
if (equals) {
if (
typeof equals === 'object' &&
equals instanceof Object &&
val !== equals.aimObj[equals.aimObjKey]
) {
equals.aimObj[equals.aimObjKey];
callback(new Error(errMsg));
return false;
} else if (val !== equals && typeof equals === 'string') {
callback(new Error(errMsg));
return false;
}
}
callback();
return true;
}
function requiredAndSecurity(
val: string,
callback: any,
verificationList: any,
security: boolean,
message?: string,
required?: boolean
) {
if (!required && !val) {
callback();
return true;
} else {
let num = 0;
verificationList.forEach((item: any) => {
if (item.state) {
num++;
}
});
if (security) {
if (num === verificationList.length - 1) {
callback();
return true;
}
} else {
if (num === verificationList.length) {
callback();
return true;
}
}
callback(new Error(message));
return false;
}
}
export function passwordVerification(rule: IRule, val: string, callback: any) {
const { message, required } = rule;
if (required && !val) {
callback(new Error(message));
return false;
}
let security = false;
const { verificationList } = rule;
if (
verificationList &&
typeof verificationList === 'object' &&
verificationList instanceof Array
) {
verificationList.forEach((item: any) => {
const { validator } = item;
if (validator && typeof validator === 'function' && validator instanceof Function) {
item.state = validator(item, val);
if (item.security) {
security = true;
const level = pwdLevelFn(val, verificationList);
setCircleAndLineStyle(level, item, val);
}
}
});
} else {
callback();
return false;
}
return requiredAndSecurity(val, callback, verificationList, security, message, required);
}
export function lengthVerification(rule: IRule, val: string) {
const { rangeSize } = rule;
if (
rangeSize &&
typeof rangeSize === 'object' &&
rangeSize instanceof Array &&
rangeSize.length >= 2
) {
return val.length >= rangeSize[0] && val.length <= rangeSize[1];
} else if (
rangeSize &&
typeof rangeSize === 'object' &&
rangeSize instanceof Array &&
rangeSize.length === 1
) {
return val.length === rangeSize[0];
} else if (rangeSize && typeof rangeSize === 'number') {
return val.length === rangeSize;
}
return false;
}
export function setCircleAndLineStyle(level: number, securityItem: any, value: any) {
if (value === '') {
securityItem.circleAndLineStyles = ['', '', ''];
securityItem.securityDescription = '';
securityItem.descriptionTextColor = '';
return;
}
let background = 'background:';
switch (level) {
case 1: {
background += securityColors.middle;
securityItem.circleAndLineStyles = [background, background, ''];
securityItem.securityDescription = traduction('COMMON_SECURITY_MIDDLE');
securityItem.descriptionTextColor = securityColors.middle;
break;
}
case 2: {
background += securityColors.strong;
securityItem.circleAndLineStyles = [background, background, background];
securityItem.securityDescription = traduction('COMMON_SECURITY_STRONG');
securityItem.descriptionTextColor = securityColors.strong;
break;
}
default: {
background += securityColors.weak;
securityItem.circleAndLineStyles = [background, '', ''];
securityItem.securityDescription = traduction('COMMON_SECURITY_WEAK');
securityItem.descriptionTextColor = securityColors.weak;
}
}
}
export function matchRuleVerification(rule: IRule, val: string) {
const { matchRule } = rule;
if (matchRule) {
if (typeof matchRule === 'object' && matchRule instanceof Array) {
const { minCharType } = rule;
let num = 0;
matchRule.forEach((item: any) => {
if (item instanceof RegExp && item.test(val)) {
num++;
}
});
if (minCharType) {
return num >= minCharType;
} else {
return num === matchRule.length;
}
} else if (typeof matchRule === 'object' && matchRule instanceof RegExp) {
return matchRule.test(val);
}
}
return false;
}
export function containsEmptyStringVerification(rule: IRule, val: string) {
if (!val) {
return false;
}
const { containsEmptyString } = rule;
if (!containsEmptyString && val.indexOf(' ') > -1) {
return false;
}
return true;
}