import { request } from '@cainiaofe/cn-request';
import { isUsingDynamicDomain } from '../../../service/domain-service.js';
function safeCall(fn) {
    try {
        fn === null || fn === void 0 ? void 0 : fn();
    }
    catch {
        /* 业务钩子异常不影响主链路 */
    }
}
/**
 * 合并业务 `requestConfig`与组件运行时 body：先铺运行时默认值，再用 `requestConfig.data` 覆盖同名键。
 * 业务在 `data` 里显式传的 `userId`、`pageId` 等优先生效；未传的键沿用运行时组装值。
 * 若配置了 `service`，则**不再**调用默认 `request(merged)`，改为 `await service({ data: 合并后的 body })`（内部为 `...hookParams`，与 `onSuccess` 第二参同形），由业务自行发请求并返回与开放平台一致的响应结构。
 * 用于魔方开放平台 getList / createOrUpdate。
 */
export function requestCubeOpenPlatform(defaultUrl, runtimeData, requestConfig, defaultMethod = 'POST') {
    var _a, _b;
    const cfg = (requestConfig !== null && requestConfig !== void 0 ? requestConfig : {});
    const rawData = cfg.data;
    const cfgData = rawData != null && typeof rawData === 'object' && !Array.isArray(rawData)
        ? { ...rawData }
        : {};
    const mergedData = { ...runtimeData, ...cfgData };
    const merged = {
        ...cfg,
        url: (_a = cfg.url) !== null && _a !== void 0 ? _a : defaultUrl,
        method: ((_b = cfg.method) !== null && _b !== void 0 ? _b : defaultMethod),
        data: mergedData,
        withCredentials: cfg.withCredentials !== undefined ? cfg.withCredentials : isUsingDynamicDomain(),
    };
    /** 与 CnAsyncSelect 内 useRequest 入参风格对齐的占位 params，便于复用同一份 requestConfig（含 service / 钩子） */
    const hookParams = [{ data: mergedData }];
    const run = async () => {
        safeCall(() => { var _a; return (_a = cfg.onBefore) === null || _a === void 0 ? void 0 : _a.call(cfg, hookParams); });
        try {
            let data = typeof cfg.service === 'function'
                ? await cfg.service(...hookParams)
                : await request(merged);
            if (typeof cfg.formatResult === 'function') {
                data = cfg.formatResult(data);
            }
            safeCall(() => { var _a; return (_a = cfg.onSuccess) === null || _a === void 0 ? void 0 : _a.call(cfg, data, hookParams); });
            safeCall(() => { var _a; return (_a = cfg.onFinally) === null || _a === void 0 ? void 0 : _a.call(cfg, hookParams, data, undefined); });
            return data;
        }
        catch (e) {
            safeCall(() => { var _a; return (_a = cfg.onError) === null || _a === void 0 ? void 0 : _a.call(cfg, e, hookParams); });
            safeCall(() => { var _a; return (_a = cfg.onFinally) === null || _a === void 0 ? void 0 : _a.call(cfg, hookParams, undefined, e); });
            throw e;
        }
    };
    return run();
}
