/**
  Our data model for interacting with site customizations.

  @class SiteCustomization
  @extends Discourse.Model
  @namespace Discourse
  @module Discourse
**/
Discourse.SiteCustomization = Discourse.Model.extend({
  trackedProperties: [
    'enabled', 'name',
    'stylesheet', 'header', 'top', 'footer',
    'mobile_stylesheet', 'mobile_header', 'mobile_top', 'mobile_footer',
    'head_tag', 'body_tag'
  ],

  description: function() {
    return "" + this.name + (this.enabled ? ' (*)' : '');
  }.property('selected', 'name', 'enabled'),

  changed: function() {
    var self = this;

    if (!this.originals) { return false; }

    var changed = _.some(this.trackedProperties, function (p) {
      return self.originals[p] !== self.get(p);
    });

    if (changed) { this.set('savingStatus', ''); }

    return changed;
  }.property('enabled', 'name', 'originals',
    'stylesheet', 'header', 'top', 'footer',
    'mobile_stylesheet', 'mobile_header', 'mobile_top', 'mobile_footer',
    'head_tag', 'body_tag'),

  startTrackingChanges: function() {
    var self = this;
    var originals = {};
    _.each(this.trackedProperties, function (prop) {
      originals[prop] = self.get(prop);
    });
    this.set('originals', originals);
  }.on('init'),

  previewUrl: function() { return "/?preview-style=" + this.get('key'); }.property('key'),
  disableSave: function() { return !this.get('changed') || this.get('saving'); }.property('changed'),

  save: function() {
    this.set('savingStatus', I18n.t('saving'));
    this.set('saving',true);

    var data = {
      name: this.name,
      enabled: this.enabled,
      stylesheet: this.stylesheet,
      header: this.header,
      top: this.top,
      footer: this.footer,
      mobile_stylesheet: this.mobile_stylesheet,
      mobile_header: this.mobile_header,
      mobile_top: this.mobile_top,
      mobile_footer: this.mobile_footer,
      head_tag: this.head_tag,
      body_tag: this.body_tag
    };

    var siteCustomization = this;
    return Discourse.ajax("/admin/site_customizations" + (this.id ? '/' + this.id : ''), {
      data: { site_customization: data },
      type: this.id ? 'PUT' : 'POST'
    }).then(function (result) {
      if (!siteCustomization.id) {
        siteCustomization.set('id', result.id);
        siteCustomization.set('key', result.key);
      }
      siteCustomization.set('savingStatus', I18n.t('saved'));
      siteCustomization.set('saving',false);
      siteCustomization.startTrackingChanges();
    });
  },

  destroy: function() {
    if (!this.id) return;
    return Discourse.ajax("/admin/site_customizations/" + this.id, { type: 'DELETE' });
  }
});

var SiteCustomizations = Ember.ArrayProxy.extend({
  selectedItemChanged: function() {
    var selected = this.get('selectedItem');
    _.each(this.get('content'), function (i) {
      i.set('selected', selected === i);
    });
  }.observes('selectedItem')
});

Discourse.SiteCustomization.reopenClass({
  findAll: function() {
    return Discourse.ajax("/admin/site_customizations").then(function (data) {
      var content = [];
      if (data) {
        content = data.site_customizations.map(function(c) {
          return Discourse.SiteCustomization.create(c);
        });
      }
      return SiteCustomizations.create({ content: content });
    });
  }
});
