<?php
/**
 * HEATMAP-Klick-Tracking-Code für Produktseiten
 * IFrame + Overlay, ganze Seite (Body) tracken
 * Keine Pixel-Abzüge, pageX/pageY ab Dokument-Top
 *
 * @package Boxyfy
 */

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

// Lizenz prüfen und ggf. abbrechen.
if ( function_exists( 'boxyfy_is_license_valid' ) ) {
	if ( ! boxyfy_is_license_valid() ) {
		return;
	}
}

add_action( 'admin_menu', 'boxyfy_add_heatmap_menu' );
/**
 * Fügt das Heatmap-Submenü zum TSProdukte-Menü hinzu.
 */
function boxyfy_add_heatmap_menu() {
	// Lizenztyp abrufen.
	$license_type = get_option( 'boxyfy_license_type' );

	// Überprüfen, ob der Lizenztyp "pro" ist.
	if ( 'pro' === $license_type ) {
		add_submenu_page(
			'edit.php?post_type=boxyfy_tsprodukte', // Übergeordnetes Menü (TSProdukte).
			'Heatmap-Einstellungen',         // Seitentitel.
			'Heatmap',                       // Menübezeichnung.
			'manage_options',                // Berechtigung.
			'boxyfy_heatmap',                // Slug für das Menü.
			'boxyfy_render_heatmap_page'     // Callback-Funktion.
		);
	}
}

add_action( 'admin_enqueue_scripts', 'boxyfy_enqueue_heatmap_admin_scripts' );

/**
 * Callback-Funktion: Rendert die Heatmap-Seite (IFrame + Overlay).
 */
