angular.module('sharedModule')

.service('settingsDatasource', ['$q', 'external', 'settingsService', function ($q, external, settingsService) {
    var state = sessionStorage && sessionStorage['tradedoor_settings'] && JSON.parse(sessionStorage['tradedoor_settings']) || {
        status: 'notInitialized',
        settings: []
    };

    // Default values
    
    return {
        status: function() { return state.status; },
        settings: function() { return state.settings; },
        getAll: getAll,
        getValue: getValue,
        setValue: setValue
    };

    function getAll() {

        if (state.status === 'ready') {
            return;
        }

        var q = $q.defer();

        state.status = 'loading';

        settingsService.getAll().then(function(data) {
            
            state.settings = data;
            state.status = 'ready';

            // Provide default values
            setValue('product_search_type', getValue('product_search_type') || external().product_search_type || 'like');
            setValue('product_search_location', getValue('product_search_location') || external().product_search_location || 'National');

            if (sessionStorage) {
                sessionStorage.setItem('tradedoor_settings', JSON.stringify(state));
            }

            q.resolve(data);
        }, function(err) {
            state.status = 'failed';
            q.reject(err);
        });

        return q.promise;
    }

    function getValue(setting_name) {

        if (state.status !== 'ready') {
            return;
        }
        
        var found = (state.settings || [])
            .find(function (setting) { return setting.UserSetting.setting_name === setting_name; });
        
        return found && found.UserSetting.setting_value;
    }

    function setValue(setting_name, setting_value) {

        if (state.status !== 'ready') {
            return;
        }

        state.settings = (state.settings || [])
            .filter(function (setting) { return setting.UserSetting.setting_name !== setting_name; });

        state.settings.push(
            { UserSetting: { setting_name: setting_name, setting_value: setting_value } }
        );

        if (sessionStorage) {
            sessionStorage.setItem('tradedoor_settings', JSON.stringify(state));
        }

    }

}]);