<?php
/**
 * WP Multi – Modul: Automatische Tags
 *
 * Automatisch aus wp-multi.php ausgelagert. Wird über den Loader in
 * wp-multi.php eingebunden (nur wenn das WP Multi Toolkit aktiv ist).
 */

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

/*
 * Verbessertes Auto-Tag-Plugin mit optimierter Sicherheit, Performance und Benutzerfreundlichkeit
 */

define('WP_MULTI_AUTO_TAGS_OPTION', 'wp_multi_custom_stopwords');
define('WP_MULTI_AUTO_TAGS_QUEUE', 'wp_multi_auto_tags_queue');
define('WP_MULTI_AUTO_TAGS_NONCE', 'wp_multi_auto_tags_nonce');

/**
 * Fügt automatische Tags zu einem Beitrag hinzu.
 *
 * @param int $post_id ID des Beitrags.
 */
function wp_multi_auto_add_tags($post_id) {
    if (get_post_type($post_id) !== 'post') {
        return;
    }

    $existing_tags = wp_get_post_tags($post_id, ['fields' => 'names']);
    if (!empty($existing_tags)) {
        return;
    }

    $post = get_post($post_id);
    if (!$post) {
        error_log("WP Multi Auto Tags: Beitrag $post_id nicht gefunden.");
        return;
    }

    $content = strip_tags($post->post_content);
    $content = mb_strtolower($content, 'UTF-8');

    // Stopwörter laden
    $stopwords = wp_multi_get_stopwords();
    $words = wp_multi_extract_words($content, $stopwords);

    if (empty($words)) {
        return;
    }

    $word_counts = array_count_values($words);
    arsort($word_counts);

    $top_tags = array_slice(array_keys($word_counts), 0, 5);
    if (!empty($top_tags)) {
        wp_set_post_tags($post_id, $top_tags, true);
    }
}

/**
 * Extrahiert relevante Wörter aus dem Inhalt.
 *
 * @param string $content Der Inhalt des Beitrags.
 * @param array  $stopwords Liste der Stopwörter.
 * @return array Liste der extrahierten Wörter.
 */
function wp_multi_extract_words($content, $stopwords) {
    preg_match_all('/\b[a-zäöüß]{4,}\b/u', $content, $matches);
    return array_unique(array_diff($matches[0], $stopwords));
}

/**
 * Lädt die kombinierten Stopwörter (Standard + benutzerdefiniert).
 *
 * @return array Liste der Stopwörter.
 */
function wp_multi_get_stopwords() {
    $cache_key = 'wp_multi_stopwords';
    $stopwords = get_transient($cache_key);

    if ($stopwords !== false) {
        return $stopwords;
    }

    $custom_stopwords = get_option(WP_MULTI_AUTO_TAGS_OPTION, '');
    $custom_stopwords = array_filter(array_map('trim', explode(',', sanitize_text_field($custom_stopwords))));

    $default_stopwords = [
        'und', 'oder', 'ein', 'eine', 'der', 'die', 'das', 'in', 'mit', 'auf', 'zu', 'von',
        'für', 'ist', 'es', 'im', 'an', 'am', 'bei', 'auch', 'aber', 'so', 'dass', 'kann',
        'wenn', 'wie', 'wir', 'man', 'nur', 'nicht', 'mehr', 'als', 'sein', 'wurde', 'werden',
        'hat', 'haben', 'schon', 'doch', 'denn', 'diese', 'dieser', 'dieses', 'nach', 'sehr', 'allgemein'
    ];

    $stopwords = array_merge($default_stopwords, $custom_stopwords);
    set_transient($cache_key, $stopwords, DAY_IN_SECONDS);
    return $stopwords;
}

/**
 * Fügt das Admin-Menü für automatische Tags hinzu.
 */
// Der Auto-Tags-Menüpunkt wird zentral in wp_multi_register_admin_menus() registriert.

/**
 * Rendert die Admin-Seite für automatische Tags.
 */
