package com.ruoyi.web.kb.support;

import java.net.URI;
import java.net.URISyntaxException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;

/**
 * 将业务表中的 {@code content_file_url} 解析为知识库「按 URL 拉取」接口所需的完整地址。
 */
public final class KbFileUrlResolver
{
    /** 外网域名：同步知识库时若正文 URL 含此串，则改写为内网地址供知识库拉取 */
    private static final String EXTRANET_HOST = "bqxm.alafarms.com";

    /** 内网文件服务地址（含端口） */
    private static final String INTRANET_HOST = "192.168.153.16:443";

    private KbFileUrlResolver()
    {
    }

    /**
     * @param contentFileUrl 表字段 content_file_url
     * @param fileUrlBase    配置项 ruoyi.kb.file-url-base，当 url 非绝对 http(s) 时必填
     */
    public static String resolveForKbUpload(String contentFileUrl, String fileUrlBase)
    {
        if (StringUtils.isEmpty(contentFileUrl))
        {
            throw new ServiceException("正文访问地址为空，无法同步知识库");
        }
        String p = contentFileUrl.trim();
        if (StringUtils.startsWithIgnoreCase(p, "http://") || StringUtils.startsWithIgnoreCase(p, "https://"))
        {
            return rewriteExtranetToIntranetIfNeeded(contentFileUrl, p);
        }
        if (StringUtils.isEmpty(fileUrlBase))
        {
            throw new ServiceException("正文访问地址不是完整 http(s) 地址时，请在配置中设置 ruoyi.kb.file-url-base（对外可访问的文件根地址）");
        }
        String base = fileUrlBase.trim();
        while (base.endsWith("/"))
        {
            base = base.substring(0, base.length() - 1);
        }
        String path = p.startsWith("/") ? p : "/" + p;
        return rewriteExtranetToIntranetIfNeeded(contentFileUrl, base + path);
    }

    /**
     * 正文 URL 含外网域名时，将解析结果中的域名替换为内网地址，便于知识库节点拉取文件。
     */
    static String rewriteExtranetToIntranetIfNeeded(String contentFileUrl, String resolvedUrl)
    {
        if (StringUtils.isEmpty(contentFileUrl) || StringUtils.isEmpty(resolvedUrl))
        {
            return resolvedUrl;
        }
        if (!contentFileUrl.contains(EXTRANET_HOST))
        {
            return resolvedUrl;
        }
        try
        {
            URI uri = new URI(resolvedUrl);
            if (uri.getHost() == null || !EXTRANET_HOST.equalsIgnoreCase(uri.getHost()))
            {
                return resolvedUrl;
            }
            StringBuilder sb = new StringBuilder();
            sb.append(uri.getScheme()).append("://").append(INTRANET_HOST);
            if (uri.getRawPath() != null)
            {
                sb.append(uri.getRawPath());
            }
            if (uri.getRawQuery() != null)
            {
                sb.append('?').append(uri.getRawQuery());
            }
            if (uri.getRawFragment() != null)
            {
                sb.append('#').append(uri.getRawFragment());
            }
            return sb.toString();
        }
        catch (URISyntaxException e)
        {
            return resolvedUrl;
        }
    }
}
