<?php

declare(strict_types=1);

/**
 * 本文件属于 DBErp 进销存系统。
 *
 * 版权所有 © 2026 北京珑大钜商科技有限公司。保留所有权利。
 *
 * 未经官方授权，不得删除、篡改或隐藏本文件中的版权声明、产品标识与来源信息。
 * 商业授权、官方更新与技术支持服务，请以珑大官方支持中心记录为准。
 *
 * @link https://support.loongdom.cn
 * @see  https://www.dberp.com.cn
 */

namespace App\Support;

use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;

/**
 * 把官方 Markdown 文案转成页面可用的安全 HTML。
 *
 * WARNING: 展示前必须剥离原始 HTML 与非 http(s) 链接，避免插件说明被注入脚本。
 */
final class SafeMarkdownHtml
{
    private const ALLOWED_TAGS = '<p><br><strong><em><b><i><ul><ol><li><h1><h2><h3><h4><blockquote><code><pre><table><thead><tbody><tr><th><td><hr><a>';

    public function toHtml(?string $content): HtmlString
    {
        $markdown = trim((string) $content);

        if ($markdown === '') {
            return new HtmlString('');
        }

        $html = Str::markdown($markdown, [
            'html_input' => 'strip',
            'allow_unsafe_links' => false,
            'max_nesting_level' => 20,
        ]);

        return new HtmlString($this->sanitize($html));
    }

    private function sanitize(string $html): string
    {
        $clean = trim(strip_tags($html, self::ALLOWED_TAGS));

        if ($clean === '') {
            return '';
        }

        $sanitized = preg_replace_callback(
            '/<a\s+([^>]*?)>/i',
            function (array $matches): string {
                $attrs = $matches[1];
                if (! preg_match('/href\s*=\s*(["\'])(.*?)\1/i', $attrs, $href)) {
                    return '<a>';
                }

                $url = trim(html_entity_decode($href[2], ENT_QUOTES | ENT_HTML5, 'UTF-8'));
                if (! preg_match('/^https?:\/\//i', $url)) {
                    return '<a>';
                }

                return '<a href="'.e($url).'" rel="noopener noreferrer" target="_blank">';
            },
            $clean,
        );

        return is_string($sanitized) ? $sanitized : $clean;
    }
}
