const messages = {
    required: '{0}不能为空',
    notNull: '{0}不能为空',
    notEmpty: '{0}不能为空',
    notBlank: '{0}不能为空',
    maxLength: '{0}长度最多可以有{1}位，已超出{2}位',
    minLength: '{0}长度最少必须有{1}位，还缺少{2}位',
    number: '{0}必须为数字',
    integer: '{0}必须为整数',
    integerLength: '{0}整数位最多可以有{1}位，已超出{2}位',
    scale: '{0}小数位最多可以有{1}位，已超出{2}位',
    maxValue: '{0}最大可以为{1}',
    minValue: '{0}最小可以为{1}',
    email: '{0}不是正确的Email地址格式',
    idCardNo: '{0}不是正确的身份证号码格式',
    url: '{0}应为格式正确的网址链接绝对路径',
    opposableUrl: '{0}应为格式正确的网址链接绝对路径或相对路径',
    regex: '{0}格式错误{1}',
    notContains: '{0}不能包含：{1}',
    rejectHtmlTags: '{0}不能包含任何html标签',
    allowedHtmlTags: '{0}只能包含html标签：{1}，不可使用其它html标签',
    forbiddenHtmlTags: '{0}不能包含html标签：{1}，可以使用其它html标签',
    cellphone: '{0}不是正确的手机号码格式',
}

const regExps = {
    number: /^-?([1-9]\d{0,2}((,?\d{3})*|\d*)(\.\d*)?|0?\.\d*|0)$/,
    integer: /^(-?[1-9]\d{0,2}(,?\d{3}))|0*$/,
    email: /^[a-zA-Z0-9_-]([a-zA-Z0-9_\-.]{0,62})@[a-zA-Z0-9_-]([a-zA-Z0-9_\-.]{0,62})$/,
    idCardNo: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
    url: /^https?:\/\/[A-Za-z0-9]+(\.?[A-Za-z0-9_-]+)*(:[0-9]+)?(\/\S*)?$/,
    opposableUrl: /^(https?:\/)?\/[A-Za-z0-9]+(\.?[A-Za-z0-9_-]+)*(:[0-9]+)?(\/\S*)?$/,
    cellphone: /^1[3-9][0-9]{9}$/,
}

export default class Validator {

    getErrorMessage(validationName: string, fieldCaption: string = '', ...args: any[]): string {
        let message = messages[validationName];
        if (message) {
            message = message.replace('{0}', fieldCaption);
            for (let i = 0; i < args.length; i++) {
                message = message.replace('{' + (i + 1) + '}', args[i]);
            }
        }
        return message;
    }

    testRegExp(regExpName: string, fieldValue: string) {
        if (fieldValue) {
            let regExp = regExps[regExpName];
            return regExp && regExp.test(fieldValue);
        }
        return false;
    }

    validateRegExp(regExpName: string, fieldValue: string, fieldCaption?: string): string | undefined {
        if (!this.testRegExp(regExpName, fieldValue)) {
            return this.getErrorMessage(regExpName, fieldCaption);
        }
        return undefined;
    }

}
