import type { ClonableMixin } from "../../../core/Clonable.js";
import type { JSONSupport } from "../../../core/JSONSupport.js";
import type { TraceLocationType } from "../../../networks/support/typeUtils.js";

export interface TraceLocationProperties extends Partial<Pick<TraceLocation, "firstUnit" | "globalId" | "isFilterBarrier" | "lastUnit" | "networkSourceId" | "percentAlong" | "terminalId" | "type">> {}

/**
 * To perform the trace analytic, users can optionally supply a list of locations in forms of globalIds (UUID) and terminals. These locations indicate where should the trace start (also known as starting points) and where should it end (barriers)
 * Starting locations can be applied to all network sources.
 *
 * @since 4.20
 * @see [trace](https://developers.arcgis.com/javascript/latest/references/core/rest/networks/trace/)
 */
export default class TraceLocation extends TraceLocationSuperclass {
  constructor(properties?: TraceLocationProperties);
  /**
   * The first unit in a grouped object for the trace location.
   * Used in Telecom domain networks.
   *
   * @since 4.34
   */
  accessor firstUnit: number | null | undefined;
  /** The globalId (UUID) of the feature to start or stop the trace. */
  accessor globalId: string;
  /**
   * This indicates whether this barrier starting location should be skipped (filtered) when a trace attempts to find upstream controllers. Setting this to `false` will stop the trace if it encounters this barrier. When to set to `true`, the trace will momenterily skip the barrier to find any upstream controllers and will filter out the output accordingly. Applicable subnetwork-based trace types only.
   *
   * @default false
   */
  accessor isFilterBarrier: boolean;
  /**
   * The last unit in a grouped object for the trace location.
   * Used in Telecom domain networks.
   *
   * @since 4.34
   */
  accessor lastUnit: number | null | undefined;
  /**
   * The ID of the network source the trace location belongs to.
   * This is returned when a circuit trace returns a path with start and stop locations.
   */
  accessor networkSourceId: number | null | undefined;
  /**
   * This double parameter of value of 0-1 indicates a percentage along the line of where the trace location is placed. Applicable to line features only.
   *
   * @example
   * Line feature with objectId 100 with 2 midspan junctions (j1,j2). The line feature has 3 edge network elements
   * F-j1, j1-j2 and j2-T.
   *
   *                                        OID=100
   *                                F------j1------j2------T
   *
   * F-j1  (objectId=100, positionFrom=0, positionTo=0.33)
   * j1-j2 (objectId=100, positionFrom=0.33, positionTo=0.66)
   * j2-T  (objectId=100, positionFrom=0.66, positionTo=1)
   *
   * When percentAlong is 0.5 (50%) the starting location will be placed on the middle edge (j1-j2)
   *
   *                                        OID=100
   *                                F------j1---x--j2------T
   *
   * When percentAlong is 0.1 (10%) the starting location will be placed on the first edge (F-j1)
   *
   *                                        OID=100
   *                                F-x----j1------j2------T
   */
  accessor percentAlong: number;
  /**
   * The terminal Id to place the starting location at. Applicable for junction/device sources only. Users can use `getTerminalConfiguration()` in [UtilityNetwork](https://developers.arcgis.com/javascript/latest/references/core/networks/UtilityNetwork/) to get the terminal.
   * > [!NOTE]
   * >
   * > The telecom domain network no longer uses terminal IDs as of beta 2. However, as of beta 2, point features and junction objects used as a `TraceLocation` in a telecom domain network must specify `terminalId: 1`, else the trace location cannot be found.
   *
   * @see [Terminal](https://developers.arcgis.com/javascript/latest/references/core/networks/support/Terminal/)
   */
  accessor terminalId: number | null | undefined;
  /** The type of the trace location; `starting-point` defines where the trace should start and `barrier` defines where the trace should stop. */
  accessor type: TraceLocationType;
}
declare const TraceLocationSuperclass: typeof JSONSupport & typeof ClonableMixin