///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
// All rights reserved.
//
// This software and its documentation and related materials are owned by
// the Alliance. The software may only be incorporated into application
// programs owned by members of the Alliance, subject to a signed
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable
// trade secrets of the Alliance and its suppliers. The software is also
// protected by copyright law and international treaty provisions. Application
// programs incorporating this software must include the following statement
// with their copyright notices:
//
//   This application incorporates Open Design Alliance software pursuant to a
//   license agreement with Open Design Alliance.
//   Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////

/**
 * 2D markup object interface.
 */
export interface IMarkupObject {
  /**
   * Returns a reference to a core markup library object (Konva, VisualizeJS, etc.).
   */
  ref(): any;

  /**
   * Returns the internal identifier of the object. Not unique.
   */
  id(): string;

  /**
   * Enables or disables the ability to select and edit an object using the mouse.
   */
  enableMouseEditing(value: boolean): void;

  /**
   * Returns the type of the object.
   */
  type(): string;

  /**
   * Returns the rotation angle of the object, in degress.
   */
  getRotation(): number;

  /**
   * Sets the rotation angle of the object.
   *
   * @param degrees - Number of degress to rotate.
   */
  setRotation(degrees: number): void;

  /**
   * Returns the Z-index of a object relative to sibling objects that are in the same group.
   *
   * Z-Index is not absolute (like in CSS). It is relative to parent object group only:
   *
   * - `images` - are olways at the bottom
   * - `texts` - are olways on top
   * - `others` - are always between images and texts
   */
  getZIndex(): number;

  /**
   * Sets the Z-index of a object relative to sibling objects that are in the same group.
   *
   * Z-Index is not absolute (like in CSS). It is relative to parent object group only:
   *
   * - `images` - are olways at the bottom
   * - `texts` - are olways on top
   * - `others` - are always between images and texts
   *
   * @param zIndex - An integer value of Z-Index.
   */
  setZIndex(zIndex: number): void;

  /**
   * Deletes the current object.
   */
  delete(): void;
}