function wp_multi_auto_tags_page() {
    if (!current_user_can('manage_options')) {
        wp_die(__('Zugriff verweigert.', 'wp-multi'));
    }

    wpmt_admin_page_open(
        __('Automatische Tags', 'wp-multi'),
        __('Fügt Beiträgen ohne Tags automatisch passende Schlagwörter hinzu', 'wp-multi')
    );

    wpmt_admin_card_open(__('Einstellungen', 'wp-multi'));
    ?>
        <form method="post" action="options.php">
            <?php
            settings_fields('wp_multi_auto_tags_options');
            do_settings_sections('wp-multi-auto-tags');
            wp_nonce_field(WP_MULTI_AUTO_TAGS_NONCE, WP_MULTI_AUTO_TAGS_NONCE);
            ?>
            <div class="wpm-field">
                <label class="wpm-field__label" for="wp_multi_custom_stopwords"><?php esc_html_e('Stopwörter (kommagetrennt)', 'wp-multi'); ?>
                    <small class="wpm-field__hint"><?php esc_html_e('Diese Wörter werden nicht als Tags verwendet. Beispiele: wird, auch, aber', 'wp-multi'); ?></small>
                </label>
                <textarea id="wp_multi_custom_stopwords" name="wp_multi_custom_stopwords" rows="5"><?php echo esc_textarea(get_option(WP_MULTI_AUTO_TAGS_OPTION, '')); ?></textarea>
            </div>
            <p><input type="submit" value="<?php esc_attr_e('Speichern', 'wp-multi'); ?>" class="wpm-btn wpm-btn--primary"></p>
        </form>
    <?php
    wpmt_admin_card_close();

    wpmt_admin_card_open(__('Alle Beiträge verarbeiten', 'wp-multi'));
    ?>
        <p><?php esc_html_e('Durchsucht alle vorhandenen Beiträge ohne Tags und ergänzt automatisch passende Schlagwörter.', 'wp-multi'); ?></p>
        <button id="start-auto-tags" class="wpm-btn wpm-btn--primary"><?php esc_html_e('Jetzt ausführen', 'wp-multi'); ?></button>
        <div id="progress-container" style="display:none; width:100%; background:#f4f4f4; border-radius:8px; margin-top:20px; overflow:hidden;">
            <div id="progress-bar" style="width:0%; height:30px; background:#2ecc71; text-align:center; color:#fff; line-height:30px; font-weight:bold; transition:width .4s;">0%</div>
        </div>
        <p id="status-message" style="margin-top:15px; font-weight:600; color:var(--wpm-primary,#0073aa);"></p>
    <?php
    wpmt_admin_card_close();

    wpmt_admin_page_close();
    ?>
    <script>
        var wpMultiAutoTags = <?php echo wp_json_encode([
            'ajaxurl' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce(WP_MULTI_AUTO_TAGS_NONCE),
            'messages' => [
                'processing' => __('Wird verarbeitet...', 'wp-multi'),
                'run' => __('Jetzt ausführen', 'wp-multi'),
                'loading' => __('Lade...', 'wp-multi'),
                'no_posts' => __('Keine Beiträge gefunden.', 'wp-multi'),
                'success' => __('Automatische Tags erfolgreich hinzugefügt!', 'wp-multi'),
                'error' => __('Fehler bei der Verarbeitung.', 'wp-multi'),
                'start_error' => __('Fehler beim Starten der Verarbeitung.', 'wp-multi'),
            ],
        ]); ?>;
        jQuery(document).ready(function($) {
            $('#start-auto-tags').on('click', function() {
                const button = $(this);
                const progressContainer = $('#progress-container');
                const progressBar = $('#progress-bar');
                const statusMessage = $('#status-message');

                button.prop('disabled', true).text(wpMultiAutoTags.messages.processing);
                progressContainer.show();
                progressBar.css('width', '0%').text('0%');
                statusMessage.text(wpMultiAutoTags.messages.loading);

                $.ajax({
                    url: wpMultiAutoTags.ajaxurl,
                    method: 'POST',
                    data: {
                        action: 'wp_multi_process_auto_tags',
                        nonce: wpMultiAutoTags.nonce,
                    },
                    success: function(response) {
                        if (!response.data.total) {
                            statusMessage.text(wpMultiAutoTags.messages.no_posts);
                            button.prop('disabled', false).text(wpMultiAutoTags.messages.run);
                            return;
                        }

                        const total = response.data.total;
                        let processed = 0;
                        const batchSize = 10;

                        function processBatch() {
                            $.ajax({
                                url: wpMultiAutoTags.ajaxurl,
                                method: 'POST',
                                data: {
                                    action: 'wp_multi_process_auto_tags_step',
                                    batchSize: batchSize,
                                    nonce: wpMultiAutoTags.nonce,
                                },
                                success: function(result) {
                                    if (result.data.done) {
                                        processed += batchSize;
                                        const percent = Math.min(Math.round((processed / total) * 100), 100);
                                        progressBar.css('width', percent + '%').text(percent + '%');

                                        if (processed < total) {
                                            processBatch();
                                        } else {
                                            button.prop('disabled', false).text(wpMultiAutoTags.messages.run);
                                            statusMessage.text(wpMultiAutoTags.messages.success);
                                        }
                                    }
                                },
                                error: function() {
                                    statusMessage.text(wpMultiAutoTags.messages.error);
                                    button.prop('disabled', false).text(wpMultiAutoTags.messages.run);
                                },
                            });
                        }
                        processBatch();
                    },
                    error: function() {
                        statusMessage.text(wpMultiAutoTags.messages.start_error);
                        button.prop('disabled', false).text(wpMultiAutoTags.messages.run);
                    },
                });
            });
        });
    </script>
    <?php
}

