/**
 * @class Identity идентификационная информация (удостоверение) пользователя.
 *        Описывает пользователя и способ его аутентификации в системе. Данный
 *        класс является заглушкой, описывающей интерфейс, а также может
 *        использоваться для создания идентификацинной информации вручную.
 */
define([
    "dojo/_base/declare",
    "implab/safe",
    "./SecData"
], function (declare, safe, SecData) {
    let identity = declare(null, {
        _user : null,
        
        _isAnonymous : null,
        
        _secData : null,
        
        constructor : function(user, opts) {
            this._user = user;
            safe.mixin(this, opts, {
                isAnonymous : '_isAnonymous',
                secData : '_secData'
            });
        },
        
        getUser : function() {
            return this._user;
        },
        
        getSecData : function() {
            return this._secData;
        },
        
        /**
         * Проводит раунд аутентификации, изменяет текущее состояние. Делегирует
         * выполнение процедуры объекту SecData.
         * 
         * @param challenge
         *            {*} - данные для аутентификации, зависит от реализации,
         *            например, пароль.
         * @retuns authResult {Object} - результат аутентификации { challenge :
         *         'response data', code : AUTH_* }.
         * @throws {Error}
         *             в случае ошибки или если модуль аутентификации не задан.
         */
        doAuth : function(challenge) {
            if (this._secData)
                return this._secData.doAuth(challenge);
            
            throw new Error("Authentication is not available for this object");
        },
        
        getAuthType : function() {
            if (this._secData)
                return this._secData.getAuthType();
            
            return null;
        },
        
        getIsAuthenticated : function() {
            if (this._secData) {
                return this._secData.getAuthSate() == SecData.AUTH_SUCCESS;
            }
            return false;
        },
        
        getIsAnonymous : function() {
            return this._isAnonymous;
        },
        
        getAuthState : function() {
            if (this._secData)
                return this._secData.getAuthState();
            
            throw new Error("Authentication is not available for this object");
        }
    });
    
    return identity;
});