<?php
/**
 * Renders the license management page in the admin area.
 *
 * @package Boxyfy
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/* ------------------------------------------------------------------------- *\
   Cron-Job – tägliche Lizenzprüfung
\* ------------------------------------------------------------------------- */

/** Aktivierungs-Hook: plant den täglichen Lizenz-Check. */
function boxyfy_activate_plugin() {
	if ( ! wp_next_scheduled( 'boxyfy_daily_license_check' ) ) {
		wp_schedule_event( time(), 'daily', 'boxyfy_daily_license_check' );
	}
}
register_activation_hook( __FILE__, 'boxyfy_activate_plugin' );

/** Deaktivierungs-Hook: entfernt den täglichen Lizenz-Check. */
function boxyfy_deactivate_plugin() {
	$timestamp = wp_next_scheduled( 'boxyfy_daily_license_check' );
	if ( $timestamp ) {
		wp_unschedule_event( $timestamp, 'boxyfy_daily_license_check' );
	}
}
register_deactivation_hook( __FILE__, 'boxyfy_deactivate_plugin' );

/** Cron-Callback: führt den Lizenz-Check aus. */
function boxyfy_check_license_status_daily() {
	boxyfy_force_remote_license_check();
}
add_action( 'boxyfy_daily_license_check', 'boxyfy_check_license_status_daily' );

/* ------------------------------------------------------------------------- *\
   Lizenzverwaltung – Admin-Seite
\* ------------------------------------------------------------------------- */

