<?php
/**
 * Voce di menu in bacheca: "2FA - COZZETTO".
 *
 * @package SPIDy_WP
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class SPIDy_WP_Admin_Menu {

	const MENU_SLUG = 'spidy-2fa-login';

	public static function init() {
		add_action( 'admin_menu', array( __CLASS__, 'register_menu' ) );
	}

	public static function register_menu() {
		add_menu_page(
			'SPIDY 2FA LOGIN',
			'SPIDY 2FA LOGIN',
			'manage_options',
			self::MENU_SLUG,
			array( __CLASS__, 'render_page' ),
			'dashicons-shield',
			80
		);
	}

	public static function render_page() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		$notice = '';

		// Preferenza di disinstallazione: se cancellare o conservare i dati.
		if ( isset( $_POST['spidy_wp_save_uninstall_pref'] ) && check_admin_referer( 'spidy_wp_uninstall_pref', 'spidy_wp_uninstall_pref_nonce' ) ) {
			update_option( 'spidy_wp_delete_data_on_uninstall', ! empty( $_POST['spidy_wp_delete_on_uninstall'] ) ? '1' : '0' );
			$notice = __( 'Preferenza di disinstallazione salvata.', 'spidy-2fa-login' );
		}

		// Salvataggio in blocco di telefono/metodo/2FA per TUTTI gli utenti
		// elencati nella tabella, con un unico invio — sostituisce il
		// vecchio salvataggio riga per riga (un form/pulsante per utente).
		if ( isset( $_POST['spidy_wp_save_users_bulk'] ) && check_admin_referer( 'spidy_wp_admin_save_bulk', 'spidy_wp_admin_bulk_nonce' ) ) {
			$phones      = isset( $_POST['spidy_wp_phone'] ) && is_array( $_POST['spidy_wp_phone'] ) ? wp_unslash( $_POST['spidy_wp_phone'] ) : array();
			$methods     = isset( $_POST['spidy_wp_method'] ) && is_array( $_POST['spidy_wp_method'] ) ? wp_unslash( $_POST['spidy_wp_method'] ) : array();
			$enabled_ids = isset( $_POST['spidy_wp_enabled'] ) && is_array( $_POST['spidy_wp_enabled'] ) ? wp_unslash( $_POST['spidy_wp_enabled'] ) : array();

			// Si aggiornano SOLO utenti realmente esistenti (mai fidarsi
			// ciecamente degli ID indicati nel form) e SOLO quelli
			// effettivamente presenti nella tabella inviata.
			foreach ( get_users( array( 'fields' => 'ID' ) ) as $existing_id ) {
				$existing_id = (int) $existing_id;
				$chiave      = (string) $existing_id;

				if ( ! array_key_exists( $chiave, $phones ) ) {
					continue;
				}

				$phone   = sanitize_text_field( $phones[ $chiave ] );
				$method  = isset( $methods[ $chiave ] ) ? sanitize_text_field( $methods[ $chiave ] ) : SPIDy_WP_User_Store::METHOD_EMAIL;
				$enabled = isset( $enabled_ids[ $chiave ] );

				SPIDy_WP_User_Store::set_phone( $existing_id, $phone );
				SPIDy_WP_User_Store::set_method( $existing_id, $method );
				SPIDy_WP_User_Store::set_2fa_enabled( $existing_id, $enabled );
			}

			$notice = __( 'Dati di tutti gli utenti aggiornati.', 'spidy-2fa-login' );
		}

		// Salvataggio impostazioni SMS (Twilio / Clickatell).
		if ( isset( $_POST['spidy_wp_save_sms_settings'] ) && check_admin_referer( 'spidy_wp_admin_sms_save', 'spidy_wp_admin_sms_nonce' ) ) {
			$provider = isset( $_POST['spidy_wp_sms_provider'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_sms_provider'] ) ) : 'none';
			$provider = in_array( $provider, array( 'twilio', 'clickatell' ), true ) ? $provider : 'none';

			update_option( SPIDy_WP_SMS::OPTION_PROVIDER, $provider );
			update_option( SPIDy_WP_SMS::OPTION_TWILIO_SID, isset( $_POST['spidy_wp_twilio_sid'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_twilio_sid'] ) ) : '' );
			update_option( SPIDy_WP_SMS::OPTION_TWILIO_TOKEN, isset( $_POST['spidy_wp_twilio_token'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_twilio_token'] ) ) : '' );
			update_option( SPIDy_WP_SMS::OPTION_TWILIO_FROM, isset( $_POST['spidy_wp_twilio_from'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_twilio_from'] ) ) : '' );
			update_option( SPIDy_WP_SMS::OPTION_CLICKATELL_APIKEY, isset( $_POST['spidy_wp_clickatell_apikey'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_clickatell_apikey'] ) ) : '' );

			$notice = __( 'Impostazioni SMS aggiornate.', 'spidy-2fa-login' );
		}

		$test_result = null;

		// Test diretto dell'invio SMS, senza passare dal login.
		if ( isset( $_POST['spidy_wp_test_sms'] ) && check_admin_referer( 'spidy_wp_admin_test_sms', 'spidy_wp_admin_test_sms_nonce' ) ) {
			$test_phone = isset( $_POST['spidy_wp_test_phone'] ) ? sanitize_text_field( wp_unslash( $_POST['spidy_wp_test_phone'] ) ) : '';

			if ( empty( $test_phone ) ) {
				$test_result = new WP_Error( 'spidy_wp_no_phone', __( 'Inserisci un numero di telefono per il test.', 'spidy-2fa-login' ) );
			} else {
				$test_result = SPIDy_WP_SMS::send( $test_phone, __( 'Messaggio di test — SPIDY 2FA LOGIN', 'spidy-2fa-login' ) );
				if ( is_wp_error( $test_result ) ) {
					SPIDy_WP_SMS::log_error( $test_phone, $test_result->get_error_message() );
				}
			}
		}

		$users = get_users( array( 'orderby' => 'display_name' ) );
		?>
		<div class="wrap">
			<h1>SPIDY 2FA LOGIN</h1>
			<p><?php esc_html_e( 'Autenticazione a due fattori. Tre metodi disponibili: email, SMS (con fallback automatico su email), biometrico.', 'spidy-2fa-login' ); ?></p>

			<?php if ( $notice ) : ?>
				<div class="notice notice-success"><p><?php echo esc_html( $notice ); ?></p></div>
			<?php endif; ?>

			<h2 class="title"><?php esc_html_e( 'Gestione utenti', 'spidy-2fa-login' ); ?></h2>
			<p class="description"><?php esc_html_e( 'Modifica quanti utenti vuoi, poi salva tutto insieme con il pulsante in fondo — non serve più salvare riga per riga.', 'spidy-2fa-login' ); ?></p>
			<form method="post">
				<?php wp_nonce_field( 'spidy_wp_admin_save_bulk', 'spidy_wp_admin_bulk_nonce' ); ?>
				<table class="widefat striped" style="max-width:1100px; table-layout:fixed;">
					<colgroup>
						<col style="width:26%;">
						<col style="width:20%;">
						<col style="width:18%;">
						<col style="width:16%;">
						<col style="width:20%;">
					</colgroup>
					<thead>
						<tr>
							<th><?php esc_html_e( 'Utente', 'spidy-2fa-login' ); ?></th>
							<th><?php esc_html_e( 'Numero di telefono', 'spidy-2fa-login' ); ?></th>
							<th><?php esc_html_e( 'Metodo', 'spidy-2fa-login' ); ?></th>
							<th><?php esc_html_e( 'Dispositivi biometrici', 'spidy-2fa-login' ); ?></th>
							<th style="text-align:center;">
								<label style="font-weight:600; white-space:nowrap;">
									<input type="checkbox" id="spidy_wp_toggle_all_2fa" />
									<?php esc_html_e( 'Attiva 2FA', 'spidy-2fa-login' ); ?>
								</label>
							</th>
						</tr>
					</thead>
					<tbody>
						<?php foreach ( $users as $u ) : ?>
							<?php $device_count = count( SPIDy_WP_Credential_Store::get_credentials( $u->ID ) ); ?>
							<tr>
								<td><?php echo esc_html( $u->display_name ); ?> <span class="description">(<?php echo esc_html( $u->user_email ); ?>)</span></td>
								<td><input type="tel" name="spidy_wp_phone[<?php echo esc_attr( $u->ID ); ?>]" value="<?php echo esc_attr( SPIDy_WP_User_Store::get_phone( $u->ID ) ); ?>" size="18" style="width:100%; box-sizing:border-box;" /></td>
								<td>
									<select name="spidy_wp_method[<?php echo esc_attr( $u->ID ); ?>]" style="width:100%;">
										<option value="<?php echo esc_attr( SPIDy_WP_User_Store::METHOD_EMAIL ); ?>" <?php selected( SPIDy_WP_User_Store::get_method( $u->ID ), SPIDy_WP_User_Store::METHOD_EMAIL ); ?>><?php esc_html_e( 'Email', 'spidy-2fa-login' ); ?></option>
										<option value="<?php echo esc_attr( SPIDy_WP_User_Store::METHOD_SMS ); ?>" <?php selected( SPIDy_WP_User_Store::get_method( $u->ID ), SPIDy_WP_User_Store::METHOD_SMS ); ?>><?php esc_html_e( 'SMS (+ fallback email)', 'spidy-2fa-login' ); ?></option>
										<option value="<?php echo esc_attr( SPIDy_WP_User_Store::METHOD_BIOMETRIC ); ?>" <?php selected( SPIDy_WP_User_Store::get_method( $u->ID ), SPIDy_WP_User_Store::METHOD_BIOMETRIC ); ?>><?php esc_html_e( 'Biometrico', 'spidy-2fa-login' ); ?></option>
									</select>
								</td>
								<td><?php echo $device_count > 0 ? '✅ ' . esc_html( $device_count ) : '—'; ?></td>
								<td style="text-align:center;"><input type="checkbox" class="spidy-wp-2fa-checkbox" name="spidy_wp_enabled[<?php echo esc_attr( $u->ID ); ?>]" value="1" <?php checked( SPIDy_WP_User_Store::is_2fa_enabled( $u->ID ) ); ?> /></td>
							</tr>
						<?php endforeach; ?>
					</tbody>
				</table>
				<p>
					<button type="submit" name="spidy_wp_save_users_bulk" value="1" class="button button-primary"><?php esc_html_e( 'Salva tutti', 'spidy-2fa-login' ); ?></button>
				</p>
			</form>
			<script>
			( function () {
				var toggle = document.getElementById( 'spidy_wp_toggle_all_2fa' );
				if ( ! toggle ) { return; }
				toggle.addEventListener( 'change', function () {
					var checked = toggle.checked;
					document.querySelectorAll( '.spidy-wp-2fa-checkbox' ).forEach( function ( cb ) {
						cb.checked = checked;
					} );
				} );
			} )();
			</script>

			<h2 class="title"><?php esc_html_e( 'Invio SMS (Twilio / Clickatell)', 'spidy-2fa-login' ); ?></h2>
			<p class="description"><?php esc_html_e( 'Serve solo per gli utenti con Metodo impostato su SMS. Se non configuri nulla ("Nessuno"), quegli utenti ricadono automaticamente su email.', 'spidy-2fa-login' ); ?></p>
			<form method="post">
				<?php wp_nonce_field( 'spidy_wp_admin_sms_save', 'spidy_wp_admin_sms_nonce' ); ?>
				<table class="form-table">
					<tr>
						<th><label for="spidy_wp_sms_provider"><?php esc_html_e( 'Provider', 'spidy-2fa-login' ); ?></label></th>
						<td>
							<select name="spidy_wp_sms_provider" id="spidy_wp_sms_provider">
								<option value="none" <?php selected( SPIDy_WP_SMS::get_provider(), 'none' ); ?>><?php esc_html_e( 'Nessuno (solo email)', 'spidy-2fa-login' ); ?></option>
								<option value="twilio" <?php selected( SPIDy_WP_SMS::get_provider(), 'twilio' ); ?>>Twilio</option>
								<option value="clickatell" <?php selected( SPIDy_WP_SMS::get_provider(), 'clickatell' ); ?>>Clickatell</option>
							</select>
						</td>
					</tr>
					<tr>
						<th><label for="spidy_wp_twilio_sid"><?php esc_html_e( 'Twilio — Account SID', 'spidy-2fa-login' ); ?></label></th>
						<td><input type="text" name="spidy_wp_twilio_sid" id="spidy_wp_twilio_sid" value="<?php echo esc_attr( get_option( SPIDy_WP_SMS::OPTION_TWILIO_SID, '' ) ); ?>" class="regular-text" autocomplete="off" /></td>
					</tr>
					<tr>
						<th><label for="spidy_wp_twilio_token"><?php esc_html_e( 'Twilio — Auth Token', 'spidy-2fa-login' ); ?></label></th>
						<td><input type="password" name="spidy_wp_twilio_token" id="spidy_wp_twilio_token" value="<?php echo esc_attr( get_option( SPIDy_WP_SMS::OPTION_TWILIO_TOKEN, '' ) ); ?>" class="regular-text" autocomplete="off" /></td>
					</tr>
					<tr>
						<th><label for="spidy_wp_twilio_from"><?php esc_html_e( 'Twilio — Numero mittente', 'spidy-2fa-login' ); ?></label></th>
						<td><input type="text" name="spidy_wp_twilio_from" id="spidy_wp_twilio_from" value="<?php echo esc_attr( get_option( SPIDy_WP_SMS::OPTION_TWILIO_FROM, '' ) ); ?>" class="regular-text" placeholder="+15017122661" />
							<p class="description"><?php esc_html_e( 'Deve essere un numero attivo nel tuo account Twilio (Console → Phone Numbers → Active Numbers), non un numero qualsiasi.', 'spidy-2fa-login' ); ?></p>
						</td>
					</tr>
					<tr>
						<th><label for="spidy_wp_clickatell_apikey"><?php esc_html_e( 'Clickatell — API Key', 'spidy-2fa-login' ); ?></label></th>
						<td><input type="password" name="spidy_wp_clickatell_apikey" id="spidy_wp_clickatell_apikey" value="<?php echo esc_attr( get_option( SPIDy_WP_SMS::OPTION_CLICKATELL_APIKEY, '' ) ); ?>" class="regular-text" autocomplete="off" /></td>
					</tr>
				</table>
				<p>
					<button type="submit" name="spidy_wp_save_sms_settings" value="1" class="button button-primary"><?php esc_html_e( 'Salva impostazioni SMS', 'spidy-2fa-login' ); ?></button>
				</p>
			</form>

			<h3><?php esc_html_e( 'Test invio SMS', 'spidy-2fa-login' ); ?></h3>
			<?php if ( null !== $test_result ) : ?>
				<?php if ( is_wp_error( $test_result ) ) : ?>
					<div class="notice notice-error inline"><p>
						<strong><?php esc_html_e( 'Invio fallito:', 'spidy-2fa-login' ); ?></strong>
						<?php echo esc_html( $test_result->get_error_message() ); ?>
						<?php if ( $test_result->get_error_data() ) : ?>
							<br /><code><?php echo esc_html( wp_json_encode( $test_result->get_error_data() ) ); ?></code>
						<?php endif; ?>
					</p></div>
				<?php else : ?>
					<div class="notice notice-success inline"><p><?php esc_html_e( 'SMS inviato correttamente. Controlla se è arrivato sul telefono di destinazione.', 'spidy-2fa-login' ); ?></p></div>
				<?php endif; ?>
			<?php endif; ?>
			<form method="post">
				<?php wp_nonce_field( 'spidy_wp_admin_test_sms', 'spidy_wp_admin_test_sms_nonce' ); ?>
				<p>
					<input type="tel" name="spidy_wp_test_phone" placeholder="+39 333 1234567" class="regular-text" value="<?php echo isset( $_POST['spidy_wp_test_phone'] ) ? esc_attr( sanitize_text_field( wp_unslash( $_POST['spidy_wp_test_phone'] ) ) ) : ''; ?>" />
					<button type="submit" name="spidy_wp_test_sms" value="1" class="button"><?php esc_html_e( 'Invia SMS di test', 'spidy-2fa-login' ); ?></button>
				</p>
			</form>

			<?php $error_log = get_option( 'spidy_wp_sms_last_errors', array() ); ?>
			<?php if ( ! empty( $error_log ) ) : ?>
				<h3><?php esc_html_e( 'Ultimi errori invio SMS (anche dal login reale, non solo dal test)', 'spidy-2fa-login' ); ?></h3>
				<table class="widefat striped" style="max-width:900px;">
					<thead>
						<tr>
							<th><?php esc_html_e( 'Data/ora', 'spidy-2fa-login' ); ?></th>
							<th><?php esc_html_e( 'Numero (normalizzato)', 'spidy-2fa-login' ); ?></th>
							<th><?php esc_html_e( 'Motivo', 'spidy-2fa-login' ); ?></th>
						</tr>
					</thead>
					<tbody>
						<?php foreach ( $error_log as $entry ) : ?>
							<tr>
								<td><?php echo esc_html( $entry['time'] ); ?></td>
								<td><code><?php echo esc_html( $entry['phone'] ); ?></code></td>
								<td><?php echo esc_html( $entry['reason'] ); ?></td>
							</tr>
						<?php endforeach; ?>
					</tbody>
				</table>
				<p class="description"><?php esc_html_e( 'Questo elenco si popola automaticamente ogni volta che l\'invio SMS fallisce e il sistema ricade sull\'email, sia dal test che da un login reale.', 'spidy-2fa-login' ); ?></p>
			<?php endif; ?>

			<h2 class="title"><?php esc_html_e( 'Disinstallazione', 'spidy-2fa-login' ); ?></h2>
			<form method="post">
				<?php wp_nonce_field( 'spidy_wp_uninstall_pref', 'spidy_wp_uninstall_pref_nonce' ); ?>
				<p>
					<label>
						<input type="checkbox" name="spidy_wp_delete_on_uninstall" value="1" <?php checked( '1' === get_option( 'spidy_wp_delete_data_on_uninstall', '0' ) ); ?> />
						<?php esc_html_e( 'Cancella tutti i dati del plugin (metodi, telefoni, dispositivi biometrici, impostazioni SMS) quando lo disinstallo', 'spidy-2fa-login' ); ?>
					</label>
				</p>
				<p class="description"><?php esc_html_e( 'Ha effetto solo se disattivi il plugin e poi clicchi "Elimina" dalla schermata Plugin — un semplice aggiornamento non cancella mai i dati, con o senza questa spunta.', 'spidy-2fa-login' ); ?></p>
				<p>
					<button type="submit" name="spidy_wp_save_uninstall_pref" value="1" class="button"><?php esc_html_e( 'Salva preferenza', 'spidy-2fa-login' ); ?></button>
				</p>
			</form>

			<h2 class="title"><?php esc_html_e( 'Come funziona', 'spidy-2fa-login' ); ?></h2>
			<ul style="list-style:disc;margin-left:20px;">
				<li><?php esc_html_e( 'Email: codice a 6 cifre inviato via email dopo la password corretta.', 'spidy-2fa-login' ); ?></li>
				<li><?php esc_html_e( 'SMS: stesso codice inviato via SMS al numero indicato (Twilio/Clickatell); se l\'invio fallisce, il codice arriva automaticamente via email.', 'spidy-2fa-login' ); ?></li>
				<li><?php esc_html_e( 'Biometrico: l\'utente deve prima registrare un dispositivo da "Il tuo profilo" (sezione Sicurezza Biometrica); se nessun dispositivo è registrato, si ricade automaticamente sull\'email.', 'spidy-2fa-login' ); ?></li>
				<li><?php esc_html_e( 'Il codice OTP scade dopo 10 minuti; dopo 5 tentativi errati va richiesto un nuovo codice.', 'spidy-2fa-login' ); ?></li>
				<li>
					<?php
					printf(
						/* translators: %s: nome della costante */
						esc_html__( 'Sblocco emergenza: definisci %s in wp-config.php per disattivare temporaneamente il controllo per tutti gli utenti.', 'spidy-2fa-login' ),
						'<code>SPIDY_WP_BYPASS_BIOMETRIC</code>'
					);
					?>
				</li>
			</ul>
		</div>
		<?php
	}
}
