<?php
/**
 * Plugin Name: Boxyfy
 * Plugin URI: https://boxyfy.de
 * Description: Ein Plugin zur Erstellung von Produktseiten inkl. Ranking- und Bewertungssystem, Heatmapdarstellung, Preisdiagramm, Preistracker, internen Produktboxen sowie Amazon-Affiliate-Produktboxen und einer Kategorie-Vergleichsansicht mittels Produktboxen, Sortier-, Such- und Filterfunktion.
 * Version: 1.3.12.2
 * Author: Michel Tank
 * License: GPL-2.0-or-later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: boxyfy
 */

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

function boxyfy_load_textdomain() {
    load_plugin_textdomain( 'boxyfy', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'boxyfy_load_textdomain' );

/**
 * Fügt neben "Deaktivieren" weitere Plugin-Links hinzu.
 *
 * @param array $links Vorhandene Links (z. B. "Deactivate", "Edit").
 * @return array Geändertes Array mit zusätzlichen Einträgen.
 */
function boxyfy_add_action_links( $links ) {
	// Link zur Lizenz-Seite
	$boxylicense_link = '<a href="admin.php?page=boxyfy_license">' 
		. __( 'Lizenzschlüssel-Status', 'boxyfy' ) . '</a>';
	
	// Link zur Shopping-Seite
	$boxyshop_link = '<a href="admin.php?page=boxyfy_info_kaufen">' 
		. __( 'Hier Lizenzschlüssel kaufen', 'boxyfy' ) . '</a>';

	// Link zur Lizenz- und Shoppingseite wird IMMER angezeigt.
	array_unshift( $links, $boxylicense_link, $boxyshop_link );

	// Link "Einstellungen" NUR anzeigen, wenn Lizenz valide:
	if ( true === boxyfy_is_license_valid() ) {
		$boxysettings_link = '<a href="admin.php?page=boxyfy-settings">' 
			. __( 'Einstellungen', 'boxyfy' ) . '</a>';

		array_unshift( $links, $boxysettings_link );
	}

	return $links;
}

add_filter(
	'plugin_action_links_' . plugin_basename( __FILE__ ),
	'boxyfy_add_action_links'
);

/**
 * Speichert beim Aktivieren des Plugins den aktuellen Zeitstempel.
 */
register_activation_hook( __FILE__, 'boxyfy_set_activation_date' );
function boxyfy_set_activation_date() {
    if ( false === get_option( 'boxyfy_activation_date' ) ) {
        update_option( 'boxyfy_activation_date', time() );
    }
}

/**
 * Zeigt im Admin-Bereich eine Hinweisbox an, wenn das Plugin
 * vor weniger als 3 Tagen aktiviert wurde.
 */
add_action( 'admin_notices', 'boxyfy_show_activation_notice' );
function boxyfy_show_activation_notice() {
	$activation_date = get_option( 'boxyfy_activation_date' );

	if ( ! $activation_date ) {
		return;
	}

	// Anzeige für 3 Tage = 3 × 24 × 60 × 60 = 259 200 Sekunden.
	if ( time() >= ( $activation_date + 259200 ) ) {
		return;
	}

	echo '<div class="notice notice-warning is-dismissible">';

	echo '<p><strong>' .
		esc_html__( 'Boxyfy-Plugin – 2 wichtige Schritte zu Beginn:', 'boxyfy' ) .
	'</strong></p>';

	$steps = __(
		'<ol>
			<li>Gehe auf WordPress&nbsp;Dashboard → Einstellungen → Permalinks und klicke anschließend auf den Button <strong>Änderungen speichern</strong>, um die URL-Struktur zu aktualisieren, sodass die Boxyfy-Produktseiten korrekt angezeigt werden.</li>
			<li>Gehe auf Boxyfy → Einstellungen und klicke anschließend auf den unteren Button <strong>Änderungen speichern</strong>, sodass bezüglich vieler Einstellungen wie Farbe oder Schrift die Standard-Einstellungen übernommen werden.</li>
		</ol>',
		'boxyfy'
	);

	echo wp_kses(
		$steps,
		array(
			'ol'     => array(),
			'li'     => array(),
			'strong' => array(),
			'br'     => array(),
		)
	);

	echo '</div>';
}

/**
 * Zeigt im Admin-Bereich eine permanente Hinweisbox mit dem Link zur Live-Demo-Seite an.
 */
add_action( 'admin_notices', 'boxyfy_show_live_demo_notice' );
function boxyfy_show_live_demo_notice() {
	echo '<div class="notice notice-info">';
	echo '<p><strong>' . esc_html__( 'Teste Boxyfy live!', 'boxyfy' ) . '</strong></p>';
	echo '<p>' . esc_html__( 'Erlebe Boxyfy in Aktion – sieh Dir die Live-Demo an und entdecke die vielseitigen Produktboxen, Vergleichstabellen und mehr!', 'boxyfy' ) . '</p>';
	echo '<p><a href="https://boxyfy.de/live-demo-produkte-vergleiche/" target="_blank" rel="noopener" class="button button-primary">' . esc_html__( 'Jetzt Live-Demo ansehen', 'boxyfy' ) . '</a></p>';
	echo '</div>';
}

/**
 * Hinweisbox: Classic Editor wird empfohlen für optimale Nutzung.
 */
add_action( 'admin_notices', 'boxyfy_classic_editor_recommendation_notice' );
function boxyfy_classic_editor_recommendation_notice() {
	$current_screen = get_current_screen();

	if ( isset( $current_screen->post_type ) && 'boxyfy_tsprodukte' === $current_screen->post_type ) {

		if ( function_exists( 'use_block_editor_for_post_type' ) && use_block_editor_for_post_type( 'boxyfy_tsprodukte' ) ) {

			echo '<div class="notice notice-warning">';
			echo '<p><strong>' . esc_html__( 'Hinweis zur Bearbeitung von Produkten mit Boxyfy:', 'boxyfy' ) . '</strong></p>';
			echo '<p>' . esc_html__( 'Beachte, dass der Gutenberg-Editor die speziellen Boxyfy-Metaboxen und Boxyfy-Eingabefelder (wie ASIN, Preis, Ranking etc.) beim Bearbeiten der Produkte teilweise ausblenden oder unzugänglich machen kann.', 'boxyfy' ) . '</p>';
			echo '<p>' . esc_html__( 'Für eine vollständige Nutzung aller Funktionen empfehlen wir, das Plugin "Classic Editor" zu installieren und zu aktivieren.', 'boxyfy' ) . '</p>';
			echo '</div>';
		}
	}
}

/**
 * Entfernt den Aktivierungsstempel, wenn das Plugin gelöscht wird.
 */
register_uninstall_hook( __FILE__, 'boxyfy_uninstall_cleanup' );
function boxyfy_uninstall_cleanup() {
    delete_option( 'boxyfy_activation_date' );
}

/**
 * Zeigt eine Hinweisbox an, wenn das Plugin nicht über einen validen Lizenzschlüssel aktiviert wurde.
 */
function boxyfy_license_warning_notice() {
    if ( false === boxyfy_is_license_valid() ) {
        // Externer Link zum Kauf der Lizenz
        $product_link = '<a href="https://boxyfy.de/produkt-kategorie/boxyfy-plugin-lizenzen/" target="_blank" rel="noopener">'
                        . esc_html__( 'Boxyfy.de – Standard oder Pro Lizenz kaufen', 'boxyfy' ) . '</a>';

        // Interner Link zur Lizenzschlüssel-Seite im WordPress-Dashboard (jetzt korrekt als Unterpunkt)
        $license_link = '<a href="' . esc_url( admin_url( 'edit.php?post_type=boxyfy_tsprodukte&page=boxyfy_license' ) ) . '" rel="noopener">'
                        . esc_html__( 'Lizenzschlüssel-Status', 'boxyfy' ) . '</a>';

        echo '<div class="notice notice-warning is-dismissible">';
        echo '<p><strong>' . esc_html__( 'Boxyfy-Plugin – Lizenzkauf schaltet alle Funktionen frei:', 'boxyfy' ) . '</strong></p>';

        echo '<p>' . wp_kses(
            sprintf(
			    /* translators: %1$s ist der Link: Lizenzkauf, %2$s ist der Link: Lizenzschlüssel-Status */
                __( 'Nutze den begrenzten Rabatt-Coupon <strong>WELCOME25</strong> und erwerbe günstig eine Lizenz unter: %1$s. Gib den Lizenzschlüssel unter %2$s ein und schalte damit alle Funktionen frei (automatisierte Amazon-Preisaktualisierung, alle Amazon-Produktboxen, Produktergleich mit Filter-, Sortierung- und Suchoption, Produktlabels, Amazon-Preisverlauf, Heatmap (nur Pro-Lizenz), Produktboxen für angelegte Produkte mit KI-Chatbox (nur Pro-Lizenz), etc.).', 'boxyfy' ),
                $product_link,
                $license_link
            ),
            [
                'strong' => [],
                'a'      => [
                    'href'   => true,
                    'target' => true,
                    'rel'    => true,
                ],
            ]
        ) . '</p>';
        echo '</div>';
    }
}
add_action( 'admin_notices', 'boxyfy_license_warning_notice' );

/**
 * Zeigt eine Hinweisbox an, wenn die Amazon API-Zugangsdaten nicht ausgefüllt wurden.
 */
function boxyfy_amazon_api_warning_notice() {
    // Aktuelle Seite abrufen
    $current_screen = get_current_screen();

    // Hinweis nur anzeigen, wenn wir NICHT auf der API-Einstellungsseite sind
    if ( isset( $_GET['page'] ) && $_GET['page'] === 'boxyfy_amazon_api_settings' ) {
        return;
    }

	// Nur Nonce-Check ausführen, wenn wir uns auf der Amazon API-Einstellungsseite befinden
	if ( isset( $_GET['page'] ) && $_GET['page'] === 'boxyfy_amazon_api_settings' ) {
    	if ( isset( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] ) {
        	$nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ) : '';
        	if ( ! wp_verify_nonce( $nonce, 'boxyfy_api_nonce_action' ) ) {
            	wp_die( esc_html__( 'Sicherheitsüberprüfung fehlgeschlagen.', 'boxyfy' ) );
        	}
    	}
	}

    // Amazon API-Einstellungen abrufen
    $options = get_option( 'boxyfy_amazon_settings', array() );

    // Prüfen, ob alle Felder ausgefüllt sind
    $missing_fields = array();

    if ( empty( $options['access_key'] ) ) {
        $missing_fields[] = 'Access Key';
    }
    if ( empty( $options['secret_key'] ) ) {
        $missing_fields[] = 'Secret Key';
    }
    if ( empty( $options['partner_tag'] ) ) {
        $missing_fields[] = 'Partner Tag';
    }
    if ( empty( $options['host'] ) ) {
        $missing_fields[] = 'Host';
    }
    if ( empty( $options['region'] ) ) {
        $missing_fields[] = 'Region';
    }

    // Wenn mindestens ein Feld fehlt, Hinweis anzeigen
    if ( ! empty( $missing_fields ) ) {
        echo '<div class="notice notice-warning is-dismissible">';
        echo '<p><strong>' . esc_html__( 'Boxyfy-Plugin - Hinweis zur Amazon-Partner-API:', 'boxyfy' ) . '</strong> ';
        echo esc_html__( 'Bitte fülle die fehlenden Amazon-API-Zugangsdaten aus, bevor Du Produkte anlegst oder Amazon-Produkte via Shortcode ausgeben lassen möchtest! Noch keine Zugangsdaten? Besuche die Seite: https://partnernet.amazon.de/', 'boxyfy' );
        echo '<br><a href="' . esc_url( admin_url( 'admin.php?page=boxyfy_amazon_api_settings' ) ) . '" class="boxyfy-notice-button button-primary">' . esc_html__( 'Jetzt Amazon-Partner-Zugangsdaten eingeben', 'boxyfy' ) . '</a>';
        echo '</p>';
        echo '</div>';
    }
}

