"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initHostDomainOnce = initHostDomainOnce;
exports.getCachedHostDomain = getCachedHostDomain;
exports.isUsingDynamicDomain = isUsingDynamicDomain;
exports.buildAiTableUrl = buildAiTableUrl;
const cn_request_1 = require("@cainiaofe/cn-request");
const domain_1 = require("./types/domain.js");
const types_1 = require("./types/index.js");
/**
 * 获取服务域名
 * @param params 请求参数，domain 为当前页面域名
 * @returns 响应结果，data 为应请求的服务域名
 */
async function getHostDomain(params) {
    try {
        const result = await (0, cn_request_1.request)({
            url: `${domain_1.AI_TABLE_EXTERNAL_BASE_URL}/aiTable/getHostDomain.do`,
            method: 'GET',
            params: {
                domain: params.domain,
            },
            withCredentials: true,
        });
        const responseData = result === null || result === void 0 ? void 0 : result.data;
        const normalized = typeof responseData === 'object' && responseData !== null && 'success' in responseData
            ? responseData
            : result;
        return normalized;
    }
    catch (error) {
        console.warn('获取服务域名失败:', error);
        return null;
    }
}
// ==================== 域名归一化与 URL 构建 ====================
/**
 * 从域名值中提取 origin（protocol + host）。
 * 兼容纯域名、origin、带路径 URL 等格式，避免拼接时出现双重路径。
 */
function extractOrigin(domain) {
    try {
        const urlStr = domain.startsWith('http') ? domain : `https://${domain}`;
        const url = new URL(urlStr);
        return url.origin;
    }
    catch {
        return null;
    }
}
// ==================== 单例缓存（唯一真值） ====================
let _cachedDomain = null;
let _inflight = null;
/**
 * 初始化动态域名（并发安全，幂等）。
 * 多处并发调用时共享同一个 in-flight 请求，不会重复发起。
 * 失败时不永久缓存 null，下次调用会重试。
 */
async function initHostDomainOnce() {
    if (_cachedDomain)
        return _cachedDomain;
    if (_inflight)
        return _inflight;
    _inflight = (async () => {
        try {
            const hostname = typeof window !== 'undefined' ? window.location.hostname : '';
            if (!hostname)
                return null;
            const result = await getHostDomain({ domain: hostname });
            if ((result === null || result === void 0 ? void 0 : result.success) && result.data) {
                const origin = extractOrigin(result.data);
                _cachedDomain = origin;
                if (typeof window !== 'undefined' && origin) {
                    window.__CN_AI_TABLE_HOST_DOMAIN__ = result.data;
                }
                return origin;
            }
            return null;
        }
        catch {
            return null;
        }
        finally {
            _inflight = null;
        }
    })();
    return _inflight;
}
/**
 * 读取已缓存的动态域名（同步），供 service 层构建 URL 时使用。
 */
function getCachedHostDomain() {
    return _cachedDomain;
}
/**
 * 当前是否启用了动态域名（即域名缓存非空）。
 * 用于决定 `withCredentials` 等跨域相关配置。
 */
function isUsingDynamicDomain() {
    return !!_cachedDomain;
}
/**
 * @deprecated 请使用 `aiRequest({ path })` 代替，URL 组装已收敛到请求层。
 * @internal 仅保留供可能的外部深依赖过渡，不再从 barrel 导出。
 */
function buildAiTableUrl(path) {
    const origin = _cachedDomain;
    if (!origin) {
        return `${types_1.AI_TABLE_API_BASE_URL}${path}`;
    }
    return `${origin}${types_1.AI_TABLE_API_BASE_URL}${path}`;
}
