"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FieldNameSelectSetter = void 0;
const i18n_1 = __importDefault(require("../../../locales/i18n.js"));
const react_1 = __importDefault(require("react"));
const cn_ui_1 = require("@cainiaofe/cn-ui");
const EMPTY_MESSAGE = i18n_1.default.get({
    id: 'PleaseAddColumnsInTheTableColumn_314696416',
    dm: '请先在表格列配置中添加列',
});
/**
 * 从列配置解析出下拉选项的显示文案
 * @param handleI18nLabel - 低码 i18n 工具，若有则优先用它解析 title
 * @returns 有 handleI18nLabel 时用其解析；否则依次尝试 title.dm、title、dataIndex
 */
function getColumnLabel(column, handleI18nLabel) {
    var _a, _b, _c;
    if (typeof handleI18nLabel === 'function') {
        return handleI18nLabel(column === null || column === void 0 ? void 0 : column.title) || (column === null || column === void 0 ? void 0 : column.dataIndex) || '';
    }
    const title = column === null || column === void 0 ? void 0 : column.title;
    return (_c = (_b = (_a = title === null || title === void 0 ? void 0 : title.dm) !== null && _a !== void 0 ? _a : title) !== null && _b !== void 0 ? _b : column === null || column === void 0 ? void 0 : column.dataIndex) !== null && _c !== void 0 ? _c : '';
}
/** 拿到写入 schema 的 label 值，低码要求为 { dm, type: "cn-i18n" } */
function toI18nLabel(displayText) {
    return { dm: displayText, type: 'cn-i18n' };
}
/** 将表格列配置转为下拉选项 { label, value, disabled }，过滤掉无 dataIndex 的项 */
function columnsToDataSource(columns, usedNames) {
    var _a, _b;
    const handleI18nLabel = (_b = (_a = window === null || window === void 0 ? void 0 : window.cnLowCodeUtils) === null || _a === void 0 ? void 0 : _a.util) === null || _b === void 0 ? void 0 : _b.handleI18nLabel;
    return (Array.isArray(columns) ? columns : [])
        .map((col) => ({
        label: getColumnLabel(col, handleI18nLabel),
        value: col === null || col === void 0 ? void 0 : col.dataIndex,
        ...((usedNames === null || usedNames === void 0 ? void 0 : usedNames.has(col === null || col === void 0 ? void 0 : col.dataIndex)) ? { disabled: true } : {}),
    }))
        .filter((item) => !!item.value);
}
/**
 * 字段映射（fieldMap）中「字段名称」的自定义 Setter
 *
 * 本 Setter 提供下拉选择，选项来自当前表格的 columns 配置，避免手输字段编码错误。
 * 数据流：columns → dataSource → 用户选择 → setValue 写入父级（label + name）
 */
const FieldNameSelectSetter = (props) => {
    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
    //  拿到低码节点与当前值
    const prop = props === null || props === void 0 ? void 0 : props.prop;
    const parentValue = (_c = (_b = (_a = prop === null || prop === void 0 ? void 0 : prop.parent) === null || _a === void 0 ? void 0 : _a.getValue) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : {};
    // 已选中的字段编码，用于下拉控件的 value
    const selectedValue = parentValue.name;
    // 拿到表格列配置，转为下拉选项
    // getNode() 向上查找，在父级/祖先中 getPropValue('columns') 找到表格列定义
    const rawColumns = (_g = (_f = (_e = (_d = prop === null || prop === void 0 ? void 0 : prop.getNode) === null || _d === void 0 ? void 0 : _d.call(prop)) === null || _e === void 0 ? void 0 : _e.getPropValue) === null || _f === void 0 ? void 0 : _f.call(_e, 'columns')) !== null && _g !== void 0 ? _g : [];
    const columns = Array.isArray(rawColumns) ? rawColumns : [];
    // 读取已配置在 fieldMap 中的字段名，排除当前行自身，用于禁用已选项
    // prop 层级：label → 当前条目(parent) → fieldMap数组(parent.parent)
    // 通过 parent.parent.getValue() 拿到整个 fieldMap 数组
    const rawFieldMap = (_l = (_k = (_j = (_h = prop === null || prop === void 0 ? void 0 : prop.parent) === null || _h === void 0 ? void 0 : _h.parent) === null || _j === void 0 ? void 0 : _j.getValue) === null || _k === void 0 ? void 0 : _k.call(_j)) !== null && _l !== void 0 ? _l : [];
    const usedNames = new Set((Array.isArray(rawFieldMap) ? rawFieldMap : [])
        .map((item) => item === null || item === void 0 ? void 0 : item.name)
        .filter((name) => !!name && name !== selectedValue));
    const dataSource = columnsToDataSource(columns, usedNames);
    // 把选中的 name、label 写回父级（fieldMap 单条），label 为 { dm, type: "cn-i18n" } 格式
    const syncToParent = (name, labelValue) => {
        var _a, _b;
        const parent = prop === null || prop === void 0 ? void 0 : prop.parent;
        if (!parent)
            return;
        (_a = parent.setPropValue) === null || _a === void 0 ? void 0 : _a.call(parent, 'name', name);
        (_b = parent.setPropValue) === null || _b === void 0 ? void 0 : _b.call(parent, 'label', labelValue);
    };
    // 用户选择下拉项时
    const onChange = (value) => {
        var _a, _b;
        const handleI18nLabel = (_b = (_a = window === null || window === void 0 ? void 0 : window.cnLowCodeUtils) === null || _a === void 0 ? void 0 : _a.util) === null || _b === void 0 ? void 0 : _b.handleI18nLabel;
        const column = columns.find((c) => (c === null || c === void 0 ? void 0 : c.dataIndex) === value);
        const displayText = column ? getColumnLabel(column, handleI18nLabel) : value;
        const labelValue = toI18nLabel(displayText);
        syncToParent(value, labelValue);
    };
    return (react_1.default.createElement(cn_ui_1.CnAsyncSelect, { size: "medium", hasClear: true, showSearch: true, value: selectedValue, dataSource: dataSource, onChange: onChange, style: { width: '100%', minHeight: 32 }, notFoundContent: dataSource.length === 0 ? EMPTY_MESSAGE : undefined, popupStyle: { maxHeight: 300 } }));
};
exports.FieldNameSelectSetter = FieldNameSelectSetter;