// Hinweis in allen Admin-Seiten deines Plugins anzeigen
add_action( 'admin_notices', 'boxyfy_amazon_api_warning_notice' );

// In boxyfy.php (im Plugin-Root)
if ( ! defined( 'BOXYFY_PLUGIN_FILE' ) ) {
    define( 'BOXYFY_PLUGIN_FILE', __FILE__ );
}


// Enqueue-Funktionen / CSS-/ JS-Dateien/Third-Party-Library registrieren und einbinden
require_once plugin_dir_path(__FILE__) . 'includes/enqueue-styles.php';
require_once plugin_dir_path(__FILE__) . 'includes/enqueue-scripts.php';

/**
 * Globale-Hilfsfunktion: Wandelt einen Preisstring in einen Float-Wert um.
 *
 * @param string $price Der Preisstring (z. B. "1.234,56 €").
 * @return float Der konvertierte Preis als Float.
 */
if ( ! function_exists( 'boxyfy_convert_price_to_float' ) ) {
	function boxyfy_convert_price_to_float( $price ) {
		if ( empty( $price ) ) {
			return 0.0;
		}
		// Entferne alle nicht-numerischen Zeichen außer Punkt und Komma.
		$clean_price = preg_replace( '/[^\d.,]/', '', $price );
		// Tausender-Punkte entfernen.
		$clean_price = str_replace( '.', '', $clean_price );
		// Dezimal-Komma in Dezimal-Punkt umwandeln.
		$clean_price = str_replace( ',', '.', $clean_price );
		return floatval( $clean_price );
	}
}

