/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 ONOS GUI -- Util -- User Preference Service
 */
(function () {
    'use strict';

    // injected refs
    var $log, $cookies;

    // internal state
    var cache = {};

    // NOTE: in Angular 1.3.5, $cookies is just a simple object, and
    //       cookie values are just strings. From the 1.3.5 docs:
    //
    //       "Only a simple Object is exposed and by adding or removing
    //        properties to/from this object, new cookies are created/deleted
    //        at the end of current $eval. The object's properties can only
    //        be strings."
    //
    //       We may want to upgrade the version of Angular sometime soon
    //        since later version support objects as cookie values.

    // NOTE: prefs represented as simple name/value(number) pairs
    //       => a temporary restriction while we are encoding into cookies
    /*
        {
          foo: 1,
          bar: 0,
          goo: 2
        }

        stored as "foo:1,bar:0,goo:2"
     */

    // reads cookie with given name and returns an object rep of its value
    // or null if no such cookie is set
    function getPrefs(name) {
        var cook = $cookies[name],
            bits,
            obj = {};

        if (cook) {
            bits = cook.split(',');
            bits.forEach(function (value) {
                var x = value.split(':');
                obj[x[0]] = Number(x[1]);
            });

            // update the cache
            cache[name] = obj;
            return obj;
        }
        // perhaps we have a cached copy..
        return cache[name];
    }

    function setPrefs(name, obj) {
        var bits = [],
            str;

        angular.forEach(obj, function (value, key) {
            bits.push(key + ':' + value);
        });
        str = bits.join(',');

        // keep a cached copy of the object
        cache[name] = obj;

        // The angular way of doing this...
        // $cookies[name] = str;
        //  ...but it appears that this gets delayed, and doesn't 'stick' ??

        // FORCE cookie to be set by writing directly to document.cookie...
        document.cookie = name + '=' + encodeURIComponent(str);
        $log.debug('<<>> Wrote cookie <'+name+'>:', str);
    }

    angular.module('onosUtil')
    .factory('PrefsService', ['$log', '$cookies',
        function (_$log_, _$cookies_) {
            $log = _$log_;
            $cookies = _$cookies_;

            return {
                getPrefs: getPrefs,
                setPrefs: setPrefs
            };
        }]);

}());
