"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FORMULA_ERROR = exports.FORMULA_FUNCTION_CATEGORIES = exports.ALLOWED_FORMULAJS_FUNCTIONS = exports.FORMULA_FUNCTIONS = exports.FIELD_ICON_MAP = exports.FUNCTION_GROUP_LABELS = void 0;
exports.getFieldTypeLabel = getFieldTypeLabel;
const i18n_1 = __importDefault(require("../../../../../../../locales/i18n.js"));
/** 编辑器弹窗左侧面板函数分组显示标签（与 cn-next-smart 分类对齐） */
exports.FUNCTION_GROUP_LABELS = {
    math: {
        label: i18n_1.default.get({ id: 'MathematicalFunctions', dm: '数学函数' }),
        i18nId: 'MathFunctions',
    },
    logical: {
        label: i18n_1.default.get({ id: 'LogicalFunctions', dm: '逻辑函数' }),
        i18nId: 'LogicFunctions',
    },
    time: { label: i18n_1.default.get({ id: 'TimeFunctions', dm: '时间函数' }), i18nId: 'TimeFunctions' },
    text: { label: i18n_1.default.get({ id: 'TextFunctions', dm: '文本函数' }), i18nId: 'TextFunctions' },
    // cn-next-smart 有数组分类，但 ITERATOR / FILTER 在 formulajs 中不存在，暂不启用
    // array: { label: '数组函数', i18nId: 'ArrayFunctions' },
};
/** 字段组件类型 → 图标映射 */
exports.FIELD_ICON_MAP = {
    CnInput: 'list',
    CnNumberPicker: 'set',
    CnDatePicker: 'calendar',
    CnSelect: 'arrow-down',
};
/** 字段组件类型 → 可读类型标签 */
const FIELD_TYPE_LABEL_MAP = {
    CnInput: i18n_1.default.get({ id: 'Text', dm: '文本' }),
    CnNumberPicker: i18n_1.default.get({ id: 'Numbers', dm: '数字' }),
    CnDatePicker: i18n_1.default.get({ id: 'Date', dm: '日期' }),
    CnSelect: i18n_1.default.get({ id: 'Select', dm: '选择' }),
};
function getFieldTypeLabel(component) {
    return FIELD_TYPE_LABEL_MAP[component || ''] || i18n_1.default.get({ id: 'Text', dm: '文本' });
}
/**
 * 公式函数列表
 * 与 cn-next-smart FORMULA_FUNC_LIST 对齐，仅包含 @formulajs/formulajs 也支持的函数。
 * formulajs 不支持的 cn-next-smart 函数已注释并标注原因。
 */
