package com.malk.service.aliwork.impl;

import com.malk.server.aliwork.YDAuth;
import com.malk.server.aliwork.YDConf;
import com.malk.server.common.McException;
import com.malk.server.dingtalk.DDR_New;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 宜搭原子 Client 实现侧共用 helper（package-private）
 *
 * <p>{@link YDClient_FormImpl} 与 {@link YDClient_ProcessImpl} 共用同一套 URL 拼装 / body 构造 / 响应断言逻辑，
 * 此前两份实现里各贴一份完全相同的私有方法。本类把无依赖 Spring bean 的部分抽出为 package-private 静态方法。</p>
 *
 * <p>{@code header(YDAuth)} 不在此处——它依赖 {@code DDClient} bean，留在各 impl 自行拼装。</p>
 */
abstract class YDHelpers {

    /**
     * v1 endpoint 完整 URL
     */
    static String url(String uri) {
        return YDConf.BASE_V1 + uri;
    }

    /**
     * v2 endpoint 完整 URL
     */
    static String urlV2(String uri) {
        return YDConf.BASE_V2 + uri;
    }

    /**
     * 构造基础 body：auth 三字段（appType / systemToken / userId）
     */
    static Map<String, Object> body(YDAuth auth) {
        Map<String, Object> body = new HashMap<>();
        body.put("appType", auth.getAppType());
        body.put("systemToken", auth.getSystemToken());
        body.put("userId", auth.resolvedUserId());
        return body;
    }

    /**
     * 合并 body_ext：显式字段优先级最高，body_ext 不覆盖已有 key。
     * <p>等价于先 putAll(body_ext) 再 putAll(body)，但避免临时 Map 分配。</p>
     */
    static Map<String, Object> mergeExt(Map<String, Object> body, Map<String, Object> body_ext) {
        if (body_ext == null || body_ext.isEmpty()) {
            return body;
        }
        Map<String, Object> merged = new HashMap<>(body_ext);
        merged.putAll(body);
        return merged;
    }

    /**
     * 断言宜搭响应成功；失败抛 {@link McException}，附宜搭原始 code + message。
     *
     * @param ddr    DDR_New 响应（宜搭走钉钉网关返回，沿用 DDR_New 包装）
     * @param action 调用点名，用于错误信息定位
     */
    static DDR_New assertResult(DDR_New ddr, String action) {
        if (ddr == null) {
            throw new McException("YIDA_NULL_RESPONSE", "宜搭接口 [" + action + "] 返回空");
        }
        if (!ddr.isSuccess()) {
            throw new McException(
                    ddr.getCode() == null ? "YIDA_ERROR" : ddr.getCode(),
                    "宜搭接口 [" + action + "] 失败: " + ddr.getMessage()
            );
        }
        return ddr;
    }

    /**
     * 分页参数规范：超过宜搭硬上限抛业务异常
     */
    static void validatePageSize(Integer pageSize) {
        if (pageSize != null && pageSize > YDConf.PAGE_SIZE_LIMIT) {
            throw new McException("YIDA_PAGESIZE_EXCEEDED",
                    "pageSize 不能超过 " + YDConf.PAGE_SIZE_LIMIT);
        }
    }

    /**
     * currentPage 默认值：null → 1
     */
    static int normPage(Integer currentPage) {
        return currentPage == null ? 1 : currentPage;
    }

    /**
     * pageSize 默认值：null → PAGE_SIZE_LIMIT
     */
    static int normPageSize(Integer pageSize) {
        return pageSize == null ? YDConf.PAGE_SIZE_LIMIT : pageSize;
    }

    /**
     * searchFieldJson 默认值：空白 → "{}"
     */
    static String normSearchField(String searchFieldJson) {
        return StringUtils.isBlank(searchFieldJson) ? "{}" : searchFieldJson;
    }
}
