import type Graphic from "../../Graphic.js";
import type NAMessage from "./NAMessage.js";
import type RouteResult from "./RouteResult.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { NAMessageProperties } from "./NAMessage.js";
import type { GraphicProperties } from "../../Graphic.js";
import type { RouteResultProperties } from "./RouteResult.js";

export interface RouteSolveResultProperties {
  /** An array of processing [messages](https://developers.arcgis.com/javascript/latest/references/core/rest/support/NAMessage/) generated by the server. */
  messages?: NAMessageProperties[] | null;
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing point barriers.
   * Point barriers are returned if [RouteParameters.returnBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [barriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#barriers-1)
   */
  pointBarriers?: GraphicProperties[] | null;
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing polygon barriers.
   * Polygon barriers are returned if [RouteParameters.returnPolygonBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnPolygonBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [polygonBarriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#polygonbarriers-1)
   */
  polygonBarriers?: GraphicProperties[] | null;
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing polyline barriers.
   * Polyline barriers are returned if [RouteParameters.returnPolylineBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnPolylineBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [polylineBarriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#polylinebarriers-1)
   */
  polylineBarriers?: GraphicProperties[] | null;
  /** An array of [route results](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteResult/). */
  routeResults?: RouteResultProperties[];
}

/**
 * The results from [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) method.
 * A RouteSolveResult may contain barriers, messages, and one or more
 * [RouteResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteResult/).
 *
 * @since 4.23
 * @see [route](https://developers.arcgis.com/javascript/latest/references/core/rest/route/)
 * @see [RouteResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteResult/)
 * @see [RouteParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/)
 */
export default class RouteSolveResult extends JSONSupport {
  constructor(properties?: RouteSolveResultProperties);
  /** An array of processing [messages](https://developers.arcgis.com/javascript/latest/references/core/rest/support/NAMessage/) generated by the server. */
  get messages(): NAMessage[] | null | undefined;
  set messages(value: NAMessageProperties[] | null | undefined);
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing point barriers.
   * Point barriers are returned if [RouteParameters.returnBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [barriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#barriers-1)
   */
  get pointBarriers(): Graphic[] | null | undefined;
  set pointBarriers(value: GraphicProperties[] | null | undefined);
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing polygon barriers.
   * Polygon barriers are returned if [RouteParameters.returnPolygonBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnPolygonBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [polygonBarriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#polygonbarriers-1)
   */
  get polygonBarriers(): Graphic[] | null | undefined;
  set polygonBarriers(value: GraphicProperties[] | null | undefined);
  /**
   * An array of [graphics](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) representing polyline barriers.
   * Polyline barriers are returned if [RouteParameters.returnPolylineBarriers](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteParameters/#returnPolylineBarriers)
   * is set to `true` in a [solve()](https://developers.arcgis.com/javascript/latest/references/core/rest/route/#solve) request.
   *
   * @see [polylineBarriers](https://developers.arcgis.com/rest/services-reference/enterprise/route-sync-services/#polylinebarriers-1)
   */
  get polylineBarriers(): Graphic[] | null | undefined;
  set polylineBarriers(value: GraphicProperties[] | null | undefined);
  /** An array of [route results](https://developers.arcgis.com/javascript/latest/references/core/rest/support/RouteResult/). */
  get routeResults(): RouteResult[];
  set routeResults(value: RouteResultProperties[]);
}