if ( ! defined( 'BOXYFY_AMZ_CACHE_PREFIX' ) ) {
	define( 'BOXYFY_AMZ_CACHE_PREFIX', 'boxyfy_amz_' );   // EIN zentraler Präfix
}

/**
 * Baut einen konsistenten Cache-Key.
 *
 * @param string $module  Kurzkennung, z. B. 'product', 'slider' …
 * @param string $id      Eindeutiger Identifier (ASIN, Hash …)
 * @return string
 */
function boxyfy_build_cache_key( $module, $id ) {
	return BOXYFY_AMZ_CACHE_PREFIX . $module . '_' . md5( $id );
}

/**
 * Registriert den Custom Post Type für Boxyfy-Produkte.
 */
function boxyfy_plugin_create_post_type() {
	$labels = array(
		'name'               => __( 'Alle Boxyfy-Produkte', 'boxyfy' ),
		'singular_name'      => __( 'Produkt', 'boxyfy' ),
		'add_new'            => __( 'Produkt hinzufügen', 'boxyfy' ),
		'add_new_item'       => __( 'Neues Produkt hinzufügen', 'boxyfy' ),
		'edit_item'          => __( 'Produkt bearbeiten', 'boxyfy' ),
		'new_item'           => __( 'Neues Produkt', 'boxyfy' ),
		'view_item'          => __( 'Produkt ansehen', 'boxyfy' ),
		'search_items'       => __( 'Produkte durchsuchen', 'boxyfy' ),
		'not_found'          => __( 'Keine Produkte gefunden', 'boxyfy' ),
		'not_found_in_trash' => __( 'Keine Produkte im Papierkorb gefunden', 'boxyfy' ),
		'all_items'          => __( 'Alle Produkte', 'boxyfy' ),
		'menu_name'          => __( 'Boxyfy', 'boxyfy' ),
		'name_admin_bar'     => __( 'Produkt', 'boxyfy' ),
	);

	$args = array(
		'labels'        => $labels,
		'public'        => true,
		'has_archive'   => true,
		'supports'      => array( 'title', 'editor', 'thumbnail' ),
		'rewrite'       => array( 'slug' => 'produkt-item' ),
		'menu_position' => 5,
		'menu_icon'     => 'dashicons-cart',
	);

	register_post_type( 'boxyfy_tsprodukte', $args );
}
add_action( 'init', 'boxyfy_plugin_create_post_type' );

/**
 * Registriert die Produktkategorie-Taxonomie.
 */
function boxyfy_register_all_taxonomy() {
	$labels = array(
		'name'              => _x( 'Produktkategorien', 'taxonomy general name', 'boxyfy' ),
		'singular_name'     => _x( 'Produktkategorie', 'taxonomy singular name', 'boxyfy' ),
		'search_items'      => __( 'Produktkategorien durchsuchen', 'boxyfy' ),
		'all_items'         => __( 'Alle Produktkategorien', 'boxyfy' ),
		'parent_item'       => __( 'Elternkategorie', 'boxyfy' ),
		'parent_item_colon' => __( 'Elternkategorie:', 'boxyfy' ),
		'edit_item'         => __( 'Produktkategorie bearbeiten', 'boxyfy' ),
		'update_item'       => __( 'Produktkategorie aktualisieren', 'boxyfy' ),
		'add_new_item'      => __( 'Neue Produktkategorie hinzufügen', 'boxyfy' ),
		'new_item_name'     => __( 'Name der neuen Produktkategorie', 'boxyfy' ),
		'menu_name'         => __( 'Produktkategorien', 'boxyfy' ),
	);

	$args = array(
		'hierarchical'      => true,
		'labels'            => $labels,
		'show_ui'           => true,
		'show_admin_column' => true,
		'query_var'         => true,
		'rewrite'           => array( 'slug' => 'produktkategorie' ),
	);

	register_taxonomy( 'boxyfy_tsprodukt_kategorie', array( 'boxyfy_tsprodukte' ), $args );
}
add_action( 'init', 'boxyfy_register_all_taxonomy' );