function boxyfy_render_license_page() {

	$is_domain_removed = false;

	/* Domain entfernen? */
	if (
		isset( $_SERVER['REQUEST_METHOD'], $_POST['remove_current_domain'] )
		&& 'POST' === $_SERVER['REQUEST_METHOD']
	) {
		check_admin_referer( 'boxyfy_remove_domain_nonce' );

		$license_key         = get_option( 'boxyfy_license_key' );
		$current_domain_full = home_url();
		$license_type        = get_option( 'boxyfy_license_type' ); // 'regular' | 'pro'.
		$parsed_url          = wp_parse_url( $current_domain_full );
		$current_domain      = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
		$current_domain      = preg_replace( '/^www\./', '', strtolower( $current_domain ) );

		$result = boxyfy_remove_domain_from_license( $license_key, $current_domain, $license_type );

		$cls  = $result['success'] ? 'notice-success' : 'notice-error';
		$msg  = $result['success']
			? $result['message']
			: sprintf( /* translators: %s = Fehlermeldung */
				__( 'Fehler: %s', 'boxyfy' ),
				$result['message']
			);

		if ( $result['success'] ) {
			$is_domain_removed = true;
		}

		echo '<div class="notice ' . esc_attr( $cls ) . ' notice-margin-top"><p>' .
		     esc_html( $msg ) .
		     '</p></div>';
	}

	/* -------- Ausgabe-HTML -------- */
	?>
	<div class="wrap">
		<h1><?php echo esc_html( __( 'Gebe Deinen Lizenzschlüssel ein, um das Plugin vollumfänglich nutzen zu können.', 'boxyfy' ) ); ?></h1>

		<form method="post" action="options.php">
			<?php
			settings_fields( 'boxyfy_license_group' );
			do_settings_sections( 'boxyfy_license' );
			submit_button( __( 'Lizenzschlüssel speichern', 'boxyfy' ) );
			?>
		</form>

		<p class="license-info-text">
			<?php
			echo esc_html( __( '*Hinweis:', 'boxyfy' ) ) . ' ';
			echo esc_html( __( 'Eine Verbindung zum Lizenzserver wird durch Klicken auf den Button „Lizenzschlüssel speichern“ sowie einmal täglich (Cron-Job) hergestellt, um unnötige Verbindungen zu vermeiden.', 'boxyfy' ) );
			?>
		</p>

		<?php
		/* Lizenzstatus-Hinweise */
		if ( false === $is_domain_removed ) {

			$is_license_valid = boxyfy_is_license_valid();

			if ( $is_license_valid ) {
				$expiry_date     = get_option( 'boxyfy_license_expiry_date' );
				$current_date    = new DateTime();
				$expiry_datetime = new DateTime( $expiry_date );
				$expiry_datetime->setTime( 23, 59, 59 );
				$remaining_days  = $current_date->diff( $expiry_datetime )->days;

				echo '<div class="notice notice-success notice-margin-top"><p>';
				if ( 0 === $remaining_days ) {
					printf(
						wp_kses(
							__( 'Achtung: Dein Lizenzschlüssel ist fast abgelaufen (<strong class="license-runsout-text">%s Tage verbleiben – läuft heute ab</strong>).', 'boxyfy' ),
							array( 'strong' => array( 'class' => array() ) )
						),
						0
					);
				} elseif ( 1 === $remaining_days ) {
					printf(
						__( 'Achtung: Dein Lizenzschlüssel läuft bereits in %s Tag ab.', 'boxyfy' ),
						1
					);
				} elseif ( $remaining_days <= 9 ) {
					printf(
						__( 'Dein Lizenzschlüssel läuft in %s Tagen ab.', 'boxyfy' ),
						$remaining_days
					);
				} else {
					printf(
						__( 'Sehr gut. Dein Lizenzschlüssel ist noch %s Tage gültig.', 'boxyfy' ),
						$remaining_days
					);
				}
				echo '</p></div>';

			} else {
				boxyfy_save_license_status( false );
				boxyfy_save_license_expiry_date( '' );
				echo '<div class="notice notice-error notice-margin-top"><p>' .
				     esc_html( __( 'Der eingegebene Lizenzschlüssel ist ungültig oder abgelaufen. Bitte erneuere Deine Lizenz, um alle Funktionen weiterhin nutzen zu können!', 'boxyfy' ) ) .
				     '</p></div>';
			}
		}
		?>

		<form method="post" action="">
			<?php wp_nonce_field( 'boxyfy_remove_domain_nonce' ); ?>
			<h2><?php echo esc_html( __( 'Lizenzschlüssel auf einer anderen Webseite nutzen?', 'boxyfy' ) ); ?></h2>
			<p><?php echo esc_html( __( 'Wenn Du diesen Lizenzschlüssel auf einer anderen Webseite verwenden möchtest, aktiviere die folgende Checkbox und klicke anschließend „Domain entfernen“.', 'boxyfy' ) ); ?></p>

			<label>
				<input type="checkbox" name="remove_current_domain" value="1" />
				<?php echo esc_html( __( 'Aktuelle Domain entfernen', 'boxyfy' ) ); ?>
			</label>
			<br><br>
			<button type="submit" class="button button-primary"><?php echo esc_html( __( 'Domain entfernen', 'boxyfy' ) ); ?></button>
		</form>

		<p class="license-info-text-alt">
			<?php
			echo esc_html( __( '*Hinweis:', 'boxyfy' ) ) . ' ';
			echo esc_html( __( 'Durch Klicken des Buttons „Domain entfernen“ wird eine Verbindung zum Lizenzserver hergestellt.', 'boxyfy' ) );
			?>
		</p>
	</div>
	<?php
}

/* ------------------------------------------------------------------------- *\
   Lizenzprüfung & Speicherung
\* ------------------------------------------------------------------------- */

function boxyfy_is_license_valid() {
	if ( boxyfy_is_license_expired_locally() ) {
		boxyfy_save_license_status( false );
		boxyfy_save_license_expiry_date( '' );
		return false;
	}

	$saved_license  = get_option( 'boxyfy_license_key' );
	$current_domain = wp_parse_url( home_url(), PHP_URL_HOST );
	$current_domain = $current_domain ? preg_replace( '/^www\./', '', strtolower( $current_domain ) ) : '';

	if ( time() - (int) get_option( 'boxyfy_license_last_check', 0 ) < DAY_IN_SECONDS ) {
		return ( 'valid' === get_option( 'boxyfy_license_status', 'invalid' ) );
	}

	return boxyfy_force_remote_license_check();
}