function boxyfy_render_heatmap_page() {
	// Einstellungen speichern.
	if (
    	isset( $_POST['boxyfy_heatmap_settings_nonce'] ) &&
    	wp_verify_nonce(
        sanitize_text_field( wp_unslash( $_POST['boxyfy_heatmap_settings_nonce'] ) ),
        'boxyfy_heatmap_settings'
    	)
	) {
		$radius = isset( $_POST['heatmap_radius'] ) ? intval( $_POST['heatmap_radius'] ) : 50;
		update_option( 'boxyfy_heatmap_radius', $radius );

		$gradient_input = isset( $_POST['heatmap_gradient'] )
			? sanitize_text_field( wp_unslash( $_POST['heatmap_gradient'] ) )
			: '';
		$decoded        = json_decode( $gradient_input, true );
		if ( JSON_ERROR_NONE === json_last_error() ) {
			update_option( 'boxyfy_heatmap_gradient', wp_json_encode( $decoded ) );
		} else {
			add_settings_error(
				'boxyfy_heatmap_settings',
				'invalid_gradient',
				'Ungültiges JSON für den Gradient.'
			);
		}
		echo '<div class="notice notice-success"><p>Heatmap-Einstellungen gespeichert.</p></div>';
	}

	// Aktuelle Werte laden.
	$current_radius   = get_option( 'boxyfy_heatmap_radius', 50 );
	$current_gradient = get_option(
		'boxyfy_heatmap_gradient',
		wp_json_encode(
			array(
				"0.45" => "blue",
				"0.55" => "lime",
				"0.65" => "yellow",
				"0.95" => "red",
			)
		)
	);
	$grad_array = json_decode( $current_gradient, true );
	?>
	<div class="wrap">
		<h1>Heatmap-Einstellungen (Body-Tracking, ganze Seite)</h1>

		<!-- Einstellungen-Formular -->
		<form method="post" action="">
			<?php wp_nonce_field( 'boxyfy_heatmap_settings', 'boxyfy_heatmap_settings_nonce' ); ?>
			<table class="form-table">
				<tr>
					<th>
						<label for="heatmap_radius">Heatmap-Radius</label>
					</th>
					<td>
						<input type="number" id="heatmap_radius" name="heatmap_radius" value="<?php echo esc_attr( $current_radius ); ?>" min="10" max="250" />
					</td>
				</tr>
			</table>
			<?php submit_button( 'Einstellungen speichern' ); ?>
		</form>

		<hr />

		<h2><?php esc_html_e( 'Desktop-Heatmap-Daten anzeigen', 'boxyfy' ); ?></h2>
		<p>
			<?php
			echo wp_kses_post( sprintf(
				/* translators: %1$s: Buttontext "Heatmap anzeigen", %2$s: Buttontext "Klickdaten löschen" */
				__( 'Klicke auf "%1$s", um die Klick-Daten eines Produkts weiter unten ↓ zu sehen. Klicke auf "%2$s", um die vorhandenen Klick-Tracking-Daten für ein Produkt zu entfernen.<br /><br /><strong>Hinweis:</strong> In der Spalte "Klickzahlen" wird immer die aktuelle Anzahl gesammelter Klicks angezeigt. Es können max. 250 Klicks je Produktseite getracked werden. Zudem kann es einen kurzen Moment dauern, bis die Heatmap geladen wurde.', 'boxyfy' ),
				__( 'Heatmap anzeigen', 'boxyfy' ),
				__( 'Klickdaten löschen', 'boxyfy' )
			), array(
				'br'     => array(),
				'strong' => array(),
			) );
			?>
		</p>

		<?php
		// Alle Produkte laden.
		$args     = array(
			'post_type'      => 'boxyfy_tsprodukte',
			'posts_per_page' => -1,
		);
		$products = get_posts( $args );

		// Zunächst: maximale Klickzahl ermitteln.
		$max_clicks = 0;
		if ( $products ) {
			foreach ( $products as $product ) {
				$click_data  = get_post_meta( $product->ID, '_boxyfy_heatmap_clicks', true );
				$click_count = is_array( $click_data ) ? count( $click_data ) : 0;
				if ( $click_count > $max_clicks ) {
					$max_clicks = $click_count;
				}
			}
		}
		?>

		<table class="wp-list-table widefat fixed striped">
			<thead>
				<tr>
					<th><?php esc_html_e( 'Produktseiten',       'boxyfy' ); ?></th>
					<th><?php esc_html_e( 'Heatmaps',            'boxyfy' ); ?></th>
					<th><?php esc_html_e( 'Klickzahlen',         'boxyfy' ); ?></th>
					<th><?php esc_html_e( 'Klickdaten löschen',  'boxyfy' ); ?></th>
				</tr>
			</thead>

			<tbody>
				<?php
				if ( $products ) {
					foreach ( $products as $product ) {
						$title     = esc_html( $product->post_title );
						$pid       = esc_attr( $product->ID );
						$permalink = esc_url( get_permalink( $product->ID ) );

						// Verlinkten Titel erstellen.
						$linked_title = "<a href='{$permalink}' target='_blank' rel='noopener noreferrer'>{$title}</a>";

						// Klickdaten prüfen und Info setzen.
						$click_data  = get_post_meta( $product->ID, '_boxyfy_heatmap_clicks', true );
						$click_count = is_array( $click_data ) ? count( $click_data ) : 0;
						if ( $click_count >= 250 ) {
							$status = '<span class="boxyfy-heatmap-klickcount-250">' . esc_html__( '250 Klicks erreicht', 'boxyfy' ) . '</span>';
						} else {
							$status = '<span class="boxyfy-heatmap-klickcount-defaultcolor">' . sprintf(
								esc_html__( '%d von 250 Klicks gesammelt', 'boxyfy' ),
								intval( $click_count )
							) . '</span>';
						}

						echo '<tr' . esc_attr($row_style) . '>';
						echo '<td>' . wp_kses_post($linked_title) . '</td>';
						echo '<td>
    						<button class="button button-primary boxyfy-view-heatmap-button"
        						data-postid="' . esc_attr($pid) . '"
        						data-url="' . esc_url($permalink) . '"
    						>' . esc_html__('Heatmap anzeigen', 'boxyfy') . '</button>
						</td>';
						echo '<td>' . wp_kses_post($status) . '</td>';
						echo '<td>
    						<button class="button button-secondary boxyfy-delete-heatmap-button"
        						data-postid="' . esc_attr($pid) . '"
    						>' . esc_html__('Klickdaten löschen', 'boxyfy') . '</button>
						</td>';
						echo '</tr>';
					}
				} else {
					echo "<tr><td colspan='4'>Keine tsprodukte gefunden.</td></tr>";
				}
				?>
			</tbody>
		</table>

		<hr />

		<!-- IFrame + Overlay -->
		<div class="boxyfy-heatmap-wrapper" id="boxyfy-iframe-wrapper">
			<iframe id="boxyfy-iframe" class="boxyfy-heatmap-iframe" scrolling="no"></iframe>
			<div id="boxyfy-heatmap-overlay" class="boxyfy-heatmap-overlay"></div>
		</div><!-- .wrap -->
	<?php
}

/**
 * 4) AJAX-HANDLER: Speichern der Klicks (max. 250 Klicks pro Produkt).
 */