/* Lade externe Dateien */
require_once plugin_dir_path( __FILE__ ) . 'admin/preistracker-single.php';
require_once plugin_dir_path( __FILE__ ) . 'admin/license-functions.php';
require_once plugin_dir_path( __FILE__ ) . 'admin/welcome-screen.php';

/**
 * Fügt ein Untermenü für die Lizenzschlüssel-Seite hinzu.
 */
function boxyfy_add_license_menu() {
	add_submenu_page(
		'edit.php?post_type=boxyfy_tsprodukte',  // Übergeordnetes Menü.
		__( 'Plugin Lizenz',   'boxyfy' ),   // Seitentitel
		__( 'Lizenzschlüssel', 'boxyfy' ),   // Menübezeichnung
		'manage_options',                 // Berechtigung.
		'boxyfy_license',                 // Slug.
		'boxyfy_render_license_page'      // Callback zur Anzeige.
	);
}
add_action( 'admin_menu', 'boxyfy_add_license_menu' );

/**
 * Fügt das Amazon API-Untermenü hinzu.
 */
function boxyfy_add_amazon_menu() {
	add_submenu_page(
			'edit.php?post_type=boxyfy_tsprodukte',        // Übergeordnetes Menü.
			__( 'Amazon-API-Einstellungen vornehmen', 'boxyfy' ),    // Seitentitel.
			__( 'Amazon Partner', 'boxyfy' ),  // Menübezeichnung.
			'manage_options',                         // Berechtigung.
			'boxyfy_amazon_api_settings',             // Slug.
			'boxyfy_render_amazon_api_page'           // Callback zur Anzeige.
	);
}
add_action( 'admin_menu', 'boxyfy_add_amazon_menu' );

/**
 * Rendert die Amazon API-Einstellungsseite.
 */
function boxyfy_render_amazon_api_page() {
	// Formular wurde gesendet.
	if ( isset( $_POST['submit'] ) ) {
		check_admin_referer( 'boxyfy_amazon_api_settings' );

		$options = array(
        	'access_key'  => isset( $_POST['boxyfy_access_key'] ) ? sanitize_text_field( wp_unslash( $_POST['boxyfy_access_key'] ) ) : '',
        	'secret_key'  => isset( $_POST['boxyfy_secret_key'] ) ? sanitize_text_field( wp_unslash( $_POST['boxyfy_secret_key'] ) ) : '',
        	'partner_tag' => isset( $_POST['boxyfy_partner_tag'] ) ? sanitize_text_field( wp_unslash( $_POST['boxyfy_partner_tag'] ) ) : '',
        	'host'        => isset( $_POST['boxyfy_host'] ) ? sanitize_text_field( wp_unslash( $_POST['boxyfy_host'] ) ) : '',
        	'region'      => isset( $_POST['boxyfy_region'] ) ? sanitize_text_field( wp_unslash( $_POST['boxyfy_region'] ) ) : '',
    	);

		update_option( 'boxyfy_amazon_settings', $options );
	}

	$options = get_option(
		'boxyfy_amazon_settings',
		array(
			'access_key'  => '',
			'secret_key'  => '',
			'partner_tag' => '',
			'host'        => 'webservices.amazon.de',
			'region'      => 'eu-west-1',
		)
	);
	?>
	<div class="wrap">
	<h1><?php esc_html_e( 'Amazon-Partnerprogramm: Zugangsdaten hinzufügen', 'boxyfy' ); ?></h1>
	<p>
		<?php
		// Den übersetzten String formatieren und in $translated_text speichern
		$translated_text = sprintf(
			/* translators: %1$s: Link-Start, %2$s: Link-End */
			__( 'Fülle die folgenden Felder mit Deinen Zugangsdaten aus, die Du mit dem Amazon-Partnerprogramm erhältst. Melde Dich hierzu auf %1$sdieser Seite%2$s an und hole Dir über <b>Tools > Product Advertising API</b> Deinen Access und Secret Key. Oben rechts auf der Webseite siehst Du Deine <b>E-Mail > Verwalte Deine Tracking-IDs</b>: Hier kannst Du einen Partner-Tag anlegen mit "-21" am Ende für DE.<br><br>*Amazon PAAPI Host für DE: webservices.amazon.de<br>*Amazon PAAPI Region für DE: eu-west-1', 'boxyfy' ),
			'<a href="https://partnernet.amazon.de/home" target="_blank" rel="noopener noreferrer">',
			'</a>'
		);

		// Nur erlaubte HTML-Tags durchlassen (hier: <a>, <b> und <br>)
		echo wp_kses(
			$translated_text,
			array(
				'a'  => array(
					'href'   => true,
					'target' => true,
					'rel'    => true,
				),
				'b'  => array(),
				'br' => array(),
			)
		);
		?>
	</p>
		<form method="post" action="">
			<?php wp_nonce_field( 'boxyfy_amazon_api_settings' ); ?>
			<table class="form-table">
				<tr valign="top">
					<th scope="row"><?php esc_html_e( 'Access Key', 'boxyfy' ); ?></th>
					<td>
						<input type="password" class="boxyfy-amazon-credentials-inputrows" name="boxyfy_access_key" value="<?php echo esc_attr( $options['access_key'] ); ?>" />
					</td>
				</tr>
				<tr valign="top">
					<th scope="row"><?php esc_html_e( 'Secret Key', 'boxyfy' ); ?></th>
					<td>
						<input type="password" class="boxyfy-amazon-credentials-inputrows" name="boxyfy_secret_key" value="<?php echo esc_attr( $options['secret_key'] ); ?>" />
					</td>
				</tr>
				<tr valign="top">
					<th scope="row"><?php esc_html_e( 'Partner Tag', 'boxyfy' ); ?></th>
					<td>
						<input type="text" class="boxyfy-amazon-credentials-inputrows" name="boxyfy_partner_tag" value="<?php echo esc_attr( $options['partner_tag'] ); ?>" />
					</td>
				</tr>
				<tr valign="top">
					<th scope="row"><?php esc_html_e( 'Amazon PAAPI Host', 'boxyfy' ); ?></th>
					<td>
						<input type="text" class="boxyfy-amazon-credentials-inputrows" name="boxyfy_host" value="<?php echo esc_attr( $options['host'] ); ?>" />
					</td>
				</tr>
				<tr valign="top">
					<th scope="row"><?php esc_html_e( 'Amazon PAAPI Region', 'boxyfy' ); ?></th>
					<td>
						<input type="text" class="boxyfy-amazon-credentials-inputrows" name="boxyfy_region" value="<?php echo esc_attr( $options['region'] ); ?>" />
					</td>
				</tr>
			</table>
			<?php submit_button(); ?>
		</form>
		<p class="boxyfy-amazon-credentials-paragraph">
			<a href="<?php echo esc_url( admin_url( 'admin.php?page=boxyfy_amazon_api_test' ) ); ?>">
				<?php esc_html_e( 'Hier kannst Du Deine Zugangsdaten testen', 'boxyfy' ); ?>
			</a>
		</p>
	</div>
	<?php
}

