/******************************************************
QuickReCat (QRC, Quick ReCategorization) - narzędzie dla administratorów do rekategoryzacji
Autor: ]
Wersja: 0.3.0
******************************************************/

var QuickReCat = {

	defaultReasons: [ //domyślne powody
		{
			button: 'standard',
			reason: 'standaryzacja'
		},
		{
			button: 'typo',
			reason: 'poprawa typografii'
		},
		{
			button: 'poprawnie',
			reason: 'poprawna forma'
		}
	],
	
	controlNum: 0, //hack; zmienna globalna, potrzebna do wyslania tylko ostatnio podanych danych
	
	createFieldSet: function() {
		// Tworzy diva, ktory jest glownym kontenerem
		jQuery('<div/>', {
			id: 'qrc-container',
			style: 'max-width: 750px; border: 1px solid #CCC; text-align:center; border-radius: 10px; padding: 15px; margin: 0 auto;'
		}).appendTo('#mw-content-text');

		// Tworzy fieldset layout.
		var qrc_fieldset = new OO.ui.FieldsetLayout({
			label: 'Quick ReCat',
			classes: 
		});

		var qrc_input_from = new OO.ui.TextInputWidget({
			placeholder: 'Obecny tytuł kategorii',
			"class": "qrc-input",
			id: 'qrc-from',
			required: true,
			validate: 'non-empty'
		});

		var qrc_input_to = new OO.ui.TextInputWidget({
			placeholder: 'Nowy tytuł kategorii',
			"class": "qrc-input",
			id: 'qrc-to',
			required: true,
			validate: 'non-empty'
		});

		var qrc_input_reason = new OO.ui.TextInputWidget({
			placeholder: 'Powód przenosin',
			"class": "qrc-input",
			id: 'qrc-reason',
			required: true,
			validate: 'non-empty',
		});

		//dołącza stworzone itemy do fieldsetu, przypisuje etykiety
		qrc_fieldset.addItems([
			new OO.ui.FieldLayout(qrc_input_from, {
				label: 'Obecny tytuł kategorii',
				align: 'right',
			}),

			new OO.ui.FieldLayout(qrc_input_to, {
				label: 'Nowy tytuł kategorii',
				align: 'right'
			}),

			new OO.ui.FieldLayout(qrc_input_reason, {
				label: 'Powód przenosin',
				align: 'right'
			}),
		]);

		//dołącza fieldset do kontenera
		$('#qrc-container').append(qrc_fieldset.$element);

		//div z domyslnymi powodami przenosin
		jQuery('<div/>', {
			id: 'qrc-default-reasons',
			style: 'width:100%; margin:5px; text-align: center;'
		}).appendTo('#qrc-container');

		for (var i = 0; i < QuickReCat.defaultReasons.length; i++) {
			jQuery('<span/>', {
				"class": 'qrc_reasonButton',
				style: 'border: 1px solid #6b8e23; background-color:#9acd32 ; font-size:75%; padding: 2px; margin: 2px;',
				title: QuickReCat.defaultReasons.reason,
				html: QuickReCat.defaultReasons.button
			}).appendTo('#qrc-default-reasons');
		}

		$(document).on('click', '.qrc_reasonButton', function() {
			console.log("QRC: Wybrano powód:" + $(this).attr('title'));
			qrc_input_reason.setValue($(this).attr('title'));
		});

		// Przycisk "Analizuj"
		var qrc_button_analyse = new OO.ui.ButtonInputWidget({
			type: 'submit',
			useInputTag: true,
			id: 'qrc-analyse-button',
			label: 'Analizuj',
			flags: [
				'primary',
				'progressive'
			]
		});

		$('#qrc-container').append(qrc_button_analyse.$element);

		//div na komunikaty otrzymywane pozniej
		jQuery('<div/>', {
			id: 'qrc-message-container',
			style: 'width:100%; margin:5px;'
		}).appendTo('#qrc-container');

		console.log("QRC: Utworzono formularz");
		// po kliknieciu na "Analizuj" -> idz do funkcji convertForm()
		var qrc_params ={};
		$(document).on('click', '#qrc-analyse-button', function() {
			QuickReCat.controlNum++;
			qrc_params = {
				from: qrc_input_from.getValue().trim(),
				to: qrc_input_to.getValue().trim(),
				reason: qrc_input_reason.getValue().trim(),
				worklist: 
			};
			QuickReCat.convertForm(qrc_params);
		});
	},

	convertForm: function(qrc_params) {
		//wyczyść dotychczasowe komunikaty (jeśli są)
		$('#qrc-message-container').empty();

		if (qrc_params.from.length !== 0 && qrc_params.to.length !== 0 && qrc_params.reason.length !== 0) {
			qrc_params.from = QuickReCat.niceCatName(qrc_params.from);
			qrc_params.to = QuickReCat.niceCatName(qrc_params.to);
			console.log("QRC: Formularz wypełniony poprawnie");
			QuickReCat.checkCats(qrc_params);
		}
	},

	checkCats: function(qrc_params) {
		var from_nr, from_tp, to_nr, to_tp;
		var params_from = {
			action: 'query',
			prop: 'info',
			inprop: 'talkid',
			titles: qrc_params.from,
			format: 'json'
		};
		var params_to = {
			action: 'query',
			prop: 'info',
			inprop: 'talkid',
			titles: qrc_params.to,
			format: 'json'
		};
		$.when(
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: params_from,
				success: function(data) {
					from_nr = Object.getOwnPropertyNames(data.query.pages);
					if (data.query.pages.talkid === undefined)
						from_tp = false;
					else
						from_tp = true;
				}
			}),
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: params_to,
				success: function(data) {
					to_nr = Object.getOwnPropertyNames(data.query.pages);
					if (data.query.pages.talkid === undefined)
						to_tp = false;
					else
						to_tp = true;
				}
			})).then(function checkCatsCallback(data1, data2) {
			if (from_nr > 0 && to_nr < 0 && to_tp === false && qrc_params.to != qrc_params.from) {
				QuickReCat.displayMsg("Można wykonać przenosiny z $1 do $2.", 'success', qrc_params.from, qrc_params.to);
				if (from_tp)
					QuickReCat.displayMsg("Wraz z $1 przeniesiona zostanie jej strona dyskusji.", 'info', qrc_params.from);

				QuickReCat.getCategoryMembers(qrc_params); //teraz pora zdobyć listę stron w kategorii
			} else {
				if (from_nr < 0)
					QuickReCat.displayMsg("$1 nie istnieje, a powinna.", 'error', qrc_params.from);
				if (to_nr > 0)
					QuickReCat.displayMsg("$1 istnieje, a nie powinna.", 'error', qrc_params.to);
				if (to_nr < 0 && to_tp === true)
					QuickReCat.displayMsg("Mimo że, $1 nie istnieje, to istnieje strona dyskusji. Zajmij się nią zanim dokonasz przenosin.", 'error', qrc_to);
				if (qrc_params.to == qrc_params.from)
					QuickReCat.displayMsg("Obie kategorie mają takie same nazwy. Nie mogę przenieść kategorii w to samo miejsce.", 'error');
			}
		});

	},

	editPage: function(qrc_params, qrc_iterator) {
		QuickReCat.displayMsg("Poprawianie kategorii na stronach ($1)...<br />$2", 'editinfo', (qrc_iterator + 1) + "/" + qrc_params.worklist.length, qrc_params.worklist);
		console.log("QRC: Edytuję stronę "+qrc_params.worklist);
		var params = {
			action: 'query',
			prop: 'revisions',
			titles: qrc_params.worklist,
			rvprop: 'content',
			rvlimit: 1,
			format: 'json'
		};
		$.ajax({
			url: mw.util.wikiScript('api'),
			data: params,
			success: function(data) {
				/*Pobieranie ostatniej wersji artykułu*/
				for (var pageid in data.query.pages)
					break;
				var temp = data.query.pages;

				var qrc_text = temp.revisions ? temp.revisions : ''; //tekst ostatniej wersji artykułu
				var qrc_newtext = qrc_text;

				var qrc_modcat = qrc_params.from.replace(/Kategoria:/gi, '');
				qrc_modcat = QuickReCat.escapeRegExp(qrc_modcat);
				qrc_modcat = qrc_modcat.replace(/ /g, "\*");

				// usuwanie unikodowych znaków sterujących - zaczerpnięte z ]
				qrc_newtext = qrc_newtext.replace(//g, '');

				/*Dwa przypadki - w kategorii może być klucz sortowania lub nie */
				var qrc_fromregex = new RegExp("\\[\\[\\s*(Category|Kategoria)\\s*\\:\\s*" + qrc_modcat + "\\s*\\|", "gi");
				var qrc_fromregex2 = new RegExp("\\\\]", "gi");

				qrc_newtext = qrc_newtext.replace(qrc_fromregex, "[[" + qrc_params.to + "|");
				qrc_newtext = qrc_newtext.replace(qrc_fromregex2, "]");

				/*Prosta obsługa błedów*/
				if ((qrc_text == qrc_newtext && qrc_text !== '') || qrc_newtext == qrc_text.replace(//g, '')) {
					QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie ]. Możliwe, że kategoria dodawana jest za pomocą szablonów.", 'error', qrc_params.worklist);
					console.warn("QRC: {1) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist);
					
					if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
						QuickReCat.editPage(qrc_params, qrc_iterator + 1);
					}
				} else if (qrc_text === '') {
					QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie ]. Możliwe, że strona nie istnieje.", 'error', qrc_params.worklist);
					console.warn("QRC: (2) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist);
					
					if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
						QuickReCat.editPage(qrc_params, qrc_iterator + 1);
					}
				} else /*Jeśli dobrze - zapisz*/ {
					var editparams = {
						action: 'edit',
						title: qrc_params.worklist,
						text: qrc_newtext,
						token: mw.user.tokens.get('csrfToken'),
						tags: "QRC",
						summary: "Zmiana nazwy kategorii: " + qrc_params.from + " → ]  (przy użyciu ])",
						minor: true,
						bot: true,
						format: 'json'
					};
					$.ajax({
						url: mw.util.wikiScript('api'),
						type: "POST",
						data: editparams,
						success: function(data) {
							if ((qrc_iterator + 1) < qrc_params.worklist.length) {
								QuickReCat.editPage(qrc_params, qrc_iterator + 1);
							}
							else {
								QuickReCat.displayMsg("Skrypt zakończył działanie. Odśwież, by zmienić kolejną kategorie.", "editinfo");
								var qrc_button_refresh = new OO.ui.ButtonInputWidget({
									type: 'submit',
									useInputTag: true,
									id: 'qrc-refresh-button',
									label: 'ODŚWIEŻ!',
									flags: [
										'primary',
										'progressive'
									]
								});
								$('#qrc-container').append(qrc_button_refresh.$element);
								$(document).on('click', '#qrc-refresh-button', function() {
									location.reload();
								});
							}

						},
						error: function(data) {
							QuickReCat.displayMsg("Błąd podczas zapisywania strony: $1", 'error', data.error.info);
							console.error("QRC: Błąd podczas zapisu edycji na stronie: " + qrc_params.worklist);
						}
					});
				}
			},
			error: function(data) {
				QuickReCat.displayMsg("Błąd podczas pobierania zawartości strony: $1", 'error', data.error.info);
				console.error("QRC: Błąd podczas pobierania zawartości strony: " + qrc_params.worklist);
			}
		});
	},


	getCategoryMembers: function(qrc_params)
	{
		var qrc_continue = "";
		var qrc_query_params = {
			action: 'query',
			list: 'categorymembers',
			cmtitle: qrc_params.from,
			cmprop: 'title',
			cmlimit: 1000,
			cmcontinue: qrc_continue,
			format: 'json'
		};

		var getCategoryMembersRead = function(data) {
			for (var i = 0; i < data.query.categorymembers.length; i++)
				qrc_params.worklist.push(data.query.categorymembers.title);
			if (data === undefined) {
				QuickReCat.displayMsg("W $1 znajduje się $2 stron.", 'info', qrc_params.from, qrc_params.worklist.length);

				if (mw.config.get("wgUserGroups").indexOf("flood") == -1 && qrc_params.worklist.length > 10)
					QuickReCat.displayMsg("Zostaną wykonane zmiany na więcej niż 10 stronach ($1). Rozważ, czy nie warto włączyć <i>flood flagi</i>.", 'info', qrc_params.worklist.length);
				QuickReCat.displayMsg("Klikając przycisk „Potwierdzam!” jesteś odpowiedzialny za wszystkie merytoryczne zmiany, " +
					"które zostaną wykonane na stronach Wikipedii. Upewnij się, że wprowadzone parametry są prawidłowe.", 'warning');

				//przycisk potwierdzajacy
				var qrc_button_confirm = new OO.ui.ButtonInputWidget({
					type: 'submit',
					useInputTag: true,
					id: 'qrc-confirm-button'+QuickReCat.controlNum,
					label: 'POTWIERDZAM!',
					disabled: true,
					flags: [
						'primary',
						'progressive'
					]
				});

				$('#qrc-message-container').append(qrc_button_confirm.$element);

				setTimeout(function() {
					qrc_button_confirm.setDisabled(false);
				}, 1000);

				$(document).one('click', '#qrc-confirm-button'+QuickReCat.controlNum, function() {
					console.log("QRC: Kliknięto przycisk 'Potwierdzam'");
					$('#qrc-message-container').empty();
					$('#qrc-analyse-button').prop('disabled', true);
					QuickReCat.moveCats(qrc_params);
				});
			} else {
				qrc_continue = data;
				getCategoryMembersContinue();
			}
		};
		var getCategoryMembersContinue = function() {
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: qrc_query_params,
				success: getCategoryMembersRead
			});
		};

		$.ajax({
			url: mw.util.wikiScript('api'),
			data: qrc_query_params,
			success: getCategoryMembersRead,
			error: function(data) {
				console.error("QRC: Nie można pobrać listy stron należącej do kategorii")
			}
		});
	},

	moveCats: function(qrc_params) {
		var qrc_corr;
		$.ajax({
			url: mw.util.wikiScript('api'),
			type: "POST",
			data: {
				action: 'move',
				from: qrc_params.from,
				to: qrc_params.to,
				tags: "QRC",
				reason: qrc_params.reason + " (przy użyciu ])",
				token: mw.user.tokens.get('csrfToken'),
				noredirect: true,
				movetalk: true,
				format: 'json'
			},
			success: function(data) {
				QuickReCat.displayMsg("Kategoria przeniesiona!", 'success');
				console.log("QRC: Kategoria przeniesiona pomyślnie, rozpoczynam poprawianie stron");
				QuickReCat.editPage(qrc_params, 0);
			},
			error: function(data) {
				QuickReCat.displayMsg("Błąd: $1", 'error', data.error.info);
				console.error("QRC: Błąd przenosin kategorii: " + data.error.info);
			}
		});
	},

	displayMsg: function(qrc_msg, qrc_msgtype, qrc_msgParam1, qrc_msgParam2) {
		$('#qrc-message-container').css({
			'border-top': '1px solid #EEE',
			'padding-top': '5px',
			'margin-top': '5px'
		});

		if (typeof qrc_msgParam1 !== undefined) {
			qrc_msg = qrc_msg.replace('$1', qrc_msgParam1);
			if (typeof qrc_msgParam2 !== undefined)
				qrc_msg = qrc_msg.replace('$2', qrc_msgParam2);
		}

		if ($('#qrc_editinfo').length !== 0 && qrc_msgtype == 'editinfo') {
			document.getElementById('qrc_editinfo').innerHTML = "<b>INFO:</b> " + qrc_msg;
			return;
		}

		var msgbox = document.createElement('div');
		msgbox.style.width = "90%";
		msgbox.style.margin = "0 auto";
		msgbox.style.marginBottom = "5px";
		msgbox.style.padding = "2px 5px 2px 20px";
		msgbox.style.borderRadius = "0.2em";
		msgbox.style.textAlign = "left";
		if (qrc_msgtype == 'error') {
			msgbox.style.backgroundColor = "#FF9494";
			msgbox.style.border = "2px solid #CB4154";
			msgbox.innerHTML = "<b>BŁĄD:</b> ";
		}
		if (qrc_msgtype == 'success') {
			msgbox.style.backgroundColor = "#93DB70";
			msgbox.style.border = "2px solid #659D32";
			msgbox.innerHTML = "<b>OK:</b> ";
		}
		if (qrc_msgtype == 'info') {
			msgbox.style.backgroundColor = "#78b1dd";
			msgbox.style.border = "2px solid #2b73ab";
			msgbox.innerHTML = "<b>INFO:</b> ";
		}
		if (qrc_msgtype == 'warning') {
			msgbox.style.backgroundColor = "#FFCC00";
			msgbox.style.border = "2px solid #FF6600";
			msgbox.innerHTML = "<b>UWAGA:</b> ";
		}
		if (qrc_msgtype == 'editinfo') {
			msgbox.style.backgroundColor = "#78b1dd";
			msgbox.style.border = "2px solid #2b73ab";
			msgbox.id = "qrc_editinfo";
			msgbox.innerHTML = "<b>INFO:</b> ";
		}
		msgbox.innerHTML += qrc_msg;
		$(msgbox).appendTo('#qrc-message-container');
	},

	niceCatName: function(qrc_catName) {
		//otrzymujemy ładne nazwy kategorii: Kategoria:Nazwa
		qrc_catName = qrc_catName.replace(/Kategoria:/gi, '');
		qrc_catName = qrc_catName.replace(/\s+/g, ' ');
		qrc_catName = qrc_catName.trim().charAt(0).toUpperCase() + qrc_catName.trim().slice(1);
		return "Kategoria:" + qrc_catName;
	},
	escapeRegExp: function(qrc_catName) {
		return qrc_catName.replace(/{}]/g, '\\$&');
	}
};

$(document).ready(function()
{
	mw.loader.using().done(function() {
	if(mw.config.get('wgPageName')=="Specjalna:Pusta_strona/QRC" && (mw.config.get("wgUserGroups").indexOf("sysop")>=0 || mw.config.get("wgUserGroups").indexOf("bot")>=0))
	{
		$( '#mw-content-text' ).empty();
		var qrc_p=document.createElement('p');
		qrc_p.innerHTML="Narzędzie QuickReCat (QRC) pozwala na szybką zmianę kategorii. <a href=\"https://wiki95.com/pl/Wikipedysta:Tufor/Quick_ReCat\">Dokumentacja</a>.";
		$( '#mw-content-text' ).append( qrc_p );
		QuickReCat.createFieldSet();
	}
	});
});