/*globals labels, ajaxurl, TaxonomyTranslation, Backbone, jQuery, _, WPML_Translate_taxonomy */

(function () {
	"use strict";

	TaxonomyTranslation.models.Taxonomy = Backbone.Model.extend({

		defaults: function () {
			return {
				name: false,
				taxonomy: false,
				terms: {},
				parents: {},
				termNames: {},
				showSlugTranslationField: true
			};
		},

		initialize: function () {
			TaxonomyTranslation.data.termRowsCollection = new TaxonomyTranslation.collections.TermRows();
			this.setTaxonomy(this.get("taxonomy"));
		},

		setTaxonomy: function (taxonomy) {
			this.set("taxonomy", taxonomy, {silent: true});
			TaxonomyTranslation.data.termRowsCollection.reset();

			if (taxonomy !== undefined) {
				this.getTaxonomyTerms(taxonomy);
			} else {
				this.trigger('newTaxonomySet');
			}
		},

		getTaxonomyTerms: function (taxonomy) {
			var self = this;

			jQuery.ajax({
				url: ajaxurl,
				type: "POST",
				data: {
					action: 'wpml_get_terms_and_labels_for_taxonomy_table',
					nonce: labels.wpml_taxonomy_translation_nonce,
					taxonomy: taxonomy
				},
				success: function (response) {
					var termsData = response.terms;
					var labelsData = response.taxLabelTranslations;

					if (response.defaultLanguage) {
						self.set('defaultLang', response.defaultLanguage);
					}

					if (labelsData) {
						TaxonomyTranslation.data.translatedTaxonomyLabels = labelsData;
						TaxonomyTranslation.data.langSelector             = response.taxLangSelector;
						if (labelsData.st_default_lang) {
							self.set('stDefaultLang', labelsData.st_default_lang);
							self.set('showSlugTranslationField', labelsData[ labelsData.st_default_lang ]['showSlugTranslationField']);
						}
					} else {
						TaxonomyTranslation.data.translatedTaxonomyLabels = false;
					}

					if (response.bottomContent) {
						self.set('bottomContent', response.bottomContent);
					}

					if (termsData) {
						self.processData(termsData);
					} else {
						self.trigger('newTaxonomySet');
					}

				}
			});
		},

		processData: function (termsData) {

			var parentTermIDs = [],
				parents = {},
				termNames = {};

			_.each(termsData, function (tridGroup) {
				var termsObject = {};
				_.each(TaxonomyTranslation.data.activeLanguages, function (lang, code) {
					var term;
					if (tridGroup[code] !== undefined && tridGroup[code].term_taxonomy_id) {
						term = new TaxonomyTranslation.models.Term(tridGroup[code]);
						var parent = term.get("parent");
						if (parent > 0) {
							parentTermIDs.push(parent);
						}
						termsObject[code] = term;
						termNames[tridGroup[code].term_taxonomy_id] = tridGroup[code].name;
					}
				});
				TaxonomyTranslation.data.termRowsCollection.add(new TaxonomyTranslation.models.TermRow({
					trid: tridGroup.trid,
					terms: termsObject
				}));
			});

			_.each(termsData, function (tridGroup) {
				_.each(TaxonomyTranslation.data.activeLanguages, function (lang, code) {
					if (tridGroup[code] !== undefined && parentTermIDs.indexOf(tridGroup[code].term_id) !== -1) {
						parents[tridGroup[code].term_id] = tridGroup[code].name;
					}

				});
			});

			this.set("parents", parents, {silent: true});
			this.set("termNames", termNames, {silent: true});

			this.trigger('newTaxonomySet');
		},

		getOriginalTerm: function ( trid ) {
			var row = TaxonomyTranslation.data.termRowsCollection.get(trid);
			var originalTerm = null;
			var terms = row.get("terms");
			_.each( terms, function ( term ) {
				if ( term.get( "source_language_code") === null ) {
					originalTerm = term;
				}
			});
			return originalTerm;
		},
		getOriginalTermMeta: function( trid ) {
			var originalTerm = this.getOriginalTerm(trid),
				term_metas = [],
				original_meta_data;

			original_meta_data = originalTerm.get('meta_data');
			_.each( original_meta_data, function ( meta_data, meta_key ) {
				term_metas.push({
					'meta_key': meta_key,
					'meta_value': meta_data
				});
			});

			return term_metas;
		},
		getTermName: function (termID) {

			var res = "";
			if (termID > 0) {
				var termNames = this.get("termNames");
				res = termID in termNames ? termNames[termID] : "";
			}

			return res;
		},
		saveLabel: function (singular, plural, slug, lang) {
			var self = this;

			jQuery.ajax({
				url: ajaxurl,
				type: "POST",
				data: {
					action: 'wpml_tt_save_labels_translation',
					nonce: labels.wpml_taxonomy_translation_nonce,
					singular: singular,
					plural: plural,
					slug: slug,
					taxonomy_language_code: lang,
					taxonomy: self.get('taxonomy')
				},
				success: function (response) {
					if (response.data) {
						var newLabelData = response.data;
						if (newLabelData.singular && newLabelData.general && newLabelData.lang) {
							TaxonomyTranslation.data.translatedTaxonomyLabels[newLabelData.lang] = {
								singular: newLabelData.singular,
								general: newLabelData.general,
								slug: newLabelData.slug
							};
							WPML_Translate_taxonomy.callbacks.fire('wpml_tt_save_term_translation', self.get('taxonomy'));
							self.trigger("labelTranslationSaved");

							return self;
						}
					}
					self.trigger("saveFailed");
					return self;
				},
				error: function () {
					self.trigger("saveFailed");
					return self;
				}
			});
		},
		isHierarchical: function(){
			var self = this;

			return TaxonomyTranslation.data.taxonomies[self.get("taxonomy")].hierarchical;
		},
		loadSyncData: function (lang) {
			var self = this;

			jQuery.ajax({
				url: ajaxurl,
				type: "POST",
				data: {
					action: 'wpml_tt_sync_hierarchy_preview',
					_icl_nonce: labels.wpml_tt_sync_hierarchy_nonce,
					taxonomy: self.get('taxonomy'),
					ref_lang: lang
				},
				success: function (response) {
					TaxonomyTranslation.data.syncData = response.data;
					self.trigger('syncDataLoaded');
				}
			});
		},
		doSync: function (lang) {
			var self = this;
			var tax = self.get('taxonomy');
			jQuery.ajax({
				url: ajaxurl,
				type: "POST",
				data: {
					action: 'wpml_tt_sync_hierarchy_save',
					_icl_nonce: labels.wpml_tt_sync_hierarchy_nonce,
					taxonomy: tax,
					ref_lang: lang
				},
				success: function (response) {
					TaxonomyTranslation.data.syncData = response.data;
					self.setTaxonomy(tax);
				}
			});
		},

		changeTaxStringsLanguage: function(sourceLang) {
			var self = this;
			var tax = self.get('taxonomy');
			jQuery.ajax({
				url: ajaxurl,
				type: "POST",
				data: {
					action: 'wpml_tt_change_tax_strings_language',
					nonce: labels.wpml_taxonomy_translation_nonce,
					taxonomy: tax,
					source_lang: sourceLang
				},
				success: function () {
					self.setTaxonomy(tax);
				}
			});
		}
	});
})(TaxonomyTranslation);