require_once plugin_dir_path( __FILE__ ) . 'admin/amazonasintest.php';

/**
 * Fügt das Amazon API-Test-Untermenü hinzu.
 */
function boxyfy_add_amazon_api_test_menu() {
	add_submenu_page(
		'edit.php?post_type=boxyfy_tsprodukte',  // Übergeordnetes Menü.
		__( 'Amazon API Test',  'boxyfy' ),      // Seitentitel (Tab-Titel)
		__( 'Amazon-API-Test',  'boxyfy' ),      // Eintrag im Menü
		'manage_options',                 // Berechtigung.
		'boxyfy_amazon_api_test',         // Slug.
		'boxyfy_render_amazon_api_test_page' // Callback zur Anzeige.
	);
}
add_action( 'admin_menu', 'boxyfy_add_amazon_api_test_menu' );

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_produktlabels.php';

/**
 * Fügt eine Metabox für Produktlabels hinzu.
 */
function boxyfy_add_produktlabels_metabox() {
	if ( true === boxyfy_is_license_valid() ) {
		add_meta_box(
			'boxyfy_produktlabels',       // ID der Metabox.
			__( 'Produktlabels', 'boxyfy' ),  // Titel.
			'boxyfy_produktlabels_callback', // Callback-Funktion.
			'boxyfy_tsprodukte',                   // Post-Typ.
			'side'                          // Position.
		);
	}
}
add_action( 'add_meta_boxes', 'boxyfy_add_produktlabels_metabox' );

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_products_star_rating.php';

/**
 * Fügt eine Metabox für die Sternebewertung hinzu.
 */
function boxyfy_add_rating_metabox() {
	add_meta_box(
		'boxyfy_rating_metabox',          // ID.
		__( 'Sternebewertung', 'boxyfy' ), // Titel.
		'boxyfy_render_rating_metabox',   // Callback.
		'boxyfy_tsprodukte',                     // Post-Typ.
		'side',                           // Kontext.
		'default'                         // Priorität.
	);
}
add_action( 'add_meta_boxes', 'boxyfy_add_rating_metabox' );

/**
 * Fügt ein Untermenü "Einstellungen" unter TSProdukte hinzu.
 */
function boxyfy_add_settings_submenu() {
	add_submenu_page(
			'edit.php?post_type=boxyfy_tsprodukte', // Übergeordnetes Menü.
			__( 'Einstellungen', 'boxyfy' ),        // Seitentitel (Tab-Titel)
			__( 'Einstellungen', 'boxyfy' ),        // Menütext
			'manage_options',               // Berechtigung.
			'boxyfy-settings',              // Slug.
			'boxyfy_render_settings_page'   // Callback.
	);
}
add_action( 'admin_menu', 'boxyfy_add_settings_submenu' );

/**
 * Registriert alle Plugin-Optionen und verwendet dabei passende Sanitization Callback-Funktionen.
 *
 * Textfelder: sanitize_text_field
 * Textareas: sanitize_textarea_field
 * Farbwerte: sanitize_hex_color
 * Integer: absint
 * Checkbox: Eigene Callback, die nur "yes" als gültig akzeptiert
 * Floats: floatval
 */
