<?php
// Защита от прямого доступа
if (!defined('ABSPATH')) {
    exit;
}

function ai_content_wizard_process_text($article_content) {
    // Обработка основного текста
    $article_content = ai_content_wizard_basic_processing($article_content);
    
    // Оборачивание в блоки Gutenberg
    $article_content = ai_content_wizard_wrap_gutenberg($article_content);
    
    // Генерация оглавления и добавление тега more
    $article_content = ai_content_wizard_generate_toc_and_more($article_content);

    // Финальная очистка
    $article_content = ai_content_wizard_final_cleanup($article_content);

    return $article_content;
}

function ai_content_wizard_basic_processing($content) {
    // Удаление нежелательных HTML тегов
    $content = preg_replace('/<\/?(article|html|title|body|head|meta|script)[^>]*>/i', '', $content);

    // Удаление всего после символа "|" в заголовке
    $content = preg_replace_callback('/<h([1-6])>(.*?)<\/h\1>/', function($matches) {
        $text = explode('|', $matches[2])[0]; // Убираем все, что после |
        return "<h{$matches[1]}>" . trim($text) . "</h{$matches[1]}>";
    }, $content);

    // Удаление текста в круглых и квадратных скобках в заголовке
    $content = preg_replace_callback('/<h([1-6])>(.*?)<\/h\1>/', function($matches) {
        $text = preg_replace('/[\[\(].*?[\]\)]/', '', $matches[2]); // Убираем текст в круглых и квадратных скобках
        return "<h{$matches[1]}>" . trim($text) . "</h{$matches[1]}>";
    }, $content);

    // Обработка Markdown подзаголовков
    $content = preg_replace_callback('/(?:\n|^)(#{1,2})(.+?)(?:\n|$)/m', function($matches) {
        $level = strlen($matches[1]) + 1; // # - h2, ## - h3
        return "<h{$level}>".trim($matches[2])."</h{$level}>\n";
    }, $content);

    // Преобразование жирного текста и курсива
    $content = preg_replace([
        '/\*\*(.+?)\*\*/s', // Жирный текст
        '/\*(.+?)\*/s' // Курсив
    ], [
        '<strong>$1</strong>',
        '<em>$1</em>'
    ], $content);

    // Преобразование текстовых ссылок в формате Markdown в HTML ссылки
    $content = preg_replace('/\[(.*?)\]\((.*?)\)/', '<a href="$2">$1</a>', $content);

    // Обработка текста с URL в конце фразы
    $content = preg_replace_callback('/-\s+\[([^\]]+)\s+(https?:\/\/[^\s\]]+)\]/', function($matches) {
        return '- <a href="' . $matches[2] . '">' . $matches[1] . '</a>';
    }, $content);

    // Обработка подзаголовков и текста с отступами
    $content = preg_replace_callback('/(?:\n|^)\*{1,2}(.+?)\*{1,2}(?:\n(?!<p>|\n|$)(.+))/m', function($matches) {
        $header = "<h2>{$matches[1]}</h2>";
        $paragraph = isset($matches[2]) ? "<p>{$matches[2]}</p>" : '';
        return "{$header}\n{$paragraph}";
    }, $content);

    // Оборачивание текста в <p>, если он не содержит HTML тегов
    $content = preg_replace_callback('/(?<=\n\n|^)([^<>\n]+|\n?(<strong>.+?<\/strong>|<a href="[^"]+">.+?<\/a>|<em>.+?<\/em>\n?)+)(?=\n\n|$)/s', function($matches) {
        if (!preg_match('/<[^>]+>/', $matches[0])) {
            return "<p>{$matches[0]}</p>";
        }
        return $matches[0];
    }, $content);

    return $content;
}