/**
 * Registriert die Einstellungen für automatische Tags.
 */
function wp_multi_auto_tags_settings_init() {
    register_setting('wp_multi_auto_tags_options', WP_MULTI_AUTO_TAGS_OPTION, [
        'sanitize_callback' => function($input) {
            $input = sanitize_text_field($input);
            return implode(',', array_map('trim', explode(',', $input)));
        },
    ]);
}
add_action('admin_init', 'wp_multi_auto_tags_settings_init');

/**
 * Verarbeitet die Initialisierung der Auto-Tag-Verarbeitung via AJAX.
 */
function wp_multi_process_auto_tags() {
    check_ajax_referer(WP_MULTI_AUTO_TAGS_NONCE, 'nonce');

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 100,
        'fields' => 'ids',
        'no_found_rows' => true, // Optimierung
    ];

    $posts = get_posts($args);
    if (empty($posts)) {
        wp_send_json_success(['total' => 0]);
    }

    set_transient(WP_MULTI_AUTO_TAGS_QUEUE, $posts, 300);
    wp_send_json_success(['total' => count($posts)]);
}
add_action('wp_ajax_wp_multi_process_auto_tags', 'wp_multi_process_auto_tags');

/**
 * Verarbeitet einen Batch von Beiträgen für die Auto-Tag-Verarbeitung.
 */
function wp_multi_process_auto_tags_step() {
    check_ajax_referer(WP_MULTI_AUTO_TAGS_NONCE, 'nonce');

    $queue = get_transient(WP_MULTI_AUTO_TAGS_QUEUE);
    $batchSize = isset($_POST['batchSize']) ? absint($_POST['batchSize']) : 10;
    $batchSize = max(1, min($batchSize, 50));

    if (!$queue || empty($queue)) {
        wp_send_json_success(['done' => false]);
    }

    set_time_limit(30); // Timeout verhindern
    $posts_to_process = array_splice($queue, 0, $batchSize);

    foreach ($posts_to_process as $post_id) {
        wp_multi_auto_add_tags($post_id);
    }

    set_transient(WP_MULTI_AUTO_TAGS_QUEUE, $queue, 300);
    wp_send_json_success(['done' => true]);
}
add_action('wp_ajax_wp_multi_process_auto_tags_step', 'wp_multi_process_auto_tags_step');

/**
 * Fügt Tags automatisch bei neuen oder aktualisierten Beiträgen hinzu.
 *
 * @param int $post_id ID des Beitrags.
 */
function wp_multi_auto_tag_on_save($post_id) {
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
        return;
    }

    wp_multi_auto_add_tags($post_id);
}
add_action('save_post', 'wp_multi_auto_tag_on_save', 10, 1);