function boxyfy_register_options() {

	// Sanitization Callback für Checkboxen (erwartet "yes" oder "no")
	if ( ! function_exists( 'boxyfy_sanitize_checkbox' ) ) {
		function boxyfy_sanitize_checkbox( $input ) {
			return ( 'yes' === $input ) ? 'yes' : 'no';
		}
	}

	// Beispielhafte Registrierungen:

	// Allgemeine Einstellungen
	register_setting( 'boxyfy_options_group', 'boxyfy_show_pro_contra', 'boxyfy_sanitize_checkbox' );
	register_setting( 'boxyfy_options_group', 'boxyfy_show_affiliate_disclaimer', 'boxyfy_sanitize_checkbox' );
	register_setting( 'boxyfy_options_group', 'boxyfy_affiliate_disclaimer_text', 'sanitize_textarea_field' );
	register_setting( 'boxyfy_options_group', 'boxyfy_autoupdate_interval', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_content_labeltop_background_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_content_labeltop_font_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_title_font_size', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_content_font_size', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_produktinfos_oben_font_size', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_main_imageslider_dot_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_main_imageslider_dot_active_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_default_star_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_produktinfos_oben_font_maincolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_produktinfos_head_fontweight', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_content_background_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_preis_zeile_background_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_weitere_preise_zeilen_background_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_preise_buttons_background_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_all_buttons_icon_and_fontcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_lowest_price_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_lowest_price_border_and_font', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_show_preiswecker', 'boxyfy_sanitize_checkbox' );
	register_setting( 'boxyfy_options_group', 'boxyfy_show_ki_chatbox_singleproductbox', 'boxyfy_sanitize_checkbox' );
	register_setting( 'boxyfy_options_group', 'boxyfy_ai_gradient_color1', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_ai_gradient_color2', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_preiswecker_farben', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_autorbox_expertise_tag', 'sanitize_text_field' );

	// Angelegte Produkte – Produktboxen
	register_setting( 'boxyfy_options_group', 'boxyfy_box_tsproduktlabel', 'sanitize_text_field' );
    register_setting( 'boxyfy_options_group', 'boxyfy_box_tsproduktlabel_color', 'sanitize_text_field' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_bewertung_text', 'sanitize_text_field' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_header_font_size', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_header_fontweights', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_info_font_size', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_farbe_title', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_shop_button_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_shop_button_text', 'sanitize_text_field' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_info_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_box_info_text_color', 'sanitize_hex_color' );

	// Produktboxen-Vergleichsansicht – Filter
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_filterhead_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_filterhead_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_listen_slider_kopf_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_listen_slider_kopf_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_listen_entries_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_listen_entries_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_listen_entries_hovercolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_filter_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_slider_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_slider_kreis_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxes_seitenanzahl', 'absint' );

	// Produktboxen-Vergleichsansicht – Produktboxen
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_title_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_labels_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_vornach_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_tsproduktlabel', 'sanitize_text_field' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_rankinglabel_background', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_rankinglabel_fontcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_reset_hover_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_show_pro_contra', 'boxyfy_sanitize_checkbox' );
	register_setting( 'boxyfy_options_group', 'boxyfy_vergleich_boxen_deal_ausgabe_schwelle', 'floatval' );

	// Amazon-Produktboxen groß
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_title_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_title_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_liste_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_badge_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_taglabel_fontcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_taglabel_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_taglabel_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_erster_button_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_erster_button_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_zweiter_button_backgroundcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_zweiter_button_schriftcolor', 'sanitize_hex_color' );

	// Amazon-Produktboxen klein
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_klein_title_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_title_klein_fontweight', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_title_klein_schriftcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_title_klein_schriftcolor_hover', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_klein_label_backcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_klein_bordercolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_einzelbox_klein_button_backcolor', 'sanitize_hex_color' );

	// Amazon-Slider-Ausgabe
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_reduce_label_schwelle', 'floatval' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_reduce_label_schwelle_stark', 'floatval' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_reduce_label_fontcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_pricereduce_and_button_fontcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_reduce_label_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_slider_pricereduce_and_button_color', 'sanitize_hex_color' );

	// Amazon-Bestseller-Ausgabe: Tabellen-Darstellung
	
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_besttable_main_fontsize', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_besttable_headlink_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_besttable_headbackground_color', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_besttable_button_backcolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amz_besttable_iconfont_color', 'sanitize_hex_color' );

	// Amazon-Bestseller-Ausgabe: Produktboxen-Darstellung
	
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_titlecolor', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_colorofribbon', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_font_size_title', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_font_size_listpoints', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_background_first_button', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_background_second_button', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_buttontextcolor_first_button', 'sanitize_hex_color' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_bestseller_boxes_buttontextcolor_second_button', 'sanitize_hex_color' );

	// Produkt-Bewertung in rot, gelb und grün
	register_setting( 'boxyfy_options_group', 'boxyfy_green_rating_min', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_green_rating_max', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_yellow_rating_min', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_yellow_rating_max', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_red_rating_min', 'absint' );
	register_setting( 'boxyfy_options_group', 'boxyfy_red_rating_max', 'absint' );

	// Cache-Dauer für Produktdaten (in Sekunden)
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_cache_enable', 'rest_sanitize_boolean' );
	register_setting( 'boxyfy_options_group', 'boxyfy_amazon_cache_ttl', 'absint' );
		
	// Gradient für Kauf-Buttons
	register_setting(
    	'boxyfy_options_group',
    	'boxyfy_preise_buttons_gradient',
    	'sanitize_text_field'
	);
	
}
add_action( 'admin_init', 'boxyfy_register_options' );

require_once plugin_dir_path( __FILE__ ) . 'admin/backend_setting_pages.php';

/**
 * AJAX-Handler zum Löschen alter Amazon-Preis-Daten.
 */
function boxyfy_ajax_delete_old_data() {
	$nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';

	if ( ! wp_verify_nonce( $nonce, 'delete_old_data_action' ) ) {
		wp_send_json_error( array( 'message' => __( 'Nonce-Überprüfung fehlgeschlagen.', 'boxyfy' ) ) );
	}

	global $wpdb;

	// Sanitize delete_period aus $_POST
	$period = isset( $_POST['delete_period'] ) ? intval( $_POST['delete_period'] ) : 0;

	if ( $period <= 0 ) {
		wp_send_json_error( array( 'message' => __( 'Ungültiger Zeitraum für das Löschen.', 'boxyfy' ) ) );
	}

	$date_threshold = gmdate( 'Y-m-d H:i:s', strtotime( '-' . $period . ' months' ) );
	$table_history  = $wpdb->prefix . 'preiswecker_price_history';

	$deleted = $wpdb->query(
		$wpdb->prepare( "DELETE FROM $table_history WHERE recorded_at < %s", $date_threshold )
	);

	if ( false === $deleted ) {
		wp_send_json_error( array(
			'message' => sprintf(
				/* translators: %s is the database error message */
				__( 'Löschen fehlgeschlagen: %s', 'boxyfy' ),
				$wpdb->last_error
			)
		) );
	} else {
		wp_send_json_success( array(
			'message' => sprintf(
				/* translators: %d is the number of deleted entries */
				__( 'Es wurden %d Einträge gelöscht.', 'boxyfy' ),
				intval( $deleted )
			)
		) );
	}
}
add_action( 'wp_ajax_delete_old_data', 'boxyfy_ajax_delete_old_data' );


/**
 * AJAX-Handler für die manuelle Aktualisierung.
 */
function boxyfy_manual_update_ajax_handler() {
	check_ajax_referer( 'boxyfy_manual_update_nonce', 'nonce' );

	if ( ! current_user_can( 'manage_options' ) ) {
		wp_send_json_error( array( 'message' => __( 'Unzureichende Berechtigungen.', 'boxyfy' ) ) );
	}

	// Hier die Update-Funktion aufrufen.
	boxyfy_update_amazon_prices_for_all();

	wp_send_json_success( array( 'message' => __( 'Amazon-Preis und UVP wurden gerade auf allen Produktseiten aktualisiert!', 'boxyfy' ) ) );
}
add_action( 'wp_ajax_boxyfy_manual_update', 'boxyfy_manual_update_ajax_handler' );

/**
 * WP-CLI-Befehl registrieren (optional).
 */
if ( defined( 'WP_CLI' ) && WP_CLI ) {
	WP_CLI::add_command( 'boxyfy update-amazon-prices', 'boxyfy_update_amazon_prices_for_all' );
}

/* Lade externe Dateien für einzelne Produkdetails. */
require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_productdetails_list.php';

/**
 * Fügt die Metabox für Produktdetails hinzu.
 */
function boxyfy_create_productdetails_metabox() {
	add_meta_box(
		'tsprodukt_details', // ID.
		__( 'Boxyfy: Produktdetails hinzufügen', 'boxyfy' ),  // Titel.
		'boxyfy_create_productdetails_metabox_callback', // Callback.
		'boxyfy_tsprodukte', // Post-Typ.
		'normal', // Position.
		'high' // Priorität.
	);
}
add_action( 'add_meta_boxes', 'boxyfy_create_productdetails_metabox' );

/* Lade externe Dateien für einzelne Produktfunktionen. */
require_once plugin_dir_path( __FILE__ ) . 'admin/singleproduktpreis.php';

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_produkt_ranking.php';

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_weitere_preise.php';

/**
 * Fügt eine Metabox für weitere Preise und Shops hinzu.
 */
function boxyfy_weitere_preise_metabox() {
	if ( true === boxyfy_is_license_valid() ) {
		add_meta_box(
			'boxyfy_weitere_preise_metabox',         // ID.
			__( 'Boxyfy: weitere Preise und Shops angeben', 'boxyfy' ), // Titel.
			'boxyfy_weitere_preise_metabox_callback', // Callback.
			'boxyfy_tsprodukte',                               // Post-Typ.
			'normal',                                   // Position.
			'high'                                      // Priorität.
		);
	}		
}
add_action( 'add_meta_boxes', 'boxyfy_weitere_preise_metabox' );

require_once plugin_dir_path( __FILE__ ) . 'admin/singleproduktimages.php';

function boxyfy_add_amazon_image_metabox() {
    add_meta_box(
        'boxyfy_amazon_image_metabox',
       	__( 'Boxyfy: Amazon-Bild als Beitragsbild verwenden', 'boxyfy' ),
        'boxyfy_amazon_image_metabox_callback',
        'boxyfy_tsprodukte',
        'normal',
        'high'
    );
}
add_action( 'add_meta_boxes', 'boxyfy_add_amazon_image_metabox' );

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_vorteile_nachteile.php';

/**
 * Fügt eine Metabox für Vor- und Nachteile hinzu.
 */
function boxyfy_vor_nachteile_metabox() {
	add_meta_box(
		'boxyfy_vor_nachteile_metabox',
		__( 'Boxyfy: Vor- und Nachteile anlegen', 'boxyfy' ),
		'boxyfy_vor_nachteile_metabox_callback',
		'boxyfy_tsprodukte',
		'normal',
		'high'
	);
}
add_action( 'add_meta_boxes', 'boxyfy_vor_nachteile_metabox' );

require_once plugin_dir_path( __FILE__ ) . 'admin/boxyfy_metabox_produktbewertung.php';

/**
 * Fügt eine Metabox für die Produktbewertung hinzu.
 */
function boxyfy_add_bewertung_metabox() {
	add_meta_box(
		'boxyfy_bewertung',   // ID.
		__( 'Produktbewertung', 'boxyfy' ), // Titel.
		'boxyfy_bewertung_callback', // Callback.
		'boxyfy_tsprodukte',         // Post-Typ.
		'side'                // Position.
	);
}
add_action( 'add_meta_boxes', 'boxyfy_add_bewertung_metabox' );


/**
 * Überschreibt das Single-Template für TSProdukte.
 *
 * @param string $template Das aktuelle Template.
 * @return string
 */
function boxyfy_template_include( $template ) {
	if ( is_singular( 'boxyfy_tsprodukte' ) ) {
		$custom_template = plugin_dir_path( __FILE__ ) . 'Templates/single-tsprodukt.php';
		if ( file_exists( $custom_template ) ) {
			return $custom_template;
		}
	}
	return $template;
}
add_filter( 'template_include', 'boxyfy_template_include' );

require_once plugin_dir_path( __FILE__ ) . 'admin/single-produkt-shortcode.php';

/**
 * Fügt in der Sidebar eine Metabox für den Shortcode hinzu.
 */
function boxyfy_shortcodes_intern_metabox() {
	add_meta_box(
		'boxyfy_shortcodes_intern_metabox',         // ID.
		__( 'Produktbox-Shortcodes:', 'boxyfy' ),   // Titel.
		'boxyfy_shortcodes_intern_metabox_callback', // Callback.
		'boxyfy_tsprodukte',                          // Post-Typ.
		'side',                                // Position.
		'default'
	);
}
add_action( 'add_meta_boxes', 'boxyfy_shortcodes_intern_metabox' );

/**
 * Callback für die Shortcode-Metabox.
 *
 * @param WP_Post $post Der aktuelle Post.
 */
function boxyfy_shortcodes_intern_metabox_callback( $post ) {
	
	// Produktbox-Shortcode
	$shortcode = '[boxyfy_produktbox id="' . $post->ID . '"]';
	echo '<p>' . esc_html__( 'Shortcode für normale Produktbox:', 'boxyfy' ) . '</p>';
	echo '<input type="text" readonly value="' . esc_attr( $shortcode ) . '" class="boxyfy-main-shortcodemeta-textfield" />';

	// Vergleichs-Shortcode generieren:
	$terms = get_the_terms( $post->ID, 'boxyfy_tsprodukt_kategorie' );
	if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
		// Nutze den ersten gefundenen Term.
		$term = array_shift( $terms );
		$vergleich_shortcode = '[boxyfy_produkte_vergleich kategorie="' . esc_attr( $term->slug ) . '"]';
		echo '<p>' . esc_html__( 'Shortcode für den Produktvergleich (Lizenzkauf notwendig):', 'boxyfy' ) . '</p>';
		echo '<input type="text" readonly value="' . esc_attr( $vergleich_shortcode ) . '" class="boxyfy-main-shortcodemeta-textfield" />';
	}
}