function ai_content_wizard_wrap_gutenberg($content) {
    // Заголовки
    $content = preg_replace_callback('/<h([2-6])>(.*?)<\/h\1>/', function($matches) {
        return "<!-- wp:heading {\"level\":" . $matches[1] . "} --><h" . $matches[1] . ">" . $matches[2] . "</h{$matches[1]}><!-- /wp:heading -->";
    }, $content);

    // Параграфы
    $content = preg_replace('/<p>(.*?)<\/p>/s', "<!-- wp:paragraph --><p>$1</p><!-- /wp:paragraph -->", $content);

    // Обработка списков
    $content = preg_replace_callback('/<ul>(.*?)<\/ul>/s', function($matches) {
        $listItems = '';
        preg_match_all('/<li>(.*?)<\/li>/s', $matches[1], $items);
        foreach ($items[1] as $item) {
            $listItems .= "<!-- wp:list-item --><li>$item</li><!-- /wp:list-item -->";
        }
        return "<!-- wp:list {\"ordered\":false} --><ul>$listItems</ul><!-- /wp:list -->";
    }, $content);

    $content = preg_replace_callback('/<ol>(.*?)<\/ol>/s', function($matches) {
        $listItems = '';
        preg_match_all('/<li>(.*?)<\/li>/s', $matches[1], $items);
        foreach ($items[1] as $item) {
            $listItems .= "<!-- wp:list-item --><li>$item</li><!-- /wp:list-item -->";
        }
        return "<!-- wp:list {\"ordered\":true} --><ol>$listItems</ol><!-- /wp:list -->";
    }, $content);

    // Цитаты
    $content = preg_replace('/<blockquote>(.*?)<\/blockquote>/s', "<!-- wp:quote --><blockquote>$1</blockquote><!-- /wp:quote -->", $content);

    // Обработка изображений (включая <picture>)
    $content = preg_replace_callback('/<img src="([^"]+)" alt="([^"]*)"(.*?)\/?>/', function ($matches) {
        $src = $matches[1];
        $alt = $matches[2];
        $attributes = $matches[3];
        return "<!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><figure class=\"wp-block-image\"><img src=\"$src\" alt=\"$alt\" $attributes/></figure><!-- /wp:image -->";
    }, $content);

    $content = preg_replace_callback('/<picture>(.*?)<\/picture>/s', function ($matches) {
        preg_match('/srcset="([^"]+)"/', $matches[1], $srcMatches);
        $src = $srcMatches[1] ?? '';
        preg_match('/alt="([^"]*)"/', $matches[1], $altMatches);
        $alt = $altMatches[1] ?? '';
        return "<!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><figure class=\"wp-block-image\"><img src=\"$src\" alt=\"$alt\"/></figure><!-- /wp:picture -->";
    }, $content);

    // Обработка кода
    $content = preg_replace_callback('/```html\n(.*?)```/s', function($matches) {
        return $matches[1];
    }, $content);

    $content = preg_replace_callback('/```(.*?)```/s', function($matches) {
        return $matches[1];
    }, $content);

    $content = preg_replace_callback('/<pre>(.*?)<\/pre>/s', function($matches) {
        $code = htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8');
        return "<!-- wp:code --><pre class=\"wp-block-code\"><code>$code</code></pre><!-- /wp:code -->";
    }, $content);

    $content = preg_replace('/```\s*$/', '', $content);

    // Обработка таблиц
    $content = preg_replace_callback('/<table>(.*?)<\/table>/s', function($matches) {
        $tableContent = trim($matches[1]);
        if (!strpos($tableContent, '<tbody>')) {
            $tableContent = "<tbody>\n" . $tableContent . "\n</tbody>";
        }
        $tableContent = preg_replace('/<tr>/', "\n  <tr>", $tableContent);
        $tableContent = preg_replace('/<\/tr>/', "</tr>\n", $tableContent);
        $tableContent = preg_replace('/<td>/', "    <td>", $tableContent);
        $tableContent = preg_replace('/<\/td>/', "</td>\n", $tableContent);
        $tableContent = preg_replace('/<th>/', "    <th>", $tableContent);
        $tableContent = preg_replace('/<\/th>/', "</th>\n", $tableContent);
        $tableContent = preg_replace('/<\/tbody>/', "\n</tbody>", $tableContent);
        return "<!-- wp:table --><figure class=\"wp-block-table\"><table>\n$tableContent\n</table></figure><!-- /wp:table -->";
    }, $content);

    // Обработка шорткодов (например, [gallery])
    $content = preg_replace('/\[gallery(.*?)\]/s', "<!-- wp:gallery -->[gallery$1]<!-- /wp:gallery -->", $content);

    return $content;
}

