import { SelectionState } from "../api/types.js";

//#region src/canvas/selection/SelectionModel.d.ts

/**
 * Pure selection logic - semantics separate from mechanism.
 * Manages selection state and operations.
 */
declare class SelectionModel extends EventTarget {
  private _selectedIds;
  private _primaryId;
  private _selectionMode;
  private _boxSelectStart;
  private _boxSelectCurrent;
  private _groups;
  private _elementToGroup;
  /**
   * Emit selectionchange event with current selection state.
   */
  private _emitSelectionChange;
  /**
   * Get current selection state.
   */
  get selectedIds(): ReadonlySet<string>;
  /**
   * Get current selection mode.
   */
  get selectionMode(): SelectionState;
  /**
   * Get current box selection bounds, if active.
   */
  get boxSelectBounds(): DOMRect | null;
  /**
   * Select a single element.
   */
  select(id: string): void;
  /**
   * Select multiple elements.
   */
  selectMultiple(ids: string[]): void;
  /**
   * Add element to selection (for multi-select).
   */
  addToSelection(id: string): void;
  /**
   * Remove element from selection.
   */
  deselect(id: string): void;
  /**
   * Toggle element selection state.
   */
  toggle(id: string): void;
  /**
   * Clear all selections.
   */
  clear(): void;
  /**
   * Start box selection.
   */
  startBoxSelect(x: number, y: number): void;
  /**
   * Update box selection.
   */
  updateBoxSelect(x: number, y: number): void;
  /**
   * End box selection and select elements within bounds.
   * @param hitTest - Function to find elements within bounds
   * @param addToSelection - If true, add to existing selection; if false, replace selection
   */
  endBoxSelect(hitTest: (bounds: DOMRect) => string[], addToSelection?: boolean): void;
  /**
   * Create a group from selected elements.
   */
  createGroup(ids: string[]): string;
  /**
   * Ungroup a group.
   */
  ungroup(groupId: string): void;
  /**
   * Select all elements in a group.
   */
  selectGroup(groupId: string): void;
  /**
   * Get group ID for an element, if any.
   */
  getGroupId(elementId: string): string | undefined;
  /**
   * Get all element IDs in a group.
   */
  getGroupElements(groupId: string): string[];
  /**
   * Update selection mode based on current selection count.
   */
  private _updateSelectionMode;
}
//#endregion
export { SelectionModel };
//# sourceMappingURL=SelectionModel.d.ts.map