// 聊天室上下文初始化模块，从 Blade 输出的 JSON 数据节点恢复 window.chatContext。

const CHAT_CONTEXT_ELEMENT_ID = "chat-context-data";

/**
 * 读取并解析 Blade 注入的聊天室上下文 JSON。
 *
 * @returns {Record<string, any>}
 */
function readChatContextPayload() {
    const element = document.getElementById(CHAT_CONTEXT_ELEMENT_ID);

    if (!element) {
        return {};
    }

    try {
        return JSON.parse(element.textContent || "{}");
    } catch (error) {
        console.error("[chatContext] 初始化数据解析失败", error);
        return {};
    }
}

/**
 * 使用模板生成带 ID 的 URL。
 *
 * @param {string} template URL 模板
 * @param {number|string} id 资源 ID
 * @returns {string}
 */
function fillIdTemplate(template, id) {
    return String(template || "").replace("__ID__", encodeURIComponent(id));
}

/**
 * 恢复婚姻系统 URL 工厂函数，兼容存量调用方式。
 *
 * @param {Record<string, any>} context 聊天室上下文
 * @returns {void}
 */
function hydrateMarriageUrlFactories(context) {
    const marriage = context.marriage || {};

    marriage.acceptUrl = (id) => fillIdTemplate(marriage.acceptUrlTemplate, id);
    marriage.rejectUrl = (id) => fillIdTemplate(marriage.rejectUrlTemplate, id);
    marriage.divorceUrl = (id) => fillIdTemplate(marriage.divorceUrlTemplate, id);
    marriage.confirmDivorceUrl = (id) => fillIdTemplate(marriage.confirmDivorceUrlTemplate, id);
    marriage.rejectDivorceUrl = (id) => fillIdTemplate(marriage.rejectDivorceUrlTemplate, id);
    marriage.weddingSetupUrl = (id) => fillIdTemplate(marriage.weddingSetupUrlTemplate, id);
    marriage.claimEnvelopeUrl = (id, ceremonyId) => fillIdTemplate(
        fillIdTemplate(marriage.claimEnvelopeUrlTemplate, id),
        ceremonyId,
    );
    marriage.envelopeStatusUrl = (id) => fillIdTemplate(marriage.envelopeStatusUrlTemplate, id);

    context.marriage = marriage;
}

/**
 * 初始化 window.chatContext，供后续聊天室模块和存量 Blade 脚本读取。
 *
 * @returns {Record<string, any>}
 */
export function initializeChatContext() {
    // Blade 底部仍有同步脚本会立即读取 chatContext；若兼容桥已初始化，这里只做函数补齐。
    const context = window.chatContext || readChatContextPayload();
    hydrateMarriageUrlFactories(context);

    window.chatContext = context;

    return context;
}

initializeChatContext();