/**
 * Erzwingt einen Remote-Check des Lizenzschlüssels.
 *
 * @return bool
 */
function boxyfy_force_remote_license_check() {
	$saved_license  = get_option( 'boxyfy_license_key' );
	$current_domain = wp_parse_url( home_url(), PHP_URL_HOST );
	$current_domain = $current_domain ? preg_replace( '/^www\./', '', strtolower( $current_domain ) ) : '';

	update_option( 'boxyfy_license_last_check', time() );

	/* --- Pro-Lizenz prüfen --- */
	$response_pro = wp_remote_post(
		'https://test-im-netz.de/license-pro-check.php',
		array(
			'body' => array(
				'license_key'    => $saved_license,
				'current_domain' => $current_domain,
				'api_key'        => 'IhrSichererAPIKey123456',
			),
		)
	);

	if ( ! is_wp_error( $response_pro ) ) {
		$data = json_decode( wp_remote_retrieve_body( $response_pro ), true );
		if ( ! empty( $data['valid'] ) ) {
			boxyfy_save_license_status( true );
			boxyfy_save_license_expiry_date( $data['expiry_date'] ?? null );
			boxyfy_save_license_type( 'pro' );
			return true;
		}
	} else {
		$msg = sprintf(
			__( 'Pro-Lizenzprüfung fehlgeschlagen: %s', 'boxyfy' ),
			$response_pro->get_error_message()
		);
		add_action( 'admin_notices', static function () use ( $msg ) {
			echo '<div class="notice notice-error"><p>' . esc_html( $msg ) . '</p></div>';
		} );
	}

	/* --- Regular-Lizenz prüfen --- */
	$response = wp_remote_post(
		'https://test-im-netz.de/license-check.php',
		array(
			'body' => array(
				'license_key'    => $saved_license,
				'current_domain' => $current_domain,
				'api_key'        => 'IhrSichererAPIKey123456',
			),
		)
	);

	if ( is_wp_error( $response ) ) {
		$msg = sprintf(
			__( 'Lizenzprüfung fehlgeschlagen: %s', 'boxyfy' ),
			$response->get_error_message()
		);
		add_action( 'admin_notices', static function () use ( $msg ) {
			echo '<div class="notice notice-error"><p>' . esc_html( $msg ) . '</p></div>';
		} );
		boxyfy_save_license_status( false );
		boxyfy_save_license_expiry_date( '' );
		return false;
	}

	$data = json_decode( wp_remote_retrieve_body( $response ), true );
	if ( ! empty( $data['valid'] ) ) {
		boxyfy_save_license_status( true );
		boxyfy_save_license_expiry_date( $data['expiry_date'] ?? null );
		boxyfy_save_license_type( 'regular' );
		return true;
	}

	boxyfy_save_license_status( false );
	boxyfy_save_license_expiry_date( '' );
	return false;
}

/* ------------------ Helper: Optionen sichern ------------------ */

function boxyfy_save_license_status( $is_valid ) {
	update_option( 'boxyfy_license_status', $is_valid ? 'valid' : 'invalid' );
}
function boxyfy_save_license_expiry_date( $expiry_date ) {
	update_option( 'boxyfy_license_expiry_date', $expiry_date );
}
function boxyfy_save_license_type( $type ) {
	update_option( 'boxyfy_license_type', $type );
}
function boxyfy_is_license_expired_locally() {
	$expiry = get_option( 'boxyfy_license_expiry_date' );
	return ( $expiry && gmdate( 'Y-m-d' ) > $expiry );
}

/* -------------- Domain aus Lizenz entfernen -------------- */

