/**
 * Last Mile Delivery is a type of [Vehicle Routing Problem](https://developers.arcgis.com/documentation/mapping-and-location-services/routing-and-directions/vehicle-routing-problem/)
 * operation that can find the most optimized routes for a fleet of vehicles that need
 * to make deliveries. It is specifically tailored to the unique challenges of final
 * deliveries, focusing on efficiency in dense urban environments. It produces
 * geographically clustered routes so drivers can easily visit each location, which
 * minimizes the operating cost for the fleet of vehicles.
 *
 * @since 4.34
 * @see [LastMileDeliveryParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/LastMileDeliveryParameters/)
 * @see [Solve Last Mile Delivery - ArcGIS Server REST API](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/)
 */
import type GPOptions from "./geoprocessor/GPOptions.js";
import type FeatureSet from "./support/FeatureSet.js";
import type JobInfo from "./support/JobInfo.js";
import type LastMileDeliveryParameters from "./support/LastMileDeliveryParameters.js";
import type { RequestOptions } from "../request/types.js";

/** The cost of the analysis, including the number of billable objects and the number of credits consumed. */
export interface Cost {
  /** The number of billable objects. */
  numberOfObjects: number;
  /** The number of credits consumed. */
  credits: number;
}

export type GetResultOptions = Partial<Pick<GPOptions, "outSpatialReference" | "processExtent" | "returnM" | "returnZ">>;

/**
 * Determines the optimized routes for a fleet of vehicles that need to make deliveries.
 *
 * @param url - URL to the ArcGIS Server REST resource that represents a network analysis service.
 * @param parameters - Parameters needed to configure the last mile delivery solver.
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [JobInfo](https://developers.arcgis.com/javascript/latest/references/core/rest/support/JobInfo/).
 * @example
 * const apiKey = "YOUR_API_KEY";
 * const url = "https://logistics.arcgis.com/arcgis/rest/services/World/VehicleRoutingProblem/GPServer/SolveLastMileDelivery";
 * const parameters = new LastMileDeliveryParameters({
 *   apiKey,
 *   depots: new FeatureSet({ features: {  <An array of graphics>  } }),
 *   orders: new FeatureSet({ features: {  <An array of graphics>  } }),
 *   routes: new FeatureSet({ features: {  <An array of graphics>  } }),
 *   earliestRouteStartDate: "2024-02-02",
 *   maxRouteTotalTime: 480,
 * )};
 *
 * // Returns job-id when async job is complete.
 * const jobInfo = await lastMileDelivery.exectute(url, parameters);
 *
 * const requestOptions = { query: { token: parameters.apiKey } };
 * const [depots, orders, routes, cost] = await Promise.all([
 *   getDepots(jobInfo, null, requestOptions),
 *   getOrders(jobInfo, null, requestOptions),
 *   getRoutes(jobInfo, null, requestOptions),
 *   getCost(jobInfo, null, requestOptions),
 * ]);
 */
export function execute(url: string, parameters: LastMileDeliveryParameters, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<JobInfo>;

/**
 * Contains all the fields from the input depots parameter, as well as the following fields that
 * are either generated or altered by the service.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: output_depots](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_depots)
 */
export function getDepots(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;

/**
 * Contains all the attributes from input orders parameter,
 * this includes the attributes defined on the service, and also attributes that are pass-through
 * (you can pass additional attributes on input orders and those attributes will be carried over
 *  to the output). The output also contains following attributes that are either generated or altered by the service.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: output_orders](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_orders)
 */
export function getOrders(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;

/**
 * Contains all the fields from the input routes parameter, as well as the following
 * fields that are either generated or altered by the service.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: output_routes](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_routes)
 */
export function getRoutes(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;

/**
 * Returns the credits used by the analysis.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [Cost](https://developers.arcgis.com/javascript/latest/references/core/rest/lastMileDelivery/#Cost).
 * @see [Response objects: usage_cost](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#usage_cost)
 */
export function getCost(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<Cost>;

/**
 * Specifies the output turn-by-turn directions for the routes calculated
 * in the analysis, represented as point locations along the routes where specific direction events
 * or maneuvers occur.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: direction_points](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_direction_points)
 */
export function getDirectionPoints(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;

/**
 * Provides information regarding why a route visited a depot and what happened there.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: depot_visits](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_depot_visits)
 */
export function getDepotVisits(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;

/**
 * The output route lines calculated in the analysis sliced to represent each route
 * segment between direction points events or maneuver locations.
 *
 * @param jobInfo - the JobInfo result from execute
 * @param options - Processing options.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns When resolved, returns an instance of [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 * @see [Response objects: direction_lines](https://developers.arcgis.com/rest/routing/last-mile-delivery-service/#output_direction_lines)
 */
export function getDirectionLines(jobInfo: JobInfo, options?: GetResultOptions, requestOptions?: RequestOptions): Promise<FeatureSet>;