<?php
// Service/Features/Markdown.php
// 该文件主要负责提供 Markdown 文本到 HTML 格式的转换功能。

namespace HaoZiTeam\AIPost\Service\Features;

defined('ABSPATH') || exit;

class Markdown
{
    /**
     * 将 Markdown 文本转换为 HTML。
     *
     * @param string $markdown Markdown 文本。
     * @return string HTML 格式的文本。
     */
    public static function markdownToHtml($markdown)
    {
        // 兼容性增强：非字符串直接返回空
        if (!is_string($markdown)) {
            return '';
        }

        // 统一换行符，避免 Windows (\r\n) 或旧 Mac (\r) 导致的表格/段落正则失配
        $markdown = str_replace(["\r\n", "\r"], "\n", $markdown);

        // 处理多行代码块（优先处理，完全移除反引号）
        $markdown = preg_replace('/```\s*\w*\s*\n([\s\S]*?)\n```/', '<pre><code>$1</code></pre>', $markdown);
        
        // 处理行内代码块（保留内容但移除反引号）
        $markdown = preg_replace('/`([^`]+)`/', '<code>$1</code>', $markdown);

        // 处理标题标签，例如 # Heading => <h1>Heading</h1>
        $markdown = preg_replace('/^(#{6}) (.*)$/m', '<h6>$2</h6>', $markdown);
        $markdown = preg_replace('/^(#{5}) (.*)$/m', '<h5>$2</h5>', $markdown);
        $markdown = preg_replace('/^(#{4}) (.*)$/m', '<h4>$2</h4>', $markdown);
        $markdown = preg_replace('/^(#{3}) (.*)$/m', '<h3>$2</h3>', $markdown);
        $markdown = preg_replace('/^(#{2}) (.*)$/m', '<h2>$2</h2>', $markdown);
        $markdown = preg_replace('/^(#{1}) (.*)$/m', '<h1>$2</h1>', $markdown);

        // 替换粗体，例如 **text** => <strong>text</strong>
        $markdown = preg_replace('/\*\*(.+?)\*\*/s', '<strong>$1</strong>', $markdown);

        // 替换斜体，例如 *text* => <em>text</em>
        $markdown = preg_replace('/\*(.+?)\*/s', '<em>$1</em>', $markdown);

        // 替换有序列表，例如 1. item => <li>item</li>
        $markdown = preg_replace_callback('/(\d+\.\s.*?)(?:\n(?!\d+\.\s)|$)/s', function ($matches) {
            return preg_replace('/\d+\.\s(.*)/', '<li>$1</li>', $matches[0]);
        }, $markdown);

        // 替换无序列表，例如 - item => <li>item</li>
        $markdown = preg_replace_callback('/(-\s.*?)(?:\n(?!-\s)|$)/s', function ($matches) {
            return preg_replace('/-\s(.*)/', '<li>$1</li>', $matches[0]);
        }, $markdown);

        // 替换链接，例如 [link text](url) => <a href="url">link text</a>
        $markdown = preg_replace('/\[(.+?)\]\((.+?)\)/', '<a href="$2">$1</a>', $markdown);

        // 替换图片，例如 ![alt text](url) => <img src="url" alt="alt text">
        $markdown = preg_replace('/!\[(.*?)\]\((.+?)\)/', '<img src="$2" alt="$1">', $markdown);

        // 清理只包含管道符的空行，避免被段落包裹成 <p>|</p>
        $markdown = preg_replace('/^\s*\|+\s*$/m', '', $markdown);

        // 处理 Markdown/管道表格：稳定识别“表头行 + 对齐行 + 数据行”块，统一输出标准 <table><thead><tbody>
        $convert_table_row = function (string $line): array {
            $line = trim($line);
            $line = trim($line, '|');
            $cells = array_map('trim', explode('|', $line));
            $cells = array_values(array_filter($cells, function ($c) { return $c !== ''; }));
            return $cells;
        };
        $is_align_row = function (string $line): bool {
            $line = trim($line);
            $line = trim($line, '|');
            if ($line === '') {
                return false;
            }
            $parts = array_map('trim', explode('|', $line));
            if (count($parts) < 2) {
                return false;
            }
            foreach ($parts as $p) {
                if ($p === '') {
                    continue;
                }
                if (!preg_match('/^:?-{3,}:?$/', $p)) {
                    return false;
                }
            }
            return true;
        };

        $lines = explode("\n", $markdown);
        $out = [];
        $i = 0;
        $total = count($lines);
        while ($i < $total) {
            $line = $lines[$i];
            $trim = trim($line);
            if ($trim !== '' && strpos($line, '|') !== false) {
                $next = ($i + 1 < $total) ? $lines[$i + 1] : '';
                if ($is_align_row($next)) {
                    $headers = $convert_table_row($line);
                    if (count($headers) >= 2) {
                        $rows = [];
                        $i += 2;
                        while ($i < $total) {
                            $row_line = $lines[$i];
                            if (trim($row_line) === '' || strpos($row_line, '|') === false) {
                                break;
                            }
                            $cells = $convert_table_row($row_line);
                            if (!empty($cells)) {
                                $rows[] = $cells;
                            }
                            $i++;
                        }

                        $table = '<table style="width:100%; border-collapse:collapse; margin:15px 0;">';
                        $table .= '<thead><tr>';
                        foreach ($headers as $cell) {
                            $table .= '<th style="border:1px solid #ddd; padding:8px; text-align:center; background-color:#f2f2f2;">' . $cell . '</th>';
                        }
                        $table .= '</tr></thead>';
                        $table .= '<tbody>';
                        $r = 0;
                        foreach ($rows as $rowCells) {
                            $bgColor = ($r % 2 === 0) ? '#f9f9f9' : '#ffffff';
                            $table .= '<tr>';
                            for ($c = 0; $c < count($headers); $c++) {
                                $val = $rowCells[$c] ?? '';
                                $table .= '<td style="border:1px solid #ddd; padding:8px; text-align:center; background-color:' . $bgColor . ';">' . $val . '</td>';
                            }
                            $table .= '</tr>';
                            $r++;
                        }
                        $table .= '</tbody></table>';
                        $out[] = $table;
                        continue;
                    }
                }
            }

            $out[] = $line;
            $i++;
        }
        $markdown = implode("\n", $out);

        // 修改：确保段落包裹逻辑跳过常见的HTML块级和表格标签
		$markdown = preg_replace('/^(?!(?:#{1,6}|\d+\.\s-|\-\s|<h[1-6]|<p|<div|<ul|<ol|<li|<blockquote|<pre|<hr|<table|<thead|<tbody|<tr|<th|<td|<\/?\w+[^>]*>))(.+)$/im', '<p>$1</p>', $markdown);

        // 移除空的 <h1> 到 <h6> 标签
        $markdown = preg_replace('/ < h[1 - 6] > \s * <\/h[1-6]>/s', '', $markdown);

        // 移除空的 <li></li> 标签
        $markdown = preg_replace('/<li>\s*<\/li>/s', '', $markdown);

        // 移除只包含非内容字符的 <p> 和 <li> 标签
        $markdown = preg_replace('/<p>\s*[-—]\s*<\/p>/s', '', $markdown);
        $markdown = preg_replace('/<li>\s*[-—]\s*<\/li>/s', '', $markdown);

        // 移除多余的 -- 符号
        $markdown = preg_replace('/--+/s', '', $markdown);

        // 移除没有内容的 :
        $markdown = preg_replace('/(?<=^|\s):/', '', $markdown);

        // 标签过滤（移除下面这行以保留 code 和 pre）
        // $markdown = preg_replace('/<\/?(code|pre)>/', '', $markdown);

        // 清理空的 <p> 标签
        $markdown = preg_replace('/<p>\s*<\/p>/s', '', $markdown);

        return $markdown;
    }
} 