/**
 * 选区（selection zone）几何工具：成员关系按「完全包含」实时计算，不持久化成员列表。
 *
 * - 判定规则：图元的包围盒**完全落在**选区矩形内（含边界）即为该选区成员。
 * - 排除项：选区自身、其它选区、布局锁定（layoutTransformLocked）的图元。
 * - 成员仅在「拖拽开始那一刻」按当前坐标快照一次，拖动过程中集合不变，避免边界抖动。
 */
import { FLOOR_MAP_SELECTION_ZONE_ELEMENT_KIND } from "../types";
/** 该图元是否为选区 */
export function isSelectionZoneItem(item) {
  return item.elementKind === FLOOR_MAP_SELECTION_ZONE_ELEMENT_KIND;
}

/** zoneRect 是否「完全包含」itemRect（含边界，允许 1px 容差以抵消取整误差） */
export function rectFullyContains(zoneRect, itemRect) {
  var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;
  return itemRect.left >= zoneRect.left - tolerance && itemRect.top >= zoneRect.top - tolerance && itemRect.left + itemRect.width <= zoneRect.left + zoneRect.width + tolerance && itemRect.top + itemRect.height <= zoneRect.top + zoneRect.height + tolerance;
}

/**
 * 计算选区成员 id 列表（输入为像素矩形坐标系）。
 *
 * @param zoneId      选区自身 id（排除自身）
 * @param zoneRect    选区矩形（像素）
 * @param itemRects   画布上全部图元及其像素矩形
 */
export function computeSelectionZoneMemberIds(zoneId, zoneRect, itemRects) {
  return itemRects.filter(function (_ref) {
    var _item$_sceneElement;
    var item = _ref.item;
    if (item.id === zoneId) return false;
    // 不级联其它选区，避免连锁移动
    if (isSelectionZoneItem(item)) return false;
    // 布局锁定的图元不随选区移动
    if ((_item$_sceneElement = item._sceneElement) !== null && _item$_sceneElement !== void 0 && _item$_sceneElement.layoutTransformLocked) return false;
    return true;
  }).filter(function (_ref2) {
    var rect = _ref2.rect;
    return rectFullyContains(zoneRect, rect);
  }).map(function (_ref3) {
    var item = _ref3.item;
    return item.id;
  });
}