Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/**
 * Ajoute un bouton dans la barre d'outils de l'éditeur wikicode pour copier
 * le Qid Wikidata de la page courante dans le presse-papiers (Ctrl+V pour coller).
 *
 * @author Claude (Anthropic) - Conversation avec Guillaumrs
 * @date Septembre 2026
 * @version 2.1
 */

( function () {
	'use strict';

	var isEditMode = mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit';
	if ( !isEditMode ) {
		return;
	}

	// Notification après copie (désactivable)
	if ( window.InsertQid_Notify === undefined ) {
		window.InsertQid_Notify = true;
	}

	var qid = null;
	var qidResolved = false;

	/***
	 * RÉCUPÉRATION DU QID VIA L'API
	 * Fonctionne en mode édition, contrairement à wgWikibaseItemId.
	 * mw.Api nécessite le module 'mediawiki.api', chargé explicitement ici
	 * pour éviter toute erreur si le module n'est pas encore prêt.
	 */

	function resolveQid( callback ) {
		var configQid = mw.config.get( 'wgWikibaseItemId' );
		if ( configQid ) {
			callback( configQid );
			return;
		}

		mw.loader.using( 'mediawiki.api', function () {
			try {
				var api = new mw.Api( { userAgent: 'Gadget-InsertQid' } );
				api.get( {
					action: 'query',
					prop: 'pageprops',
					titles: mw.config.get( 'wgPageName' ),
					ppprop: 'wikibase_item',
					formatversion: 2
				} ).done( function ( data ) {
					var page = data.query && data.query.pages && data.query.pages[0];
					var found = page && page.pageprops && page.pageprops.wikibase_item;
					callback( found || null );
				} ).fail( function () {
					callback( null );
				} );
			} catch ( e ) {
				console.error( '[InsertQid] Erreur lors de la résolution du Qid :', e );
				callback( null );
			}
		} );
	}

	/***
	 * COPIE DANS LE PRESSE-PAPIERS
	 */

	function copyToClipboard( text, onDone ) {
		if ( navigator.clipboard && navigator.clipboard.writeText ) {
			navigator.clipboard.writeText( text ).then( function () {
				onDone( true );
			} ).catch( function () {
				onDone( fallbackCopy( text ) );
			} );
		} else {
			onDone( fallbackCopy( text ) );
		}
	}

	function fallbackCopy( text ) {
		var tmp = document.createElement( 'textarea' );
		tmp.value = text;
		tmp.style.position = 'fixed';
		tmp.style.opacity = '0';
		document.body.appendChild( tmp );
		tmp.focus();
		tmp.select();
		var ok = false;
		try {
			ok = document.execCommand( 'copy' );
		} catch ( e ) {
			ok = false;
		}
		document.body.removeChild( tmp );
		return ok;
	}

	/***
	 * MISE À JOUR DE L'APPARENCE DU BOUTON UNE FOIS LE QID CONNU
	 */

	function updateButtonState( btn ) {
		if ( qid ) {
			btn.textContent = '🆔 Copier ' + qid;
			btn.title = 'Copie "' + qid + '" dans le presse-papiers (Ctrl+V pour coller)';
			btn.disabled = false;
			btn.style.opacity = '1';
		} else {
			btn.textContent = '🆔 Copier Qid';
			btn.title = 'Aucun élément Wikidata associé à cette page';
			btn.disabled = true;
			btn.style.opacity = '0.5';
		}
	}

	/***
	 * CRÉATION DU BOUTON
	 */

	function createButtonContainer() {
		var container = document.createElement( 'div' );
		container.style.cssText = 'margin: 8px 0; padding: 4px; background: #f8f9fa; border-radius: 3px; display: inline-block;';

		var btn = document.createElement( 'button' );
		btn.id = 'btn-insert-qid';
		btn.type = 'button';
		btn.className = 'mw-ui-button';
		btn.style.cssText = 'margin: 0 4px; padding: 6px 12px; cursor: pointer;';
		btn.textContent = '🆔 Chargement…';
		btn.disabled = true;
		btn.style.opacity = '0.5';

		btn.addEventListener( 'click', function () {
			if ( !qid ) {
				return;
			}
			var originalText = btn.textContent;
			copyToClipboard( qid, function ( success ) {
				if ( success ) {
					if ( window.InsertQid_Notify ) {
						mw.notify( 'Qid ' + qid + ' copié dans le presse-papiers (Ctrl+V pour coller).', { type: 'success', tag: 'InsertQid', autoHide: true, autoHideSeconds: 3 } );
					}
					btn.textContent = '✅ Copié !';
					setTimeout( function () { btn.textContent = originalText; }, 1500 );
				} else {
					mw.notify( 'Échec de la copie dans le presse-papiers.', { type: 'error', tag: 'InsertQid' } );
				}
			} );
		} );

		container.appendChild( btn );

		if ( qidResolved ) {
			updateButtonState( btn );
		}

		return { container: container, btn: btn };
	}

	/***
	 * PLACEMENT DANS LA BARRE D'OUTILS
	 */

	function placeButton() {
		if ( document.querySelector( '#btn-insert-qid' ) ) {
			return true;
		}

		var textarea = document.querySelector( '#wpTextbox1' );
		if ( !textarea ) {
			return false;
		}

		var colonnes2Btn = document.getElementById( 'btn-remove-obsolete' );
		var built = createButtonContainer();

		if ( colonnes2Btn && colonnes2Btn.parentElement ) {
			var colonnes2Container = colonnes2Btn.parentElement;
			colonnes2Container.parentElement.insertBefore( built.container, colonnes2Container.nextSibling );
		} else {
			var toolbar = document.querySelector( '.wikiEditor-ui-toolbar' ) ||
				document.querySelector( '.editOptions' ) ||
				textarea.parentElement;
			toolbar.appendChild( built.container );
		}

		mw.log( '✓ Bouton de copie Qid ajouté' );
		return true;
	}

	function addButtonWithRetry() {
		if ( placeButton() ) {
			return;
		}
		var tries = 0;
		var maxTries = 40;
		var interval = setInterval( function () {
			tries++;
			if ( placeButton() || tries >= maxTries ) {
				clearInterval( interval );
			}
		}, 250 );
	}

	/***
	 * LANCEMENT
	 * Le placement du bouton et la résolution du Qid sont indépendants :
	 * même si resolveQid échoue, le bouton doit apparaître (juste désactivé).
	 */

	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', addButtonWithRetry );
	} else {
		if ( mw.loader.getState( 'ext.wikiEditor' ) === 'ready' ) {
			mw.hook( 'wikiEditor.toolbarReady' ).add( addButtonWithRetry );
		}
		setTimeout( addButtonWithRetry, 500 );
	}

	resolveQid( function ( resolvedQid ) {
		qid = resolvedQid;
		qidResolved = true;
		var existingBtn = document.getElementById( 'btn-insert-qid' );
		if ( existingBtn ) {
			updateButtonState( existingBtn );
		}
	} );

}() );