"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.evalExpr = exports.watchForDebugExpr = exports.resetDebugExprMap = exports.debugExprMap = void 0;
const cals_1 = require("@cloudbase/cals");
const mobx_1 = require("mobx");
const eventProxy_1 = require("./eventProxy");
const generate_1 = require("./adapter/generate");
/**
 * 以 widget id 为 key，只记录同个 widget 的最后一次表达式的结果
 * 这里因为同时只会执行（调试）一个表达式，所以只需保存最后一次执行的结果即可
 */
const eventProxy = new eventProxy_1.EventProxy();
exports.debugExprMap = (0, mobx_1.observable)({ node: {} });
function resetDebugExprMap() {
    // FIXME: widgets 中 for 之下 widget 的 dispose 没有被触发，所以这边通过 remove 来删除使原来的 autorun 不再触发
    (0, mobx_1.remove)(exports.debugExprMap, 'node');
    exports.debugExprMap.node = {};
    // window['__debugExprMap'] = debugExprMap
}
exports.resetDebugExprMap = resetDebugExprMap;
function watchForDebugExpr({ widgetId, subForItems, globalCtx, getDataContextFn, get$wFn, get$scopeFn }) {
    // FIXME: 暂时没考虑低码组件开发模式
    const dataContext = (0, mobx_1.untracked)(getDataContextFn);
    const $w = (0, mobx_1.untracked)(get$wFn);
    const $scope = (0, mobx_1.untracked)(get$scopeFn);
    if (!exports.debugExprMap.node[widgetId]) {
        exports.debugExprMap.node[widgetId] = {
            expr: '',
            result: '',
            refreshSigh: +new Date(),
        };
    }
    const forDebugExprDispose = (0, mobx_1.reaction)(
    // 监听 refreshSigh 的变化
    () => { var _a, _b; return [(_a = exports.debugExprMap.node[widgetId]) === null || _a === void 0 ? void 0 : _a.refreshSigh, (_b = exports.debugExprMap.node[widgetId]) === null || _b === void 0 ? void 0 : _b.expr]; }, ([_, expr]) => {
        var _a, _b;
        if (expr === null || expr === void 0 ? void 0 : expr.trim()) {
            const fn = (_a = (0, generate_1.generateDataBinds)(globalCtx, [
                {
                    type: cals_1.PropBindType.expression,
                    bindDataPath: expr,
                    propertyPath: 'expr',
                },
            ])) === null || _a === void 0 ? void 0 : _a.expr;
            if (fn) {
                try {
                    const result = fn(subForItems, undefined, dataContext, $w, $scope);
                    exports.debugExprMap.node[widgetId].result = result;
                }
                catch (e) {
                    exports.debugExprMap.node[widgetId].result = e;
                }
            }
            else {
                exports.debugExprMap.node[widgetId].result = '';
            }
        }
        else {
            if ((_b = exports.debugExprMap.node) === null || _b === void 0 ? void 0 : _b[widgetId])
                exports.debugExprMap.node[widgetId].result = '';
        }
        eventProxy.emit(`done_${widgetId}_${expr}`);
    });
    return forDebugExprDispose;
}
exports.watchForDebugExpr = watchForDebugExpr;
function evalExpr(widgetId, expr, useCache = false) {
    return new Promise((resolve) => {
        if (!exports.debugExprMap.node[widgetId]) {
            resolve(undefined);
            return;
        }
        if (useCache && exports.debugExprMap.node[widgetId].expr === expr) {
            // 表达式没变，直接返回结果
            resolve(exports.debugExprMap.node[widgetId].result);
        }
        else {
            eventProxy.once(`done_${widgetId}_${expr}`, () => {
                resolve(exports.debugExprMap.node[widgetId].result);
            });
            // 触发 autorun
            if (!useCache && exports.debugExprMap.node[widgetId].expr === expr) {
                exports.debugExprMap.node[widgetId].refreshSigh = +new Date();
            }
            else {
                exports.debugExprMap.node[widgetId].expr = expr || '';
            }
        }
    });
}
exports.evalExpr = evalExpr;
// window['__testExpr'] = evalExpr
//# sourceMappingURL=debugExpr.js.map