'use strict';

let config = {
    rules: [
        {method: 'required', param: []},
        {method: 'lte', param: [20]},
        {method: 'gte', param: [6]},
        {method: 'charLimit', param: []}
    ],
    msgs: {
        required: '由字母、数字组合,不能包含特殊字符',
        lte: '长度须在6-20个字符之间',
        gte: '长度须在6-20个字符之间',
        charLimit: '密码须为字母和数字组合'
    }
};

let validators = {
    required: function(val) {
        return !!val.length;
    },

    gte: function(val, param) {
        return val.length >= param;
    },

    lte: function(val, param) {
        return val.length <= param;
    },

    charLimit: function(val) {
        return /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/.test(val);
    }
};

function validate(val, callback) {
    let rules = config.rules,
        msgs = config.msgs,
        i, ruleLen;

    let name, param, errorMsg = '', pass = true;

    // apple rule one by one;
    for (i = 0, ruleLen = rules.length; i < ruleLen; i++) {
        name = rules[i].method;
        param = rules[i].param.concat();
        param.unshift(val);

        pass = validators[name].apply(this, param);

        if (!pass) {
            errorMsg = msgs[name];
            break;
        }
    }

    if (callback) {
        pass ? callback({valid: true}) : callback({valid: false, msg: errorMsg}); // eslint-disable-line
    }

    return pass;
}

// test
/* eslint-disable */
// validate('1234567', function(result) {console.log(result)})
// validate('12345', function(result) {console.log(result)});
// validate('a'.repeat(21), function(result) {console.log(result)});
// validate('1abcdefg', function(result) {console.log(result)});
/* eslint-enable */


module.exports = validate;