import { parseChineseCurrencyToNumber } from "../../Plugins/chart/utils";
import { extractTableData } from "../utils/astExtract";
import { normalizeChartConfigAxisFields } from "../utils/chartAxisMatch";
/**
 * 匹配形如 `<!-- [{"chartType":"line",...}] -->` 或 `<!-- {"chartType":"line",...} -->` 的注释。
 *
 * 第一组捕获 JSON 字面量（数组或对象），交由调用方 `JSON.parse` 解析。
 */ var CHART_COMMENT_PATTERN = /^<!--\s*(\[[\s\S]*\]|\{[\s\S]*\})\s*-->$/;
/**
 * remark 插件：将 "HTML 注释（图表配置）+ 表格" 组合转为 chart 代码块。
 *
 * - 在 MarkdownEditor 中，`parseTableOrChart` 负责此逻辑
 * - 在 MarkdownRenderer 中，此插件在 mdast 层面完成等价转换
 *
 * 匹配模式示例：
 * ```
 * <!-- [{"chartType":"line","x":"month","y":"value",...}] -->
 * | month | value |
 * |-------|-------|
 * | 2024  | 100   |
 * ```
 *
 * 转换后等价于：
 * ````md
 * ```chart
 * {"config":[{"chartType":"line","x":"month","y":"value"}],
 *  "columns":[...],"dataSource":[...]}
 * ```
 * ````
 *
 * 配置项中所有 `chartType` 都为 `"table"` 时跳过转换（保留原表格渲染）。
 */ export var remarkChartFromComment = function remarkChartFromComment() {
    return function(tree) {
        var _loop = function(i1) {
            var _node_value;
            var node = children[i1];
            var next = children[i1 + 1];
            if (node.type !== 'html' || next.type !== 'table') return i = i1, "continue";
            var match = (_node_value = node.value) === null || _node_value === void 0 ? void 0 : _node_value.match(CHART_COMMENT_PATTERN);
            if (!match) return i = i1, "continue";
            var chartConfig = void 0;
            try {
                chartConfig = JSON.parse(match[1]);
            } catch (unused) {
                return i = i1, "continue";
            }
            if (!Array.isArray(chartConfig)) chartConfig = [
                chartConfig
            ];
            var hasChartType = chartConfig.some(function(c) {
                return c.chartType && c.chartType !== 'table';
            });
            if (!hasChartType) return i = i1, "continue";
            var tableData = extractTableData(next, parseChineseCurrencyToNumber);
            if (!tableData) return i = i1, "continue";
            // 注释里写的 x/y 可能是表头列名的「逻辑名」（如「客单价」），
            // 实际表头常带括号单位说明（如「客单价(元)」）。
            // 在生成 chart code 块前归一化为表格真实存在的 dataIndex，
            // 让下游 ChartRenderer 能直接用 row[x]/row[y] 取到值。
            var columnKeys = tableData.columns.map(function(col) {
                var _ref;
                return String((_ref = col === null || col === void 0 ? void 0 : col.dataIndex) !== null && _ref !== void 0 ? _ref : '');
            });
            var normalizedConfig = chartConfig.map(function(cfg) {
                return normalizeChartConfigAxisFields(cfg, columnKeys);
            });
            var chartJson = JSON.stringify({
                config: normalizedConfig,
                columns: tableData.columns,
                dataSource: tableData.dataSource
            });
            children[i1] = {
                type: 'code',
                lang: 'chart',
                value: chartJson
            };
            toRemove.push(i1 + 1);
            i1++;
            i = i1, void 0;
        };
        var children = tree.children;
        if (!children || !Array.isArray(children)) return;
        var toRemove = [];
        for(var i = 0; i < children.length - 1; i++)_loop(i);
        for(var j = toRemove.length - 1; j >= 0; j--){
            children.splice(toRemove[j], 1);
        }
    };
};
