define([
    "dojo/_base/declare", "dojo/node!crypto"], function (declare, crypto) {
    let SecData = declare(null, {
        _state: null,
        _token: null,
        _authType: null,

        constructor: function (authType) {
            this._authType = authType;
        },

        /**
         * Проводит раунд аутентификации, изменяет текущее состояние.
         * @param challenge {*} - данные для аутентификации, зависит от реализации, например, пароль.
         * @retuns authResult {Object} - результат аутентификации { challenge : 'response data', code : AUTH_* }.
         */
        doAuth: function (challenge) {
            let password = challenge;

            if (this.validateHash(password)) {
                this._state = SecData.AUTH_SUCCESS;
            } else {
                this._state = SecData.AUTH_FAIL;
            }

            return {
                code: this._state
            };

        },
        getAuthState: function () {
            return this._state;
        },
        getAuthType: function () {
            return this._authType;
        },

        generateHash: function (password) {
            return md5hex(password);
        },
        parse: function (token) {
            this._token = token;
        },

        validateHash: function (password) {
            return this.generateHash(password) == this._token;
        }
    });


    SecData.AUTH_SUCCESS = 0;
    SecData.AUTH_INCOMPLETE = 1;
    SecData.AUTH_FAIL = 2;


    function md5hex() {
        let md5 = crypto.createHash('md5');

        for (let i = 0; i < arguments.length; i++)
            md5.update(String(arguments[i]));

        return md5.digest('hex');
    }

    let i = 0;

    SecData.md5hex = md5hex;
    SecData.newSSID = function () {
        return md5hex(new Date().getTime(), Math.random(), i++);
    };

    return SecData;
});