<?php
/**
 * LLMS Content Cleaner
 *
 * @package Website_LLMS_TXT
 */

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

class LLMS_Content_Cleaner {
    /**
     * List of page builder patterns to clean
     *
     * Every shortcode and block delimiter pattern that used to be here is gone. They
     * are LLMS_Content_Sanitizer's job now, and two of them were destructive: see
     * docs/internals-content-sanitizer.md.
     */
    private $builder_patterns = array(
        '/<!-- elementor.*?-->/s',
        '/data-elementor-[^\"]*=\"[^\"]*\"/',
        '/class=\"elementor-.*?\"/',
        
        '/<!-- wp:fl-builder\/layout.*?-->/s',
        '/class=\"fl-builder-content.*?\"/',
        
        '/<!-- wp:oxygen.*?-->/s',

        '/class="[^"]*"/i',
        '/style="[^"]*"/i',
        '/id="[^"]*"/i',
        '/data-[^=]*="[^"]*"/i',
        
        '/\s*<div[^>]*>\s*/',
        '/\s*<\/div>\s*/',
        '/\s*<span[^>]*>\s*/',
        '/\s*<\/span>\s*/'
    );

    /**
     * Clean content from a post
     *
     * Expansion and shortcode removal happen once, in LLMS_Content_Sanitizer, before
     * anything reaches this class. Nothing here may reintroduce either.
     *
     * @param string $content The raw post content
     * @return string The cleaned content
     */
    public function clean($content) {
        if (empty($content)) {
            return '';
        }

        $original_content = $content;

        $content = html_entity_decode($content, ENT_QUOTES | ENT_HTML5, 'UTF-8');
        $content = str_replace(
            array('&hellip;', '&ndash;', '&mdash;', '&nbsp;', '…', '...', '&quot;', '&apos;', '&lt;', '&gt;', '&amp;'),
            array('...', '-', '-', ' ', '...', '...', '"', "'", '<', '>', '&'),
            $content
        );

        $content = preg_replace('/&[a-z0-9#]+;/i', '', $content);

        $content = $this->remove_page_builder_content($content);
        
        $content = $this->clean_wordpress_content($content);
        
        $content = $this->final_cleanup($content);

        if (trim($content) === '') {
            // Never the raw input: that republished exactly what was just removed.
            do_action('llms_content_cleaned_to_empty', $original_content);
            return '';
        }

        return $content;
    }

    /**
     * Remove page builder specific content
     */
    private function remove_page_builder_content($content) {
        $content = preg_replace('/<!--[\s\S]*?-->/', '', $content);
        
        foreach ($this->builder_patterns as $pattern) {
            $content = preg_replace($pattern, '', $content);
        }
        
        return $content;
    }

    /**
     * Clean WordPress specific content
     */
    private function clean_wordpress_content($content) {
        $content = wp_strip_all_tags($content, true);
        
        $content = preg_replace('/\r\n|\r/', "\n", $content);
        
        $content = preg_replace('/&[a-z0-9#]+;/i', '', $content);
        
        return $content;
    }

    /**
     * Final cleanup and formatting
     */
    private function final_cleanup($content) {
        $content = preg_replace('/\s+/', ' ', $content);
        
        $content = preg_replace('/([.!?])(?! |\n)/', '$1 ', $content);
        
        $content = preg_replace('/\(\s*\)|\[\s*\]/', '', $content);

        $content = preg_replace('/^\s*[\p{P}\s]*\s*$/m', '', $content);
        
        $content = preg_replace('/\n{3,}/', "\n\n", $content);
        
        $content = str_replace(array('...', '. . .', '…'), '...', $content);
        
        return trim($content);
    }

    /**
     * Add additional cleaning pattern
     *
     * @param string $pattern Regular expression pattern to add
     */
    public function add_cleaning_pattern($pattern) {
        $this->builder_patterns[] = $pattern;
    }
}