<?php
/**
 * Plugin Name:       SPIDY 2FA LOGIN
 * Plugin URI:        https://cozzetto.eu/prodotto/spidy-wp/
 * Description:       Autenticazione a due fattori (2FA) via email, SMS (Twilio/Clickatell) o biometrico (WebAuthn/FIDO2), per tutti gli utenti del sito.
 * Version:           1.6.12
 * Author:            carlocozzetto
 * Author URI:        https://cozzetto.eu
 * Text Domain:       spidy-2fa-login
 * Requires PHP:      7.4
 * Requires at least: 6.0
 * License:           GPLv2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 *
 * @package SPIDy_WP
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Accesso diretto non consentito.
}

/* -------------------------------------------------------------------------
 * Costanti plugin
 * ---------------------------------------------------------------------- */

define( 'SPIDY_WP_VERSION', '1.6.12' );
define( 'SPIDY_WP_PLUGIN_FILE', __FILE__ );
define( 'SPIDY_WP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'SPIDY_WP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

/*
 * SPIDY_WP_BYPASS_BIOMETRIC (Fase 5 - procedura di sblocco emergenza)
 * ----------------------------------------------------------------
 * Se un cliente perde o rompe lo smartphone e resta bloccato fuori
 * dalla bacheca, il team di supporto può sbloccarlo temporaneamente
 * aggiungendo questa riga in wp-config.php (via FTP/SSH), PRIMA della
 * riga "That's all, stop editing!":
 *
 *     define( 'SPIDY_WP_BYPASS_BIOMETRIC', true );
 *
 * Con questa costante attiva, il controllo biometrico al login viene
 * saltato per TUTTI gli utenti del sito, quindi va rimossa subito dopo
 * che il cliente ha ripristinato o registrato un nuovo dispositivo.
 * La costante non esiste per default: se non è definita nel wp-config,
 * il plugin si comporta normalmente.
 */
if ( ! defined( 'SPIDY_WP_BYPASS_BIOMETRIC' ) ) {
	define( 'SPIDY_WP_BYPASS_BIOMETRIC', false );
}

/* -------------------------------------------------------------------------
 * Autoload Composer (libreria web-auth/webauthn-framework)
 * ---------------------------------------------------------------------- */

$spidy_wp_autoload = SPIDY_WP_PLUGIN_DIR . 'vendor/autoload.php';

// La libreria WebAuthn richiede PHP >= 8.2. Su PHP inferiore NON la
// carichiamo affatto (fallirebbe con un errore fatale bloccante): il
// plugin resta comunque pienamente funzionante con Email e SMS, solo il
// metodo Biometrico non sarà selezionabile.
if ( PHP_VERSION_ID < 80200 ) {
	define( 'SPIDY_WP_WEBAUTHN_AVAILABLE', false );
	add_action(
		'admin_notices',
		function () {
			if ( ! current_user_can( 'activate_plugins' ) ) {
				return;
			}
			echo '<div class="notice notice-warning"><p><strong>SPIDY 2FA LOGIN:</strong> ';
			echo esc_html__( 'il server usa una versione di PHP inferiore alla 8.2: il metodo Biometrico non è disponibile. Email e SMS continuano a funzionare normalmente.', 'spidy-2fa-login' );
			echo '</p></div>';
		}
	);
} elseif ( file_exists( $spidy_wp_autoload ) ) {
	require_once $spidy_wp_autoload;
	define( 'SPIDY_WP_WEBAUTHN_AVAILABLE', true );
} else {
	define( 'SPIDY_WP_WEBAUTHN_AVAILABLE', false );
	add_action(
		'admin_notices',
		function () {
			if ( ! current_user_can( 'activate_plugins' ) ) {
				return;
			}
			echo '<div class="notice notice-error"><p><strong>SPIDY 2FA LOGIN:</strong> ';
			echo 'la cartella <code>vendor/</code> risulta mancante: il metodo Biometrico non sarà disponibile finché non viene ripristinata.</p></div>';
		}
	);
}

/* -------------------------------------------------------------------------
 * Classi interne del plugin
 * ---------------------------------------------------------------------- */

require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-user-store.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-credential-store.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-sms.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-otp.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-requirements.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-webauthn-service.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-login.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-registration.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-webauthn-login.php';
require_once SPIDY_WP_PLUGIN_DIR . 'includes/class-spidy-wp-admin-menu.php';

/* -------------------------------------------------------------------------
 * Attivazione: controllo HTTPS obbligatorio (Fase 5)
 * ---------------------------------------------------------------------- */

register_activation_hook( __FILE__, array( 'SPIDy_WP_Requirements', 'check_on_activation' ) );

// Ricontrolla anche ad ogni caricamento: se il certificato scade o
// qualcuno disattiva il redirect HTTPS in un secondo momento, il plugin
// deve auto-disattivarsi e non lasciare il sito con WebAuthn rotto.
add_action( 'admin_init', array( 'SPIDy_WP_Requirements', 'check_on_admin_init' ) );

/* -------------------------------------------------------------------------
 * Bootstrap
 * ---------------------------------------------------------------------- */

/**
 * Classe principale — per ora funge solo da contenitore/bootstrap.
 * Le Fasi 2, 3, 4 (profilo utente, intercettazione login, verifica)
 * verranno agganciate qui man mano che vengono sviluppate.
 */
final class SPIDy_WP {

	/** @var SPIDy_WP|null */
	private static $instance = null;

	public static function instance(): self {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	private function __construct() {
		SPIDy_WP_Admin_Menu::init();
		SPIDy_WP_Registration::init();
		SPIDy_WP_Login::init();
		SPIDy_WP_Webauthn_Login::init();
	}
}

add_action(
	'plugins_loaded',
	function () {
		SPIDy_WP::instance();
	}
);
