(function () {
  var ns = $.namespace("pskl");

  ns.UserSettings = {

    SHOW_GRID : 'SHOW_GRID',
    CANVAS_BACKGROUND : 'CANVAS_BACKGROUND',

    KEY_TO_DEFAULT_VALUE_MAP_ : {
      'SHOW_GRID' : false,
      'CANVAS_BACKGROUND' : 'medium-canvas-background' 
    },

    /**
     * @private
     */
    cache_ : {},

    /**
     * Static method to access a user defined settings value ot its default 
     * value if not defined yet.
     */
    get : function (key) {
      this.checkKeyValidity_(key);
      if (!(key in this.cache_)) {
        this.cache_[key] =
          this.readFromLocalStorage_(key) || this.readFromDefaults_(key);
      }
      return this.cache_[key];
    },

    set : function (key, value) {
      this.checkKeyValidity_(key);
      this.cache_[key] = value;
      this.writeToLocalStorage_(key, value);

      $.publish(Events.USER_SETTINGS_CHANGED, [key, value]);    
    },

    /**
     * @private
     */
    readFromLocalStorage_ : function(key) {
      var value = window.localStorage[key];
      if (typeof value != "undefined") {
        value = JSON.parse(value);
      }
      return value;
    },

    /**
     * @private
     */
    writeToLocalStorage_ : function(key, value) {
      // TODO(grosbouddha): Catch storage exception here.
      window.localStorage[key] = JSON.stringify(value);
    },

    /**
     * @private
     */
    readFromDefaults_ : function (key) {
      return this.KEY_TO_DEFAULT_VALUE_MAP_[key];
    },

    /**
     * @private
     */
    checkKeyValidity_ : function(key) {
      if(!(key in this.KEY_TO_DEFAULT_VALUE_MAP_)) {
        // TODO(grosbouddha): Define error catching strategy and throw exception from here.
        console.log("UserSettings key <"+ key +"> not find in supported keys.");
      }
    }
  };
})();