/**
 * FieldStore —— 统一字段元数据读写（适配层）
 *
 * 屏蔽旧 CustomFieldsConfig 分桶细节（aiConfig / formulaConfig / lookupConfig），
 * 对外暴露统一的 FieldRecord CRUD。
 *
 * **双写策略（阶段一）：**
 * 写入时同时写旧分桶结构，确保旧代码路径仍能正确读取。
 * 读取时从旧分桶结构适配为 FieldRecord，优先匹配 aiConfig，再匹配 formulaConfig / lookupConfig。
 * 后续迁移完成后应去掉双写，改为直接读写 FieldRecord。
 *
 * 注意：当前所有方法都需要传入 dataModel 实例，
 * 因为 FieldStore 本身是无状态的适配层，不持有 dataModel 引用。
 */
export class FieldStore {
    /**
     * 按 columnId 读取字段记录。
     * 适配逻辑：aiConfig → async-task(AI字段)，formulaConfig → sync-compute(公式字段)，lookupConfig → passive(引用字段)。
     */
    getFieldRecord(columnId, dataModel) {
        var _a, _b, _c;
        const aiConfig = (_a = dataModel.getCustomFieldAiConfig) === null || _a === void 0 ? void 0 : _a.call(dataModel, columnId);
        if (aiConfig) {
            return {
                id: columnId,
                type: aiConfig.fieldType || 'ai-generate',
                name: aiConfig.fieldName,
                config: aiConfig,
                runtime: { mode: 'async-task' },
            };
        }
        const formulaConfig = (_b = dataModel.getCustomFieldFormulaConfig) === null || _b === void 0 ? void 0 : _b.call(dataModel, columnId);
        if (formulaConfig) {
            return {
                id: columnId,
                type: 'formula',
                name: formulaConfig.fieldName,
                config: formulaConfig,
                runtime: { mode: 'sync-compute' },
            };
        }
        const lookupConfig = (_c = dataModel.getCustomFieldLookupConfig) === null || _c === void 0 ? void 0 : _c.call(dataModel, columnId);
        if (lookupConfig) {
            return {
                id: columnId,
                type: 'lookup',
                name: lookupConfig.fieldName,
                config: lookupConfig,
                runtime: { mode: 'passive' },
            };
        }
        return undefined;
    }
    /**
     * 写入字段记录。
     * 双写：根据 runtime.mode / type 分别写入旧分桶，保持向后兼容。
     */
    setFieldRecord(columnId, record, dataModel) {
        const isAi = record.runtime.mode === 'async-task';
        const isFormula = record.type === 'formula';
        const isLookup = record.type === 'lookup';
        if (isAi && dataModel.setCustomFieldAiConfig) {
            dataModel.setCustomFieldAiConfig(columnId, record.config);
        }
        if (isFormula && dataModel.setCustomFieldFormulaConfig) {
            dataModel.setCustomFieldFormulaConfig(columnId, record.config);
        }
        if (isLookup && dataModel.setCustomFieldLookupConfig) {
            dataModel.setCustomFieldLookupConfig(columnId, record.config);
        }
    }
    /** 删除字段记录，委托 dataModel.removeCustomField 清理旧分桶 */
    removeFieldRecord(columnId, dataModel) {
        var _a;
        (_a = dataModel.removeCustomField) === null || _a === void 0 ? void 0 : _a.call(dataModel, columnId);
    }
    /**
     * 获取所有字段记录（遍历旧分桶聚合）。
     * 读取优先级：dataModel.getCustomFields() > dataModel.customFields > 空对象
     */
    getAllFieldRecords(dataModel) {
        var _a;
        const records = [];
        const customFields = ((_a = dataModel.getCustomFields) === null || _a === void 0 ? void 0 : _a.call(dataModel)) ||
            dataModel.customFields || {
            aiConfig: {},
            aiColumns: [],
            formulaConfig: {},
            lookupConfig: {},
        };
        const aiConfig = customFields.aiConfig || {};
        for (const [id, config] of Object.entries(aiConfig)) {
            records.push({
                id,
                type: config.fieldType || 'ai-generate',
                name: config.fieldName,
                config,
                runtime: { mode: 'async-task' },
            });
        }
        const formulaConfig = customFields.formulaConfig || {};
        for (const [id, config] of Object.entries(formulaConfig)) {
            records.push({
                id,
                type: 'formula',
                name: config.fieldName,
                config,
                runtime: { mode: 'sync-compute' },
            });
        }
        const lookupConfig = customFields.lookupConfig || {};
        for (const [id, config] of Object.entries(lookupConfig)) {
            records.push({
                id,
                type: 'lookup',
                name: config.fieldName,
                config,
                runtime: { mode: 'passive' },
            });
        }
        return records;
    }
}
