/**
 * WDS Biometric 2FA — Verifica al login (navigator.credentials.get()).
 */
( function () {
	'use strict';

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

	var button = document.getElementById( 'spidy-wp-login-button' );
	var status = document.getElementById( 'spidy-wp-login-status' );

	if ( ! button ) {
		return;
	}

	/**
	 * 1.6.8 — Nasconde la sezione QR SOLO su smartphone che dispongono già
	 * di un proprio sensore biometrico: inquadrare un QR sullo stesso
	 * schermo che lo mostra non ha senso (e sui telefoni non è nemmeno
	 * possibile farlo). Su PC/desktop questo blocco non fa nulla: la
	 * sezione QR resta sempre visibile esattamente come oggi.
	 *
	 * Doppio controllo intenzionale (non solo "ha un sensore disponibile"):
	 * un laptop con Windows Hello configurato avrebbe comunque un
	 * "platform authenticator" disponibile, ma non è uno smartphone — in
	 * quel caso il QR deve restare visibile come oggi, quindi si richiede
	 * ANCHE un segnale di dispositivo mobile (touch) prima di nascondere.
	 */
	function isLikelyMobileDevice() {
		var hasTouch = ( 'ontouchstart' in window ) || ( navigator.maxTouchPoints > 0 );
		var uaIsMobile = /Android|iPhone|iPad|iPod/i.test( navigator.userAgent || '' );
		return hasTouch && uaIsMobile;
	}

	if ( window.PublicKeyCredential &&
		PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable &&
		isLikelyMobileDevice() ) {

		PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()
			.then( function ( available ) {
				if ( available ) {
					var qrSection = document.getElementById( 'spidy-wp-qr-section' );
					if ( qrSection ) {
						qrSection.style.display = 'none';
					}
				}
			} )
			.catch( function () {
				// In caso di errore nel rilevamento, non si tocca nulla:
				// la sezione QR resta visibile come da comportamento attuale.
			} );
	}

	function base64urlToBuffer( base64url ) {
		var padding = '='.repeat( ( 4 - ( base64url.length % 4 ) ) % 4 );
		var base64  = ( base64url + padding ).replace( /-/g, '+' ).replace( /_/g, '/' );
		var raw     = atob( base64 );
		var buffer  = new ArrayBuffer( raw.length );
		var array   = new Uint8Array( buffer );
		for ( var i = 0; i < raw.length; i++ ) {
			array[ i ] = raw.charCodeAt( i );
		}
		return buffer;
	}

	function bufferToBase64url( buffer ) {
		var bytes  = new Uint8Array( buffer );
		var binary = '';
		for ( var i = 0; i < bytes.byteLength; i++ ) {
			binary += String.fromCharCode( bytes[ i ] );
		}
		return btoa( binary ).replace( /\+/g, '-' ).replace( /\//g, '_' ).replace( /=+$/, '' );
	}

	function setStatus( message, isError ) {
		status.textContent = message;
		status.style.color = isError ? '#b32d2e' : '#1a7f37';
	}

	button.addEventListener( 'click', function () {
		if ( ! window.PublicKeyCredential ) {
			setStatus( spidyBiometricLogin.i18n.notSupported, true );
			return;
		}

		var opts = spidyBiometricLogin.options;

		var publicKey = {
			challenge: base64urlToBuffer( opts.challenge ),
			rpId: opts.rpId,
			allowCredentials: opts.allowCredentials.map( function ( cred ) {
				return {
					id: base64urlToBuffer( cred.id ),
					type: cred.type,
					transports: cred.transports,
				};
			} ),
			userVerification: opts.userVerification,
			timeout: opts.timeout,
		};

		button.disabled = true;
		setStatus( spidyBiometricLogin.i18n.verifying, false );

		navigator.credentials
			.get( { publicKey: publicKey } )
			.then( function ( assertion ) {
				var formData = new FormData();
				formData.append( 'action', 'spidy_wp_verify_assertion' );
				formData.append( 'token', spidyBiometricLogin.token );
				formData.append( 'redirect_to', spidyBiometricLogin.redirectTo );
				formData.append( 'credential_id', bufferToBase64url( assertion.rawId ) );
				formData.append( 'authenticator_data', bufferToBase64url( assertion.response.authenticatorData ) );
				formData.append( 'client_data_json', bufferToBase64url( assertion.response.clientDataJSON ) );
				formData.append( 'signature', bufferToBase64url( assertion.response.signature ) );
				if ( assertion.response.userHandle ) {
					formData.append( 'user_handle', bufferToBase64url( assertion.response.userHandle ) );
				}

				return fetch( spidyBiometricLogin.ajaxUrl, { method: 'POST', body: formData, credentials: 'same-origin' } )
					.then( function ( res ) { return res.json(); } )
					.then( function ( data ) {
						if ( data.success ) {
							window.location.href = data.data.redirect;
						} else {
							button.disabled = false;
							setStatus( data.data && data.data.message ? data.data.message : spidyBiometricLogin.i18n.genericError, true );
						}
					} );
			} )
			.catch( function ( err ) {
				button.disabled = false;
				if ( err && err.name === 'NotAllowedError' ) {
					setStatus( spidyBiometricLogin.i18n.cancelled, true );
				} else {
					setStatus( spidyBiometricLogin.i18n.genericError, true );
				}
			} );
	} );
} )();
