import { verticalCompactor } from 'react-grid-layout';
import type { Compactor } from 'react-grid-layout';
import type { CanvasItem } from './types';

/**
 * 创建支持 Section 分层重叠的自定义 compactor。
 *
 * 碰撞规则：
 * - Section 与 Section：正常碰撞（不能重叠）
 * - 普通组件与普通组件：正常碰撞（不能重叠）
 * - Section 与普通组件：允许重叠
 *
 * 实现：将 layout 分为两层分别 compact，然后合并。
 * - Section 层：只包含 Section item，独立 compact
 * - 普通层：只包含普通 item，独立 compact
 * 由于两层独立 compact，它们之间自然不会互相推挤。
 */
export function createSectionCompactor(
  getItems: () => CanvasItem[],
): Compactor {
  return {
    type: 'vertical',
    allowOverlap: false,

    compact(layout, cols) {
      const items = getItems();
      const sectionIds = new Set(
        items
          .filter((item) => item.componentType === 'Section')
          .map((item) => item.id),
      );

      // 分两层
      const sectionLayout = layout.filter((l) => sectionIds.has(l.i));
      const normalLayout = layout.filter((l) => !sectionIds.has(l.i));

      // 各自独立 compact
      const compactedSections = verticalCompactor.compact(sectionLayout, cols);
      const compactedNormals = verticalCompactor.compact(normalLayout, cols);

      // 合并
      return [...compactedSections, ...compactedNormals];
    },
  };
}