add_action( 'wp_ajax_boxyfy_record_click', 'boxyfy_record_click' );
add_action( 'wp_ajax_nopriv_boxyfy_record_click', 'boxyfy_record_click' );
function boxyfy_record_click() {
	check_ajax_referer( 'boxyfy_heatmap_nonce', 'nonce' );
	$post_id = intval( $_POST['post_id'] ?? 0 );
	$x       = floatval( $_POST['x'] ?? 0 );
	$y       = floatval( $_POST['y'] ?? 0 );
	if ( $post_id <= 0 ) {
		wp_send_json_error( array( 'message' => 'Ungültige Post-ID.' ) );
	}
	$click_data = get_post_meta( $post_id, '_boxyfy_heatmap_clicks', true );
	if ( ! is_array( $click_data ) ) {
		$click_data = array();
	}
	// Limitierung: max. 250 Klicks pro Produkt.
	if ( count( $click_data ) >= 250 ) {
		wp_send_json_error(
			array(
				'message' => 'Maximale Anzahl von 250 Klicks erreicht. Bitte löschen Sie die Klickdaten, um weitere Klicks zu sammeln.',
			)
		);
	}
	$click_data[] = array( 'x' => $x, 'y' => $y );
	update_post_meta( $post_id, '_boxyfy_heatmap_clicks', $click_data );
	wp_send_json_success( array( 'point' => array( 'x' => $x, 'y' => $y, 'value' => 1 ) ) );
}

/**
 * 5) AJAX-HANDLER: Klickdaten auslesen.
 */
add_action( 'wp_ajax_boxyfy_get_single_heatmap_data', 'boxyfy_get_single_heatmap_data' );
function boxyfy_get_single_heatmap_data() {
	check_ajax_referer( 'boxyfy_heatmap_nonce', 'nonce' );
	$post_id = intval( $_POST['post_id'] ?? 0 );
	if ( $post_id <= 0 ) {
		wp_send_json_error( array( 'message' => 'Ungültige Post-ID.' ) );
	}
	$click_data = get_post_meta( $post_id, '_boxyfy_heatmap_clicks', true );
	if ( ! is_array( $click_data ) || empty( $click_data ) ) {
		wp_send_json_error( array( 'message' => 'Keine Klick-Daten vorhanden.' ) );
	}
	$heatmap_data = array(
		'max'  => 10,
		'data' => array(),
	);
	foreach ( $click_data as $c ) {
		$heatmap_data['data'][] = array(
			'x'     => (int) $c['x'],
			'y'     => (int) $c['y'],
			'value' => 1,
		);
	}
	wp_send_json_success( $heatmap_data );
}

/**
 * 6) AJAX-HANDLER: Klickdaten löschen.
 */
add_action( 'wp_ajax_boxyfy_delete_heatmap_data', 'boxyfy_delete_heatmap_data' );
function boxyfy_delete_heatmap_data() {
	check_ajax_referer( 'boxyfy_heatmap_admin_nonce', 'nonce' );
	$post_id = intval( $_POST['post_id'] ?? 0 );
	if ( $post_id <= 0 ) {
		wp_send_json_error( array( 'message' => 'Ungültige Post-ID.' ) );
	}
	delete_post_meta( $post_id, '_boxyfy_heatmap_clicks' );
	wp_send_json_success( array( 'message' => 'Klickdaten gelöscht.' ) );
}

/**
 * 7) Aktivierung.
 */
register_activation_hook( __FILE__, 'boxyfy_heatmap_activate' );
function boxyfy_heatmap_activate() {
	if ( false === get_option( 'boxyfy_heatmap_radius' ) ) {
		add_option( 'boxyfy_heatmap_radius', 50 );
	}
	if ( false === get_option( 'boxyfy_heatmap_gradient' ) ) {
		add_option(
			'boxyfy_heatmap_gradient',
			wp_json_encode(
				array(
					"0.45" => "blue",
					"0.55" => "lime",
					"0.65" => "yellow",
					"0.95" => "red",
				)
			)
		);
	}
}

/**
 * 8) Deaktivierung (Optional).
 */
register_deactivation_hook( __FILE__, 'boxyfy_heatmap_deactivate' );
function boxyfy_heatmap_deactivate() {
	// Optionale Deaktivierungsaufgaben (z. B. Löschen von Optionen).
	// delete_option( 'boxyfy_heatmap_radius' );
	// delete_option( 'boxyfy_heatmap_gradient' );
}