/**
 * 固定列模型
 *
 * 以 pinnedFieldIds 为唯一一手来源，派生出表头 / 表体 / 分组头共用的
 * pinned 判定、偏移量、z-index 等数据，避免各组件独立循环计算。
 */
import { normalizeId } from './drag-identity';
// ===================== Builder =====================
/**
 * 从 pinnedFieldIds + columnOrder + widthMap 派生完整的固定列模型
 *
 * @param columnOrder  列顺序（包含所有可见列 ID）
 * @param pinnedFieldIds  固定字段 ID 列表
 * @param widthMap  列宽映射表
 * @param actionColumnWidth  功能列宽度（拖拽把手 + 序号/多选框）
 */
export function buildPinnedModel(columnOrder, pinnedFieldIds, widthMap, actionColumnWidth) {
    const pinnedSet = new Set(pinnedFieldIds.map((id) => normalizeId(id)));
    const orderedPinned = [];
    for (const colId of columnOrder) {
        const strId = normalizeId(colId);
        if (pinnedSet.has(strId)) {
            orderedPinned.push(strId);
        }
    }
    const offsets = {};
    let currentLeft = actionColumnWidth;
    for (const fieldId of orderedPinned) {
        offsets[fieldId] = currentLeft;
        currentLeft += widthMap[fieldId] || 200;
    }
    const count = orderedPinned.length;
    const lastPinnedId = count > 0 ? orderedPinned[count - 1] : null;
    return {
        pinnedFieldIds: orderedPinned,
        pinnedColumnsCount: count,
        pinnedOffsets: offsets,
        totalPinnedWidth: currentLeft,
        isPinned: (fieldId) => pinnedSet.has(normalizeId(fieldId)),
        getPinnedZIndex: (fieldId, base) => {
            const idx = orderedPinned.indexOf(normalizeId(fieldId));
            return idx >= 0 ? base + (count - idx) : 0;
        },
        isLastPinned: (fieldId) => normalizeId(fieldId) === lastPinnedId,
    };
}
// ===================== Compat =====================
/**
 * 从旧的 pinnedColumnsCount 推导 pinnedFieldIds（兼容历史数据）
 */
export function derivePinnedFieldIdsFromCount(columnOrder, count) {
    return columnOrder.slice(0, Math.max(0, count)).map((id) => normalizeId(id));
}
/**
 * 从 viewConfig 中解析 pinnedFieldIds，自动兼容旧的 pinnedColumnsCount
 */
export function resolvePinnedFieldIds(viewConfig, columnOrder) {
    var _a, _b, _c;
    const saved = (_a = viewConfig.custom) === null || _a === void 0 ? void 0 : _a.pinnedFieldIds;
    if (Array.isArray(saved) && saved.length > 0) {
        return saved.map((id) => normalizeId(id));
    }
    const legacyCount = (_c = (_b = viewConfig.custom) === null || _b === void 0 ? void 0 : _b.pinnedColumnsCount) !== null && _c !== void 0 ? _c : 1;
    return derivePinnedFieldIdsFromCount(columnOrder, legacyCount);
}