function ai_content_wizard_generate_toc_and_more($content) {
    // Генерация оглавления
    if (ai_content_wizard_get_setting('ai_content_wizard_enable_toc_generation', 0) == 1) {
        $toc_data = create_custom_toc($content);
        if (!empty($toc_data['toc'])) {
            $toc_content = $toc_data['toc'];
            $content = $toc_data['content'];
            $pos = strpos($content, '</p>');
            if ($pos !== false) {
                $nextPos = strpos($content, '<!-- /wp:', $pos);
                $insertPos = $pos + 4;
                if ($nextPos !== false) {
                    $endCommentPos = strpos($content, '-->', $nextPos) + 3;
                    $insertPos = $endCommentPos;
                }
                $content = substr_replace($content, $toc_content, $insertPos, 0);
            }
        }
    }

    // Добавление тега more
    if (ai_content_wizard_get_setting('ai_content_wizard_enable_more_tag', 0) == 1) {
        $pos = strpos($content, '</p>');
        if ($pos !== false) {
            $nextPos = strpos($content, '<!-- /wp:', $pos);
            if ($nextPos !== false) {
                $endCommentPos = strpos($content, '-->', $nextPos) + 3;
                $insertPos = $endCommentPos;
            } else {
                $insertPos = $pos + 4;
            }
            $more_block = "<!-- wp:more -->\n<!--more-->\n<!-- /wp:more -->";
            $content = substr_replace($content, $more_block, $insertPos, 0);
        }
    }

    return $content;
}

function ai_content_wizard_final_cleanup($content) {
    // Добавляем обработку блоков кода: декодируем HTML-сущности внутри Gutenberg-блоков с кодом
    $content = preg_replace_callback(
        '/(<!--\s*wp:code\s*-->.*?<pre[^>]*>\s*<code>(.*?)<\/code>\s*<\/pre>.*?<!--\s*\/wp:code\s*-->)/s',
        function($matches) {
            // Декодируем содержимое тега <code>
            $decoded = html_entity_decode($matches[2], ENT_QUOTES, 'UTF-8');
            return str_replace($matches[2], $decoded, $matches[0]);
        },
        $content
    );

    $unwanted_domains = ['example.com', 'mystore.com'];

    // Clean up unwanted and broken links
    $content = preg_replace_callback('/<a\s+href="([^"]+)"[^>]*>(.*?)<\/a>/i', function ($matches) use ($unwanted_domains) {
        $url = $matches[1];
        $link_text = $matches[2];

        // Проверяем, содержит ли URL один из нежелательных доменов
        foreach ($unwanted_domains as $domain) {
            if (stripos($url, $domain) !== false) {
                return $link_text; // Удаляем тег <a>, оставляя только текст ссылки
            }
        }

        // Проверяем, является ли ссылка битой
        if (!ai_content_wizard_check_link($url)) {
            return $link_text; // Удаляем тег <a>, оставляя только текст ссылки
        }

        // Если ссылка допустима, оставляем её как есть
        return $matches[0];
    }, $content);

    // Clean up broken images
    $content = preg_replace_callback('/<img\s+src="([^"]+)"[^>]*>/i', function ($matches) use ($unwanted_domains) {
        $image_url = $matches[1];
        $site_domain = parse_url(get_site_url(), PHP_URL_HOST);

        // Проверяем, является ли изображение локальным и доступным
        if (stripos($image_url, $site_domain) !== false && ai_content_wizard_check_link($image_url)) {
            return $matches[0];
        }

        // Удаляем изображение, если оно внешнее или битое
        return '';
    }, $content);

    return $content;
}

function ai_content_wizard_check_link($url) {
    // Получаем базовый URL сайта
    $site_url = get_site_url();
    $site_host = parse_url($site_url, PHP_URL_HOST);
    
    // Проверяем, является ли URL абсолютным
    if (!preg_match('#^https?://#i', $url)) {
        // Преобразуем относительный URL в абсолютный
        $url = rtrim($site_url, '/') . '/' . ltrim($url, '/');
    }

    // Валидация URL
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        error_log("Ошибка при проверке ссылки: Предоставлен неверный URL - '$url'");
        return false;
    }

    // Проверка, что домен ссылки не является одним из нежелательных
    $unwanted_domains = ['example.com', 'mystore.com'];
    foreach ($unwanted_domains as $domain) {
        if (stripos($url, $domain) !== false) {
            error_log("Ссылка на нежелательный домен удалена: '$url'");
            return false;
        }
    }

    // Проверка, является ли ссылка локальной
    $url_host = parse_url($url, PHP_URL_HOST);
    if ($url_host !== $site_host) {
        // Если ссылка не локальная, можно либо пропустить проверку, либо добавить дополнительные условия
        // Для текущей реализации продолжаем проверку
    }

    // Выполнение запроса для проверки доступности URL
    $response = wp_remote_head($url, array('timeout' => 5));
    if (is_wp_error($response)) {
        //error_log("Ошибка при проверке ссылки: " . $response->get_error_message() . " - URL: '$url'");
        return false;
    }

    $response_code = wp_remote_retrieve_response_code($response);
    if ($response_code >= 200 && $response_code < 400) {
        return true;
    } else {
        //error_log("Ссылка недоступна (HTTP код $response_code): '$url'");
        return false;
    }
}