require_once plugin_dir_path( __FILE__ ) . 'admin/produkt-vergleichstabelle-filter.php';

/**
 * Shortcode für Produktvergleiche.
 *
 * @param array $atts Shortcode-Attribute.
 * @return string
 */
function boxyfy_produkte_vergleich_shortcode( $atts ) {
    $atts = shortcode_atts(
        array(
            'kategorie' => '',
        ),
        $atts,
        'boxyfy_produkte_vergleich' // Referenz für Dritte/Filter
    );

    if ( empty( $atts['kategorie'] ) ) {
        return '<p>' . esc_html__( 'Bitte geben Sie eine Kategorie an.', 'boxyfy' ) . '</p>';
    }

    ob_start();
    boxyfy_anzeigen_produkte_kategorie( $atts['kategorie'] );
    return ob_get_clean();
}
add_shortcode( 'boxyfy_produkte_vergleich', 'boxyfy_produkte_vergleich_shortcode' );

/* Amazon-Produktbox-Shortcodes einbinden */
require_once plugin_dir_path( __FILE__ ) . 'includes/amazon-shortcodes/amazon-produktbox-simple.php';
require_once plugin_dir_path( __FILE__ ) . 'includes/amazon-shortcodes/amazon-produktbox-slider.php';
require_once plugin_dir_path( __FILE__ ) . 'includes/amazon-shortcodes/amazon-bestseller-table.php';
require_once plugin_dir_path( __FILE__ ) . 'includes/amazon-shortcodes/amazon-bestseller-table2.php';
require_once plugin_dir_path( __FILE__ ) . 'includes/amazon-shortcodes/amazon-produktbox-small.php';

