package com.nbport.zgwl.contractpush.utils;

import cn.hutool.core.util.StrUtil;
import com.nbport.zgwl.exception.ServiceException;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringJoiner;

/**
 * URL 拼装工具
 */
public final class ContractPushUrlUtils {

    private ContractPushUrlUtils() {
    }

    /** 在 URL 后追加查询参数（自动处理 ? 和 & 拼接，值为空不追加） */
    public static String appendQuery(String url, Map<String, String> queryParams) {
        if (queryParams == null || queryParams.isEmpty()) {
            return url;
        }
        StringJoiner joiner = new StringJoiner("&");
        queryParams.forEach((key, value) -> {
            if (StrUtil.isNotBlank(value)) {
                joiner.add(encode(key) + "=" + encode(value));
            }
        });
        return url + (url.contains("?") ? "&" : "?") + joiner;
    }

    /** 拼装审批查看地址（拼接 id 和 ssoToken 参数） */
    public static String buildApproveViewUrl(String baseUrl, String contractId, String ivUser) {
        if (StrUtil.isBlank(baseUrl)) {
            throw new ServiceException("审批查看地址未配置");
        }
        Map<String, String> params = new LinkedHashMap<>();
        params.put("id", contractId);
        params.put("ssoToken", ivUser);
        return appendQuery(baseUrl, params);
    }

    private static String encode(String value) {
        try {
            return URLEncoder.encode(value, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new ServiceException("URL 编码失败: " + e.getMessage());
        }
    }
}