exports.FORMULA_FUNCTIONS = [
    // ==================== 数学函数 (math) ====================
    {
        name: 'COUNT',
        description: i18n_1.default.get({
            id: 'CountTheTotalNumberOfDataInThe',
            dm: '统计指定数据数组的数据总个数',
        }),
        syntax: i18n_1.default.get({ id: 'COUNTvalue1Value2', dm: 'COUNT(值1, 值2, ...)' }),
        example: i18n_1.default.get({ id: 'COUNTfield1Field2', dm: 'COUNT({字段1}, {字段2})' }),
        category: 'math',
    },
    // ADD: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'ADD', description: '计算多个字段值总和', syntax: 'ADD(数值1, 数值2, ...)', example: 'ADD({字段1}, {字段2})', category: 'math' },
    {
        name: 'AVERAGE',
        description: i18n_1.default.get({ id: 'GetTheArithmeticMeanOfASetOf', dm: '获取一组数值的算术平均值' }),
        syntax: i18n_1.default.get({ id: 'AVERAGEnumber1Number2', dm: 'AVERAGE(数值1, 数值2, ...)' }),
        example: i18n_1.default.get({ id: 'AVERAGEscore1Score2', dm: 'AVERAGE({分数1}, {分数2})' }),
        category: 'math',
    },
    {
        name: 'MAX',
        description: i18n_1.default.get({ id: 'ReturnsTheMaximumValueInASetOf', dm: '返回一组数字中的最大值' }),
        syntax: i18n_1.default.get({ id: 'MAXnumber1Number2', dm: 'MAX(数值1, 数值2, ...)' }),
        example: i18n_1.default.get({ id: 'MAXprice1Price2', dm: 'MAX({价格1}, {价格2})' }),
        category: 'math',
    },
    {
        name: 'MIN',
        description: i18n_1.default.get({ id: 'ReturnsTheMinimumValueInASetOf', dm: '返回一组数字中的最小值' }),
        syntax: i18n_1.default.get({ id: 'MINnumber1Number2', dm: 'MIN(数值1, 数值2, ...)' }),
        example: i18n_1.default.get({ id: 'MINprice1Price2', dm: 'MIN({价格1}, {价格2})' }),
        category: 'math',
    },
    {
        name: 'ABS',
        description: i18n_1.default.get({
            id: 'ReturnsItsAbsoluteValueWhenTheVa_1103219658',
            dm: '当数值为负数的时候返回他的绝对值数值',
        }),
        syntax: i18n_1.default.get({ id: 'ABSnumber', dm: 'ABS(数值)' }),
        example: i18n_1.default.get({ id: 'ABS', dm: 'ABS({差值})' }),
        category: 'math',
    },
    {
        name: 'ROUND',
        description: i18n_1.default.get({
            id: 'WhenAValueHasADecimalPointThis',
            dm: '数值出现小数点的时候，此方法可把一个数字四舍五入为最接近的整数',
        }),
        syntax: i18n_1.default.get({ id: 'ROUNDnumberDecimalPlaces', dm: 'ROUND(数值, 小数位数)' }),
        example: i18n_1.default.get({ id: 'ROUND2', dm: 'ROUND({金额}, 2)' }),
        category: 'math',
    },
    {
        name: 'CEILING',
        description: i18n_1.default.get({
            id: 'RoundUpToTheNearestMultipleOfThe',
            dm: '向上舍入为最接近的指定基数的倍数',
        }),
        syntax: i18n_1.default.get({ id: 'CEILINGnumberStep', dm: 'CEILING(数值, 步长)' }),
        example: i18n_1.default.get({ id: 'CEILING1', dm: 'CEILING({价格}, 1)' }),
        category: 'math',
    },
    {
        name: 'FLOOR',
        description: i18n_1.default.get({
            id: 'RoundDownToTheNearestMultipleOfT_1236694029',
            dm: '向下舍入为最接近的指定基数的倍数',
        }),
        syntax: i18n_1.default.get({ id: 'FLOORnumberStep', dm: 'FLOOR(数值, 步长)' }),
        example: i18n_1.default.get({ id: 'FLOOR1', dm: 'FLOOR({价格}, 1)' }),
        category: 'math',
    },
    {
        name: 'MOD',
        description: i18n_1.default.get({
            id: 'ReturnsTheRemainderOfTheDivision_876388158',
            dm: '返回2个数值组件相除的余数',
        }),
        syntax: i18n_1.default.get({ id: 'MODdividendDivisor', dm: 'MOD(被除数, 除数)' }),
        example: i18n_1.default.get({ id: 'MOD3', dm: 'MOD({数量}, 3)' }),
        category: 'math',
    },
    // POW: cn-next-smart 的 POW 对应 formulajs 的 POWER，使用 POWER 名称
    {
        name: 'POWER',
        description: i18n_1.default.get({
            id: 'CalculatesTheValueOfTheNumerical_482826883',
            dm: '计算出数值组件乘幂的值',
        }),
        syntax: i18n_1.default.get({ id: 'POWERbaseExponent', dm: 'POWER(底数, 指数)' }),
        example: i18n_1.default.get({ id: 'POWER2', dm: 'POWER({边长}, 2)' }),
        category: 'math',
    },
    {
        name: 'FIXED',
        description: i18n_1.default.get({
            id: 'RoundingANumberToASpecifiedNumbe_1934867868',
            dm: '将数字舍入到指定的小数位数，以十进制数格式对该数进行格式设置，并以数字形式返回结果',
        }),
        syntax: i18n_1.default.get({ id: 'FIXEDnumberDecimalPlaces', dm: 'FIXED(数值, 小数位数)' }),
        example: i18n_1.default.get({ id: 'FIXED2', dm: 'FIXED({金额}, 2)' }),
        category: 'math',
    },
    {
        name: 'SUM',
        description: i18n_1.default.get({
            id: 'AddTheNumbersOfTheSpecifiedDataA_797424210',
            dm: '指定数据数组的数字相加并返回和',
        }),
        syntax: i18n_1.default.get({ id: 'SUMnumber1Number2', dm: 'SUM(数值1, 数值2, ...)' }),
        example: i18n_1.default.get({ id: 'SUMsalesRefunds', dm: 'SUM({销售额}, {退款额})' }),
        category: 'math',
    },
    // ==================== 逻辑函数 (logical) ====================
    {
        name: 'IF',
        description: i18n_1.default.get({
            id: 'ConditionJudgmentIfTheConditionI_128197834',
            dm: '条件判断，如果满足条件则返回一个值，如果不满足，则返回另外一个值',
        }),
        syntax: i18n_1.default.get({ id: 'IFconditionTrueValueFalseValue', dm: 'IF(条件, 真值, 假值)' }),
        example: i18n_1.default.get({ id: 'IF60PassFail', dm: 'IF({分数} >= 60, "及格", "不及格")' }),
        category: 'logical',
    },
    // EQ: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'EQ', description: '比较两个值是否相等', syntax: 'EQ(值1, 值2)', example: 'EQ({状态}, "已完成")', category: 'logical' },
    // NE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'NE', description: '比较两个值是否不相等', syntax: 'NE(值1, 值2)', example: 'NE({状态}, "已关闭")', category: 'logical' },
    {
        name: 'TRUE',
        description: i18n_1.default.get({ id: 'ReturnLogicalTrue', dm: '返回逻辑真' }),
        syntax: 'TRUE()',
        example: 'TRUE()',
        category: 'logical',
    },
    {
        name: 'FALSE',
        description: i18n_1.default.get({ id: 'ReturnLogicalFalse', dm: '返回逻辑假' }),
        syntax: 'FALSE()',
        example: 'FALSE()',
        category: 'logical',
    },
    // GE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'GE', description: '是否大于等于', syntax: 'GE(值1, 值2)', example: 'GE({分数}, 60)', category: 'logical' },
    // LE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'LE', description: '是否小于等于', syntax: 'LE(值1, 值2)', example: 'LE({分数}, 100)', category: 'logical' },
    // GT: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'GT', description: '是否大于', syntax: 'GT(值1, 值2)', example: 'GT({分数}, 90)', category: 'logical' },
    // LT: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'LT', description: '是否小于', syntax: 'LT(值1, 值2)', example: 'LT({分数}, 60)', category: 'logical' },
    // ISEMPTY: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'ISEMPTY', description: '判断是否为空', syntax: 'ISEMPTY(值)', example: 'ISEMPTY({备注})', category: 'logical' },
    // ISNULL: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'ISNULL', description: '判断是否为NULL', syntax: 'ISNULL(值)', example: 'ISNULL({字段1})', category: 'logical' },
    // TIMECOMPARE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'TIMECOMPARE', description: '比较两个日期的大小', syntax: 'TIMECOMPARE(结束时间, 开始时间)', example: 'TIMECOMPARE({结束时间}, {开始时间})', category: 'logical' },
    // NUMBERCOMPARE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'NUMBERCOMPARE', description: '比较两个数字的大小', syntax: 'NUMBERCOMPARE(数值1, 数值2)', example: 'NUMBERCOMPARE({价格1}, {价格2})', category: 'logical' },
    // ==================== 时间函数 (time) ====================
    // DATEDELTA: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'DATEDELTA', description: '计算增加或减少指定天数后的日期', syntax: 'DATEDELTA(日期, 天数)', example: 'DATEDELTA({创建时间}, 7)', category: 'time' },
    {
        name: 'DAYS',
        description: i18n_1.default.get({
            id: 'CalculateTheNumberOfDaysBetweenT_1915578484',
            dm: '计算两个时间之间相隔的天数',
        }),
        syntax: i18n_1.default.get({ id: 'DAYSendDateStartDate', dm: 'DAYS(结束日期, 开始日期)' }),
        example: i18n_1.default.get({ id: 'DAYSendTimeStartTime', dm: 'DAYS({结束时间}, {开始时间})' }),
        category: 'time',
    },
    {
        name: 'HOUR',
        description: i18n_1.default.get({ id: 'GetTheSelectedTime', dm: '获取选定时间是几时' }),
        syntax: i18n_1.default.get({ id: 'HOURdate', dm: 'HOUR(日期)' }),
        example: i18n_1.default.get({ id: 'HOUR', dm: 'HOUR({创建时间})' }),
        category: 'time',
    },
    {
        name: 'MINUTE',
        description: i18n_1.default.get({ id: 'GetTheMinutesOfTheSelectedTime', dm: '获取选定时间的分钟数' }),
        syntax: i18n_1.default.get({ id: 'MINUTEdate', dm: 'MINUTE(日期)' }),
        example: i18n_1.default.get({ id: 'MINUTE', dm: 'MINUTE({创建时间})' }),
        category: 'time',
    },
    {
        name: 'YEAR',
        description: i18n_1.default.get({ id: 'GetTheYearOfTheSelectedTime', dm: '获取选定时间的年份' }),
        syntax: i18n_1.default.get({ id: 'YEARdate', dm: 'YEAR(日期)' }),
        example: i18n_1.default.get({ id: 'YEAR', dm: 'YEAR({创建时间})' }),
        category: 'time',
    },
    {
        name: 'MONTH',
        description: i18n_1.default.get({ id: 'GetTheMonthOfTheSelectedTime', dm: '获取选定时间的月份' }),
        syntax: i18n_1.default.get({ id: 'MONTHdate', dm: 'MONTH(日期)' }),
        example: i18n_1.default.get({ id: 'MONTH', dm: 'MONTH({创建时间})' }),
        category: 'time',
    },
    // TIMESTAMP: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'TIMESTAMP', description: '将日期对象转换为时间戳', syntax: 'TIMESTAMP(日期)', example: 'TIMESTAMP({创建时间})', category: 'time' },
    {
        name: 'TODAY',
        description: i18n_1.default.get({ id: 'GetTodaysDate', dm: '获取今天的日期' }),
        syntax: 'TODAY()',
        example: 'TODAY()',
        category: 'time',
    },
    // FORMAT_DATE: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'FORMAT_DATE', description: '将日期对象转换为指定的格式', syntax: "FORMAT_DATE(日期, 格式)", example: "FORMAT_DATE({日期_1}, 'YYYY-MM-DD')", category: 'time' },
    // ==================== 文本函数 (text) ====================
    {
        name: 'CONCATENATE',
        description: i18n_1.default.get({
            id: 'CombineMultipleStringsIntoOneStr_874915838',
            dm: '将多个字符串拼接合并成为一个字符串',
        }),
        syntax: i18n_1.default.get({ id: 'CONCATENATEtext1Text2', dm: 'CONCATENATE(文本1, 文本2, ...)' }),
        example: i18n_1.default.get({ id: 'CONCATENATElastNameFirstName', dm: 'CONCATENATE({姓}, {名})' }),
        category: 'text',
    },
    {
        name: 'LEFT',
        description: i18n_1.default.get({
            id: 'ReturnsASpecifiedNumberOfCharact_1530966369',
            dm: '从一个文本的第一个字符开始返回指定个数的字符',
        }),
        syntax: i18n_1.default.get({ id: 'LEFTtextCharacterCount', dm: 'LEFT(文本, 字符数)' }),
        example: i18n_1.default.get({ id: 'LEFT3', dm: 'LEFT({编号}, 3)' }),
        category: 'text',
    },
    {
        name: 'RIGHT',
        description: i18n_1.default.get({
            id: 'ReturnsTheSpecifiedNumberOfChara_1894316321',
            dm: '从文本的最后一个字符开始返回指定个数的字符',
        }),
        syntax: i18n_1.default.get({ id: 'RIGHTtextCharacterCount', dm: 'RIGHT(文本, 字符数)' }),
        example: i18n_1.default.get({ id: 'RIGHT4', dm: 'RIGHT({编号}, 4)' }),
        category: 'text',
    },
    {
        name: 'MID',
        description: i18n_1.default.get({
            id: 'TruncatesTheTargetTextFromTheSpe_2101539147',
            dm: '从指定位置开始截取目标文本指定长度的字符',
        }),
        syntax: i18n_1.default.get({
            id: 'MIDtextStartingPositionCharacter_1808528883',
            dm: 'MID(文本, 起始位置, 字符数)',
        }),
        example: i18n_1.default.get({ id: 'MID23', dm: 'MID({编号}, 2, 3)' }),
        category: 'text',
    },
    {
        name: 'REPLACE',
        description: i18n_1.default.get({
            id: 'ReplacePartOfTextWithNewText',
            dm: '将文本中的部分文本替换为新的文本',
        }),
        syntax: i18n_1.default.get({
            id: 'REPLACEtextStartingPositionRepla_2111681868',
            dm: 'REPLACE(文本, 起始位置, 替换长度, 新文本)',
        }),
        example: i18n_1.default.get({ id: 'REPLACE13NEW', dm: 'REPLACE({编号}, 1, 3, "NEW")' }),
        category: 'text',
    },
    {
        name: 'REPT',
        description: i18n_1.default.get({
            id: 'RepeatTheSpecifiedTextContentASp_904747729',
            dm: '将指定文本内容按指定次数重复显示',
        }),
        syntax: i18n_1.default.get({ id: 'REPTtextTimes', dm: 'REPT(文本, 次数)' }),
        example: i18n_1.default.get({ id: 'REPT', dm: 'REPT("★", {评分})' }),
        category: 'text',
    },
    // NUMBER: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'NUMBER', description: '将String格式的数值转换为Number格式', syntax: 'NUMBER(文本)', example: 'NUMBER({数量文本})', category: 'text' },
    // GetObjectField: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'GetObjectField', description: '对指定的标准JSON对象中获取指定的key对应的value属性值', syntax: 'GetObjectField(JSON对象, key)', example: 'GetObjectField({详情}, "name")', category: 'text' },
    // ==================== 数组函数 (array) ====================
    // ITERATOR: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'ITERATOR', description: '将数组遍历后进行转换并返回新的数组', syntax: 'ITERATOR(数组, _(iterator_item) = 转换函数)', example: 'SUM(ITERATOR([2, 4, 5], _(iterator_item) = IF(EQ(iterator_item % 2, 0), 2, 1)))', category: 'array' },
    // FILTER: cn-next-smart 支持，但 formulajs 无对应导出，暂不启用
    // { name: 'FILTER', description: '筛选数组中符合指定条件的元素，并返回新的数组', syntax: 'FILTER(数组, _(filter_item) = 逻辑函数)', example: 'COUNT(FILTER([2, 4, 5], _(filter_item) = EQ(filter_item % 2, 0)))', category: 'array' },
];
exports.ALLOWED_FORMULAJS_FUNCTIONS = new Set(exports.FORMULA_FUNCTIONS.map((f) => f.name));
exports.FORMULA_FUNCTION_CATEGORIES = [
    'math',
    'logical',
    'time',
    'text',
    // 'array', // cn-next-smart 有数组分类，但其中的函数 formulajs 均不支持，暂不启用
];
/** 公式错误标记 */
exports.FORMULA_ERROR = {
    ERROR: '#ERROR!',
    REF: '#REF!',
    VALUE: '#VALUE!',
    NAME: '#NAME!',
    DIV0: '#DIV/0!',
    NULL: '#NULL!',
};
