import type { EventedMixin } from "../../core/Evented.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { SubcircuitState } from "./typeUtils.js";

export interface SubcircuitProperties extends Partial<Pick<Subcircuit, "attributes" | "consumerId" | "globalId" | "name" | "providerId" | "state">> {}

export interface SubcircuitEvents {}

/**
 * Represents a subcircuit in a telecom domain network.
 *
 * @beta
 * @since 4.34
 * @see [UtilityNetwork](https://developers.arcgis.com/javascript/latest/references/core/networks/UtilityNetwork/)
 * @see [CircuitManager](https://developers.arcgis.com/javascript/latest/references/core/networks/CircuitManager/)
 * @see [Circuit](https://developers.arcgis.com/javascript/latest/references/core/networks/support/Circuit/)
 * @see [CircuitSection](https://developers.arcgis.com/javascript/latest/references/core/networks/support/CircuitSection/)
 * @see [CircuitLocation](https://developers.arcgis.com/javascript/latest/references/core/networks/support/CircuitLocation/)
 * @see [Telecom domain network](https://pro.arcgis.com/en/pro-app/latest/help/data/utility-network/telecom-domain-networks.htm)
 */
export default class Subcircuit extends SubcircuitSuperclass {
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": SubcircuitEvents;
  constructor(properties?: SubcircuitProperties);
  /** User-defined attributes on the subcircuit. */
  accessor attributes: Record<string, any> | null | undefined;
  /** The global ID of the circuit that consumes the subcircuit. */
  accessor consumerId: string | null | undefined;
  /** The global ID of the subcircuit. */
  accessor globalId: string | null | undefined;
  /**
   * The name of the subcircuit.
   * This name is unique within a circuit.
   */
  accessor name: string;
  /** The global ID of the provider circuit in which the subcircuit participates. */
  accessor providerId: string | null | undefined;
  /**
   * The state of the subcircuit. A subcircuit can be in one of three states:
   *
   * 1. Consumed: The subcircuit is used in the definition of another circuit.
   * 2. Reserved: The subcircuit is assigned to its provider circuit and is not available for consumption by other circuits.
   * 3. Available: The subcircuit is not used in the definition of another circuit (consumed) or assigned to the provider (reserved).
   *
   * @default "available"
   */
  accessor state: SubcircuitState;
  /**
   * Returns the value of the specified user-defined attribute.
   *
   * @param name - The name of the attribute.
   * @returns Returns the value of the attribute specified by `name`.
   */
  getAttribute<T = any>(name: string): T;
  /**
   * Sets a new value for the specified user-defined attribute.
   *
   * @param name - The name of the attribute to set.
   * @param newValue - The new value to set on the named attribute.
   */
  setAttribute(name: string, newValue: any): void;
}
declare const SubcircuitSuperclass: typeof JSONSupport & typeof EventedMixin