/*\
module-type: startup

Replaces the relinkTiddler defined in $:/core/modules/wiki-bulkops.js

This is a startup instead of a wikimethods module-type because it's the only
way to ensure this runs after the old relinkTiddler method is applied.

\*/
(function(){

/*jslint node: false, browser: true */
/*global $tw: false */
"use strict";

var language = require('$:/plugins/flibbles/relink/js/language.js');
var utils = require("$:/plugins/flibbles/relink/js/utils.js");

exports.name = "redefine-relinkTiddler";
exports.synchronous = true;
// load-modules is when wikimethods are applied in
// ``$:/core/modules/startup/load-modules.js``
exports.after = ['load-modules'];
// We come before commands because they may do renaming, or jasmine testing
exports.before = ['commands'];

exports.startup = function() {
	$tw.Wiki.prototype.relinkTiddler = relinkTiddler;
};

/** Walks through all relinkable tiddlers and relinks them.
 *  This replaces the existing function in core Tiddlywiki.
 */
function relinkTiddler(fromTitle, toTitle, options) {
	options = options || {};
	var failures = [];
	var indexer = utils.getIndexer(this);
	var records = indexer.relinkLookup(fromTitle, toTitle, options);
	for (var title in records) {
		var entries = records[title],
			changes = Object.create(null),
			update = false,
			fails = false;
		for (var field in entries) {
			var entry = entries[field];
			fails = fails || entry.impossible;
			if (entry.output !== undefined) {
				changes[field] = entry.output;
				update = true;
			}
		}
		if (fails) {
			failures.push(title);
		}
		// If any fields changed, update tiddler
		if (update) {
			console.log("Renaming '"+fromTitle+"' to '"+toTitle+"' in '" + title + "'");

			var tiddler = this.getTiddler(title);
			var modifyField = utils.touchModifyField(this) ? this.getModificationFields() : undefined;
			var newTiddler = new $tw.Tiddler(tiddler,changes,modifyField)
			newTiddler = $tw.hooks.invokeHook("th-relinking-tiddler",newTiddler,tiddler);
			this.addTiddler(newTiddler);
			// If the title changed, we need to perform a nested rename
			if (newTiddler.fields.title !== title) {
				this.deleteTiddler(title);
				this.relinkTiddler(title, newTiddler.fields.title,options);
			}
		}
	};
	if (failures.length > 0) {
		var options = $tw.utils.extend(
			{ variables: {to: toTitle, from: fromTitle},
			  wiki: this},
			options );
		language.reportFailures(failures, options);
	}
};

})();