/**
 * WDS Biometric 2FA — Lato PC: disegna il QR code verso la pagina
 * "verifica remota" e interroga il server finché lo smartphone non
 * conferma, poi completa il login su questo browser.
 */
( function () {
	'use strict';

	if ( typeof spidyBiometricRemote === 'undefined' ) {
		return;
	}

	var container = document.getElementById( 'spidy-wp-qr-container' );
	var status    = document.getElementById( 'spidy-wp-remote-status' );

	function renderFallbackLink() {
		if ( ! container ) {
			return;
		}
		var link = document.createElement( 'a' );
		link.href = spidyBiometricRemote.remoteUrl;
		link.textContent = spidyBiometricRemote.remoteUrl;
		link.target = '_blank';
		link.rel = 'noopener';
		container.innerHTML = '';
		container.appendChild( link );
	}

	if ( container ) {
		if ( typeof qrcode === 'undefined' ) {
			// La libreria QR non si è caricata (cache/CSP/plugin di
			// sicurezza): mostriamo comunque il link diretto, cliccabile
			// da smartphone, invece di lasciare la pagina vuota.
			console.error( 'WDS 2FA: qrcode.min.js non caricato, mostro link diretto.' );
			renderFallbackLink();
		} else {
			try {
				var qr = qrcode( 0, 'M' ); // type 0 = auto-dimensiona in base al contenuto
				qr.addData( spidyBiometricRemote.remoteUrl );
				qr.make();
				container.innerHTML = qr.createSvgTag( { cellSize: 5, margin: 4 } );
			} catch ( e ) {
				console.error( 'WDS 2FA: errore generazione QR', e );
				renderFallbackLink();
			}
		}
	}

	var pollTimer  = null;
	var pollDelay  = 2500; // ms
	var maxPolls   = 240;  // ~10 minuti, in linea con la durata della sessione "in attesa"
	var pollCount  = 0;

	function setStatus( message ) {
		if ( status ) {
			status.textContent = message;
		}
	}

	function poll() {
		pollCount++;

		if ( pollCount > maxPolls ) {
			setStatus( spidyBiometricRemote.i18n.expired );
			return;
		}

		var formData = new FormData();
		formData.append( 'action', 'spidy_wp_poll_remote_status' );
		formData.append( 'token', spidyBiometricRemote.token );
		formData.append( 'redirect_to', spidyBiometricRemote.redirectTo );

		fetch( spidyBiometricRemote.ajaxUrl, { method: 'POST', body: formData, credentials: 'same-origin' } )
			.then( function ( res ) { return res.json(); } )
			.then( function ( data ) {
				var payload = data.data || {};

				if ( payload.status === 'confirmed' && payload.redirect ) {
					setStatus( spidyBiometricRemote.i18n.confirmed );
					window.location.href = payload.redirect;
					return;
				}

				if ( payload.status === 'expired' ) {
					setStatus( spidyBiometricRemote.i18n.expired );
					return;
				}

				setStatus( spidyBiometricRemote.i18n.waiting );
				pollTimer = window.setTimeout( poll, pollDelay );
			} )
			.catch( function () {
				pollTimer = window.setTimeout( poll, pollDelay );
			} );
	}

	setStatus( spidyBiometricRemote.i18n.waiting );
	pollTimer = window.setTimeout( poll, pollDelay );
} )();