function boxyfy_remove_domain_from_license( $license_key, $current_domain, $license_type ) {

	$response = wp_remote_post(
		'https://test-im-netz.de/license-remove-domain.php',
		array(
			'body' => array(
				'license_key'    => $license_key,
				'current_domain' => $current_domain,
				'api_key'        => 'IhrSichererAPIKey123456',
			),
		)
	);

	if ( is_wp_error( $response ) ) {
		return array(
			'success' => false,
			'message' => __( 'Verbindung zum Lizenzserver fehlgeschlagen', 'boxyfy' ),
		);
	}

	$data = json_decode( wp_remote_retrieve_body( $response ), true );

	if ( ! empty( $data['success'] ) ) {
		if ( false !== strpos( $data['message'], 'deaktiviert' ) ) {
			update_option( 'boxyfy_license_key', '' );
			update_option( 'boxyfy_license_status', 'invalid' );
			update_option( 'boxyfy_license_type', '' );
		}
		return array( 'success' => true, 'message' => $data['message'] );
	}

	return array(
		'success' => false,
		'message' => $data['message'] ?? __( 'Unbekannter Fehler', 'boxyfy' ),
	);
}

/* ---------------- Settings-API Registrierung ---------------- */

function boxyfy_register_license_settings() {

	register_setting( 'boxyfy_license_group', 'boxyfy_license_key', 'sanitize_text_field' );

	add_settings_section(
		'boxyfy_license_section',
		wp_kses_post( sprintf(
			/* translators: %s = Shop-Link */
			__( 'Deinen Lizenzschlüssel erhältst Du beim Kauf einer Standard- oder Pro-Lizenz – besuche dafür unseren %s.', 'boxyfy' ),
			'<a href="https://boxyfy.de/shop" target="_blank" rel="noopener noreferrer">Shop auf boxyfy.de</a>'
		) ),
		null,
		'boxyfy_license'
	);

	add_settings_field(
		'boxyfy_license_key',
		__( 'Lizenzschlüssel eingeben:', 'boxyfy' ),
		'boxyfy_license_key_callback',
		'boxyfy_license',
		'boxyfy_license_section'
	);
}
add_action( 'admin_init', 'boxyfy_register_license_settings' );

/** Callback: Eingabefeld Lizenzschlüssel. */
function boxyfy_license_key_callback() {

	$license_status = get_option( 'boxyfy_license_status', 'invalid' );
	$status_label   = ( 'valid' === $license_status )
		? __( 'aktiv', 'boxyfy' ) . ' &#10003;'
		: __( 'nicht aktiv', 'boxyfy' ) . ' &#10060;';

	printf(
		'<p class="license-status-text">%s <span class="%s-license-status">%s</span></p>',
		esc_html( __( 'Lizenzstatus:', 'boxyfy' ) ),
		( 'valid' === $license_status ) ? 'active' : 'not-active',
		wp_kses_post( $status_label )
	);

	$license      = get_option( 'boxyfy_license_key' );
	$visible_part = substr( (string) $license, -4 );

	printf(
		'<input type="password" name="boxyfy_license_key" value="%s" class="license-key-input" />',
		esc_attr( $license )
	);

	printf(
		'<p>%s ****%s (%s)</p>',
		esc_html( __( 'Lizenzschlüssel maskiert:', 'boxyfy' ) ),
		esc_html( $visible_part ),
		esc_html( __( 'letzten 4 Stellen', 'boxyfy' ) )
	);
}

/* ---------------- Lizenz-Key-Update-Hook ---------------- */

function boxyfy_on_license_key_update( $old_value, $new_value, $option ) {

	if ( $old_value === $new_value ) {
		return;
	}

	boxyfy_force_remote_license_check();

	if ( 'valid' === get_option( 'boxyfy_license_status' ) ) {
		if ( ! wp_next_scheduled( 'boxyfy_daily_license_check' ) ) {
			wp_schedule_event( time(), 'daily', 'boxyfy_daily_license_check' );
		}
	} else {
		$timestamp = wp_next_scheduled( 'boxyfy_daily_license_check' );
		if ( $timestamp ) {
			wp_unschedule_event( $timestamp, 'boxyfy_daily_license_check' );
		}
	}
}
add_action( 'update_option_boxyfy_license_key', 'boxyfy_on_license_key_update', 10, 3 );