require_once plugin_dir_path( __FILE__ ) . 'admin/metabox_weitere_bilder.php';

/**
 * Fügt eine Metabox für den Bilderupload auf Produktseiten hinzu.
 */
function boxyfy_add_more_images_metabox() {
	add_meta_box(
			'boxyfy_add_more_images_metabox',   // ID.
			__( 'Boxyfy: Weitere Bilder hochladen', 'boxyfy' ),   // Titel.
			'boxyfy_add_more_images_metabox_callback',       // Callback.
			'boxyfy_tsprodukte',                             // Post-Typ.
			'normal',                                 // Position.
			'high'                                    // Priorität.
	);
}
add_action( 'add_meta_boxes', 'boxyfy_add_more_images_metabox' );

require_once plugin_dir_path( __FILE__ ) . 'admin/autoren-profile.php';
require_once plugin_dir_path( __FILE__ ) . 'admin/heatmap-function.php';

/**
 * Fügt ein Untermenü "Info & kaufen" hinzu.
 */
function boxyfy_add_info_kaufen_menu() {
	add_submenu_page(
		'edit.php?post_type=boxyfy_tsprodukte',     // Übergeordnetes Menü.
		__( 'Informationen & Lizenzkauf', 'boxyfy' ),   // Seitentitel
		__( 'Info & Lizenz kaufen', 'boxyfy' ),         // Menütext
		'manage_options',                    // Berechtigung.
		'boxyfy_info_kaufen',                // Slug.
		'boxyfy_render_info_kaufen_page'     // Callback.
	);
}
add_action( 'admin_menu', 'boxyfy_add_info_kaufen_menu' );

/**
 * Bindet die Datei der "Info & kaufen"-Seite ein.
 */
function boxyfy_include_info_kaufen_page() {
	include_once plugin_dir_path( __FILE__ ) . 'admin/info-und-kaufen.php';
}
add_action( 'admin_menu', 'boxyfy_include_info_kaufen_page' );

// Redirect zur Willkommensseite nach Plugin-Aktivierung
register_activation_hook( __FILE__, 'boxyfy_plugin_activate' );
function boxyfy_plugin_activate() {
	set_transient( '_boxyfy_activation_redirect', true, 30 );
}

add_action( 'admin_init', 'boxyfy_welcome_redirect' );
function boxyfy_welcome_redirect() {
	if ( ! get_transient( '_boxyfy_activation_redirect' ) ) {
		return;
	}
	delete_transient( '_boxyfy_activation_redirect' );

	if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) {
		return;
	}

	wp_safe_redirect( admin_url( 'edit.php?post_type=boxyfy_tsprodukte&page=boxyfy-welcome' ) );
	exit;
}

/**
 * Fügt ein Untermenü für die Willkommensseite hinzu.
 */
function boxyfy_add_welcome_submenu_page() {
	add_submenu_page(
		'edit.php?post_type=boxyfy_tsprodukte',  // Übergeordnetes Menü (Boxyfy CPT).
		__( 'Willkommen bei Boxyfy', 'boxyfy' ), // Seitentitel (Tab-Titel)
		__( 'Willkommen', 'boxyfy' ),            // Menübezeichnung
		'manage_options',                        // Berechtigung.
		'boxyfy-welcome',                        // Slug.
		'boxyfy_render_welcome_page'             // Callback zur Anzeige.
	);
}
add_action( 'admin_menu', 'boxyfy_add_welcome_submenu_page' );