/**
  A data model representing the site (instance of Discourse)

  @class Site
  @extends Discourse.Model
  @namespace Discourse
  @module Discourse
**/
Discourse.Site = Discourse.Model.extend({

  notificationLookup: function() {
    var result = [];
    _.each(this.get('notification_types'), function(v,k) {
      result[v] = k;
    });
    return result;
  }.property('notification_types'),

  flagTypes: function() {
    var postActionTypes = this.get('post_action_types');
    if (!postActionTypes) return [];
    return postActionTypes.filterProperty('is_flag', true);
  }.property('post_action_types.@each'),

  sortedCategories: Em.computed.sort('categories', function(a, b) {
    return (b.get('topic_count') || 0) - (a.get('topic_count') || 0);
  }),

  postActionTypeById: function(id) {
    return this.get("postActionByIdLookup.action" + id);
  },

  topicFlagTypeById: function(id) {
    return this.get("topicFlagByIdLookup.action" + id);
  },

  updateCategory: function(newCategory) {
    var existingCategory = this.get('categories').findProperty('id', Em.get(newCategory, 'id'));
    if (existingCategory) existingCategory.mergeAttributes(newCategory);
  }
});

Discourse.Site.reopenClass(Discourse.Singleton, {

  /**
    The current singleton will retrieve its attributes from the `PreloadStore`.

    @method createCurrent
    @returns {Discourse.Site} the site
  **/
  createCurrent: function() {
    return Discourse.Site.create(PreloadStore.get('site'));
  },

  create: function() {
    var result = this._super.apply(this, arguments);

    if (result.categories) {
      var byId = {};
      result.categories = _.map(result.categories, function(c) {
        byId[c.id] = Discourse.Category.create(c);
        return byId[c.id];
      });

      // Associate the categories with their parents
      result.categories.forEach(function (c) {
        if (c.get('parent_category_id')) {
          c.set('parentCategory', byId[c.get('parent_category_id')]);
        }
      });
    }

    if (result.trust_levels) {
      result.trustLevels = result.trust_levels.map(function (tl) {
        return Discourse.TrustLevel.create(tl);
      });

      delete result.trust_levels;
    }

    if (result.post_action_types) {
      result.postActionByIdLookup = Em.Object.create();
      result.post_action_types = _.map(result.post_action_types,function(p) {
        var actionType = Discourse.PostActionType.create(p);
        result.postActionByIdLookup.set("action" + p.id, actionType);
        return actionType;
      });
    }

    if (result.topic_flag_types) {
      result.topicFlagByIdLookup = Em.Object.create();
      result.topic_flag_types = _.map(result.topic_flag_types,function(p) {
        var actionType = Discourse.PostActionType.create(p);
        result.topicFlagByIdLookup.set("action" + p.id, actionType);
        return actionType;
      });
    }

    if (result.archetypes) {
      result.archetypes = _.map(result.archetypes,function(a) {
        return Discourse.Archetype.create(a);
      });
    }

    return result;
  }
});


