/**
 * 拖拽排序纯函数
 *
 * 所有排序逻辑集中于此，组件层只负责收集参数、调用函数、根据结果决定写回。
 * 输入 → 当前顺序、activeId、overId、pinned 信息、主键解析器
 * 输出 → DragSortResult（显式成功或失败）
 */
import { arrayMove } from '@dnd-kit/sortable';
import { findIndexByNormalizedId, toNormalizedSet } from './drag-identity';
import { getRowKeyStrict } from '../../../../../../cn-ai-table/view/utils/primary-key';
function success(value) {
    return { ok: true, value };
}
function fail(reason) {
    return { ok: false, reason };
}
// ===================== Column sort =====================
/**
 * 列拖拽排序（纯函数）
 *
 * - 使用归一化 ID 比较，兼容 string / number 混用
 * - pinnedColumnIds 中的列不参与重排
 */
export function sortColumns(columnOrder, activeId, overId, pinnedColumnIds) {
    if (pinnedColumnIds && pinnedColumnIds.length > 0) {
        const pinnedSet = toNormalizedSet(pinnedColumnIds);
        if (pinnedSet.has(String(activeId)) || pinnedSet.has(String(overId))) {
            return fail('cross_pinned_boundary');
        }
    }
    const oldIndex = findIndexByNormalizedId(columnOrder, activeId);
    if (oldIndex === -1)
        return fail('missing_active');
    const newIndex = findIndexByNormalizedId(columnOrder, overId);
    if (newIndex === -1)
        return fail('missing_over');
    if (oldIndex === newIndex)
        return fail('same_position');
    return success(arrayMove([...columnOrder], oldIndex, newIndex));
}
// ===================== Row sort =====================
/**
 * 行拖拽排序（纯函数）
 *
 * 行拖拽必须建立在稳定主键上。
 * 当 primaryKey 无法从 record 中提取有效值时，返回 invalid_row_identity 而非 fallback 到 index。
 */
export function sortRows(data, activeId, overId, primaryKey) {
    const activeStr = String(activeId);
    const overStr = String(overId);
    const oldIndex = data.findIndex((item) => {
        const key = getRowKeyStrict(item, primaryKey);
        return key !== null && String(key) === activeStr;
    });
    if (oldIndex === -1)
        return fail('missing_active');
    const newIndex = data.findIndex((item) => {
        const key = getRowKeyStrict(item, primaryKey);
        return key !== null && String(key) === overStr;
    });
    if (newIndex === -1)
        return fail('missing_over');
    if (oldIndex === newIndex)
        return fail('same_position');
    return success(arrayMove([...data], oldIndex, newIndex));
}
