/// <reference path="../../index.d.ts" />
import type Collection from "@arcgis/core/core/Collection.js";
import type NamedTraceConfiguration from "@arcgis/core/networks/support/NamedTraceConfiguration.js";
import type UNTraceConfiguration from "@arcgis/core/networks/support/UNTraceConfiguration.js";
import type UtilityNetwork from "@arcgis/core/networks/UtilityNetwork.js";
import type TraceLocation from "@arcgis/core/rest/networks/support/TraceLocation.js";
import type MapView from "@arcgis/core/views/MapView.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { ArcgisReferenceElement } from "../types.js";
import type { UtilityNetworkTraceAnalysisDisplayMode } from "../arcgis-utility-network-trace-analysis/types.js";
import type { FlagInfo, SelectStartPayload } from "../arcgis-utility-network-trace-location/customElement.js";
import type { T9nMeta } from "@arcgis/lumina/controllers";

/**
 * This is a sub-component used by the **ArcgisUtilityNetworkTraceAnalysis** component.
 *
 * This sub-component takes a map view as an input.
 * It allows users to select utility networks, trace configurations, and input features for tracing.
 *
 * @since 4.34
 * @internal
 */
export abstract class ArcgisUtilityNetworkTraceInputs extends LitElement {
  /** @internal */
  protected _messages: {
      buttons: {
          add: string;
          cancel: string;
      };
      componentLabel: string;
      errors: {
          noCompatibleSubnetworks: string;
          noNamedTraceConfigurations: string;
          noTraceConfiguration: string;
          noUtilityNetwork: string;
          noView: string;
          utilityNetworkLoadFailed: string;
      };
      instructions: {
          addSpatial: {
              selectAssociatedFeature: {
                  heading: string;
                  subheading: string;
              };
              selectFeature: {
                  heading: string;
                  subheading: string;
              };
          };
          enterSubnetworkName: string;
      };
      labels: {
          addSpatial: {
              barrier: string;
              startingPoint: string;
              stoppingPoint: string;
          };
          featureList: string;
          subnetworkInfo: string;
          subnetworkName: string;
          tooManySubnetworks: string;
          traceConfiguration: string;
          traceInputs: string;
          utilityNetwork: string;
      };
      unknown: string;
      warnings: { exceededDisplayLimit: string; };
  } & T9nMeta<{
      buttons: {
          add: string;
          cancel: string;
      };
      componentLabel: string;
      errors: {
          noCompatibleSubnetworks: string;
          noNamedTraceConfigurations: string;
          noTraceConfiguration: string;
          noUtilityNetwork: string;
          noView: string;
          utilityNetworkLoadFailed: string;
      };
      instructions: {
          addSpatial: {
              selectAssociatedFeature: {
                  heading: string;
                  subheading: string;
              };
              selectFeature: {
                  heading: string;
                  subheading: string;
              };
          };
          enterSubnetworkName: string;
      };
      labels: {
          addSpatial: {
              barrier: string;
              startingPoint: string;
              stoppingPoint: string;
          };
          featureList: string;
          subnetworkInfo: string;
          subnetworkName: string;
          tooManySubnetworks: string;
          traceConfiguration: string;
          traceInputs: string;
          utilityNetwork: string;
      };
      unknown: string;
      warnings: { exceededDisplayLimit: string; };
  }>;
  /**
   * If true, the component will not be destroyed automatically when it is
   * disconnected from the document. This is useful when you want to move the
   * component to a different place on the page, or temporarily hide it. If this
   * is set, make sure to call the [destroy()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-utility-network-trace-inputs/#destroy) method when you are done to
   * prevent memory leaks.
   *
   * @default false
   */
  accessor autoDestroyDisabled: boolean;
  /**
   * A function to run before trace location selection starts.
   *
   * @internal
   */
  accessor beforeTraceLocationSelectStart: (() => Promise<void>) | undefined;
  /**
   * @default false
   * @internal
   */
  accessor hideActionBar: boolean;
  /**
   * @default false
   * @internal
   */
  get isSubnetworkNameTraceSelected(): boolean;
  /** @default "default" */
  accessor mode: UtilityNetworkTraceAnalysisDisplayMode;
  accessor referenceElement: ArcgisReferenceElement | string | undefined;
  accessor selectedNamedTraceConfiguration: NamedTraceConfiguration | undefined;
  accessor selectedUtilityNetwork: UtilityNetwork | undefined;
  /**
   * Supplementary information about the points selected on the map to run the trace.
   * I.e., feature title, terminal configuration, selected terminals, and spatial properties.
   *
   * @internal
   */
  get traceLocationFlagInfos(): Collection<FlagInfo>;
  get traceLocations(): TraceLocation[];
  /**
   * A clone of the utility network trace configuration associated with
   * the selected named trace configuration. Updates on this object are
   * used to reflect the user's changes to the named trace configuration.
   */
  get unTraceConfiguration(): UNTraceConfiguration | undefined;
  /** @required */
  accessor view: MapView | undefined;
  /** Permanently destroy the component. */
  destroy(): Promise<void>;
  readonly arcgisPropertyChange: import("@arcgis/lumina").TargetedEvent<this, { name: "mode"; }>;
  /** Fires when the user changes the selected named trace configuration. */
  readonly arcgisSelectedNamedTraceConfigurationChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** There will be more added to this event as we increase the functionality of this component */
  readonly arcgisTraceInputsChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  /**
   * Fires when the user completes the selection of a trace location.
   *
   * @internal
   */
  readonly arcgisTraceLocationSelectEnd: import("@arcgis/lumina").TargetedEvent<this, void>;
  /**
   * Fires when the user begins selection of a trace location.
   * Can be prevented to stop the selection.
   *
   * @internal
   */
  readonly arcgisTraceLocationSelectStart: import("@arcgis/lumina").TargetedEvent<this, SelectStartPayload>;
  /** This will be fired less often than above, only when the utility network changes */
  readonly arcgisUtilityNetworkChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    arcgisPropertyChange: ArcgisUtilityNetworkTraceInputs["arcgisPropertyChange"]["detail"];
    arcgisSelectedNamedTraceConfigurationChange: ArcgisUtilityNetworkTraceInputs["arcgisSelectedNamedTraceConfigurationChange"]["detail"];
    arcgisTraceInputsChange: ArcgisUtilityNetworkTraceInputs["arcgisTraceInputsChange"]["detail"];
    arcgisTraceLocationSelectEnd: ArcgisUtilityNetworkTraceInputs["arcgisTraceLocationSelectEnd"]["detail"];
    arcgisTraceLocationSelectStart: ArcgisUtilityNetworkTraceInputs["arcgisTraceLocationSelectStart"]["detail"];
    arcgisUtilityNetworkChange: ArcgisUtilityNetworkTraceInputs["arcgisUtilityNetworkChange"]["detail"];
  };
}