function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
 * 平面图 FloorMapViewConfig：与 props 同步时的规范化、以及草稿与持久化配置是否一致的比较
 */
import cloneDeep from 'lodash/cloneDeep';
import isEqual from 'lodash/isEqual';
import { FLOOR_MAP_IMAGE_ELEMENT_KIND, FLOOR_MAP_STAGE_ELEMENT_KIND } from "../types";
/**
 * 与 {@link useFloorMapEditState} 中 `useEffect` 逻辑一致：补全 `canvasUi`、空 `elementKinds` 时的默认调色板、`sceneElements`。
 * 用于从上游 prop 得到「可与当前 draft 公平比较」的基准配置。
 */
export function normalizeFloorMapViewConfigFromProp(floorMapConfigProp) {
  var _src$canCreate, _src$canEdit;
  var src = floorMapConfigProp;
  var base = src.canvasUi != null ? cloneDeep(src) : cloneDeep(_objectSpread(_objectSpread({}, src), {}, {
    canvasUi: {
      canCreate: (_src$canCreate = src.canCreate) !== null && _src$canCreate !== void 0 ? _src$canCreate : false,
      canEdit: (_src$canEdit = src.canEdit) !== null && _src$canEdit !== void 0 ? _src$canEdit : false
    }
  }));
  if (base.canvasUi.canCreate && (!base.elementKinds || base.elementKinds.length === 0)) {
    base.elementKindCategories = [{
      id: 'furniture',
      label: '桌椅设施',
      order: 0
    }, {
      id: 'decoration',
      label: '装饰与区域',
      order: 1
    }];
    base.elementKinds = [{
      value: 'table',
      label: '方桌',
      categoryId: 'furniture',
      dataBindingPolicy: 'optional',
      allowedDataSourceKeys: ['sales'],
      showInPalette: true
    }, {
      value: 'marker',
      label: '标记',
      categoryId: 'decoration',
      dataBindingPolicy: 'none',
      showInPalette: true
    }, {
      value: FLOOR_MAP_STAGE_ELEMENT_KIND,
      label: '舞台/区域',
      categoryId: 'decoration',
      dataBindingPolicy: 'none',
      showInPalette: true
    }, {
      value: FLOOR_MAP_IMAGE_ELEMENT_KIND,
      label: '图片（底图）',
      categoryId: 'decoration',
      dataBindingPolicy: 'none',
      showInPalette: true
    }, {
      value: 'icon',
      label: '图标',
      categoryId: 'decoration',
      dataBindingPolicy: 'none',
      defaultShape: 'circle',
      showInPalette: true
    }];
  }
  if (!base.sceneElements) base.sceneElements = [];
  return base;
}
function sortStableForCompare(config) {
  var _c$sceneElements, _c$elementKinds, _c$elementKindCategor, _c$edges;
  var c = cloneDeep(config);
  c.canvases = _toConsumableArray(c.canvases).sort(function (a, b) {
    return String(a.id).localeCompare(String(b.id));
  });
  c.sceneElements = _toConsumableArray((_c$sceneElements = c.sceneElements) !== null && _c$sceneElements !== void 0 ? _c$sceneElements : []).sort(function (a, b) {
    return String(a.instanceId).localeCompare(String(b.instanceId));
  });
  if ((_c$elementKinds = c.elementKinds) !== null && _c$elementKinds !== void 0 && _c$elementKinds.length) {
    c.elementKinds = _toConsumableArray(c.elementKinds).sort(function (a, b) {
      return String(a.value).localeCompare(String(b.value));
    });
  }
  if ((_c$elementKindCategor = c.elementKindCategories) !== null && _c$elementKindCategor !== void 0 && _c$elementKindCategor.length) {
    c.elementKindCategories = _toConsumableArray(c.elementKindCategories).sort(function (a, b) {
      return String(a.id).localeCompare(String(b.id));
    });
  }
  if ((_c$edges = c.edges) !== null && _c$edges !== void 0 && _c$edges.length) {
    c.edges = _toConsumableArray(c.edges).sort(function (a, b) {
      return String(a.id).localeCompare(String(b.id));
    });
  }
  return c;
}

/** 判断当前编辑草稿是否与基准配置一致（数组顺序无关） */
export function floorMapViewConfigsEqual(a, b) {
  return isEqual(sortStableForCompare(a), sortStableForCompare(b));
}