// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.maps.routes.v1;

import "google/maps/routes/v1/polyline.proto";
import "google/maps/routes/v1/toll_passes.proto";
import "google/maps/routes/v1/vehicle_emission_type.proto";
import "google/maps/routes/v1/waypoint.proto";
import "google/protobuf/timestamp.proto";

option cc_enable_arenas = true;
option csharp_namespace = "Google.Maps.Routes.V1";
option go_package = "cloud.google.com/go/maps/routes/apiv1/routespb;routespb";
option java_multiple_files = true;
option java_outer_classname = "ComputeRoutesRequestProto";
option java_package = "com.google.maps.routes.v1";
option objc_class_prefix = "GMRS";
option php_namespace = "Google\\Maps\\Routes\\V1";

// ComputeRoutes request message.
message ComputeRoutesRequest {
  // Required. Origin waypoint.
  Waypoint origin = 1;

  // Required. Destination waypoint.
  Waypoint destination = 2;

  // Optional. A set of waypoints along the route (excluding terminal points),
  // for either stopping at or passing by. Up to 25 intermediate waypoints are
  // supported.
  repeated Waypoint intermediates = 3;

  // Optional. Specifies the mode of transportation.
  RouteTravelMode travel_mode = 4;

  // Optional. Specifies how to compute the route. The server
  // attempts to use the selected routing preference to compute the route. If
  //  the routing preference results in an error or an extra long latency, then
  // an error is returned. In the future, we might implement a fallback
  // mechanism to use a different option when the preferred option does not give
  // a valid result. You can specify this option only when the `travel_mode` is
  // `DRIVE` or `TWO_WHEELER`, otherwise the request fails.
  RoutingPreference routing_preference = 5;

  // Optional. Specifies your preference for the quality of the polyline.
  PolylineQuality polyline_quality = 6;

  // Optional. Specifies the preferred encoding for the polyline.
  PolylineEncoding polyline_encoding = 12;

  // Optional. The departure time. If you don't set this value, then this value
  // defaults to the time that you made the request. If you set this value to a
  // time that has already occurred, then the request fails.
  google.protobuf.Timestamp departure_time = 7;

  // Specifies whether to calculate alternate routes in addition to the route.
  bool compute_alternative_routes = 8;

  // Optional. A set of conditions to satisfy that affect the way routes are
  // calculated.
  RouteModifiers route_modifiers = 9;

  // Optional. The BCP-47 language code, such as "en-US" or "sr-Latn". For more
  // information, see
  // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. See
  // [Language Support](https://developers.google.com/maps/faq#languagesupport)
  // for the list of supported languages. When you don't provide this value, the
  // display language is inferred from the location of the route request.
  string language_code = 10;

  // Optional. Specifies the units of measure for the display fields. This
  // includes the `instruction` field in `NavigationInstruction`. The units of
  // measure used for the route, leg, step distance, and duration are not
  // affected by this value. If you don't provide this value, then the display
  // units are inferred from the location of the request.
  Units units = 11;

  // If optimizeWaypointOrder is set to true, an attempt is made to re-order the
  // specified intermediate waypoints to minimize the overall cost of the route.
  // If any of the intermediate waypoints is via waypoint the request fails. Use
  // ComputeRoutesResponse.Routes.optimized_intermediate_waypoint_index to find
  // the new ordering. If routes.optimized_intermediate_waypoint_index is not
  // requested in the `X-Goog-FieldMask` header, the request fails. If
  // optimizeWaypointOrder is set to false,
  // ComputeRoutesResponse.optimized_intermediate_waypoint_index is empty.
  bool optimize_waypoint_order = 13;
}

// Encapsulates a set of optional conditions to satisfy when calculating the
// routes.
message RouteModifiers {
  // Specifies whether to avoid toll roads where reasonable. Preference will be
  // given to routes not containing toll roads. Applies only to the `DRIVE` and
  // `TWO_WHEELER` travel modes.
  bool avoid_tolls = 1;

  // Specifies whether to avoid highways where reasonable. Preference will be
  // given to routes not containing highways. Applies only to the `DRIVE` and
  // `TWO_WHEELER` travel modes.
  bool avoid_highways = 2;

  // Specifies whether to avoid ferries where reasonable. Preference will be
  // given to routes not containing travel by ferries.
  // Applies only to the `DRIVE` and`TWO_WHEELER` travel modes.
  bool avoid_ferries = 3;

  // Specifies whether to avoid navigating indoors where reasonable. Preference
  // will be given to routes not containing indoor navigation.
  // Applies only to the `WALK` travel mode.
  bool avoid_indoor = 4;

  // Specifies the vehicle information.
  VehicleInfo vehicle_info = 5;

  // Encapsulates information about toll passes.
  // If toll passes are provided, the API tries to return the pass price. If
  // toll passes are not provided, the API treats the toll pass as unknown and
  // tries to return the cash price.
  // Applies only to the DRIVE and TWO_WHEELER travel modes.
  repeated TollPass toll_passes = 6;
}

// Encapsulates the vehicle information, such as the license plate last
// character.
message VehicleInfo {
  // Specifies the license plate last character. Could be a digit or a letter.
  string license_plate_last_character = 1;

  // Describes the vehicle's emission type.
  // Applies only to the DRIVE travel mode.
  VehicleEmissionType emission_type = 2;
}

// A set of values used to specify the mode of travel.
enum RouteTravelMode {
  // No travel mode specified. Defaults to `DRIVE`.
  TRAVEL_MODE_UNSPECIFIED = 0;

  // Travel by passenger car.
  DRIVE = 1;

  // Travel by bicycle.
  BICYCLE = 2;

  // Travel by walking.
  WALK = 3;

  // Two-wheeled, motorized vehicle. For example, motorcycle. Note that this
  // differs from the `BICYCLE` travel mode which covers human-powered mode.
  TWO_WHEELER = 4;

  // Travel by licensed taxi, which may allow the vehicle to travel on
  // designated taxi lanes in some areas.
  TAXI = 5;
}

// A set of values that specify factors to take into consideration when
// calculating the route.
enum RoutingPreference {
  // No routing preference specified. Default to `TRAFFIC_AWARE`.
  ROUTING_PREFERENCE_UNSPECIFIED = 0;

  // Computes routes without taking traffic conditions into consideration.
  // Suitable when traffic conditions don't matter. Using this value produces
  // the lowest latency.
  TRAFFIC_UNAWARE = 1;

  // Calculates routes taking traffic conditions into consideration. In contrast
  // to `TRAFFIC_AWARE_OPTIMAL`, some optimizations are applied to significantly
  // reduce latency.
  TRAFFIC_AWARE = 2;

  // Calculates the routes taking traffic conditions into consideration,
  // without applying most performance optimizations. Using this value produces
  // the highest latency.
  TRAFFIC_AWARE_OPTIMAL = 3;
}

// A set of values that specify the unit of measure used in the display.
enum Units {
  // Units of measure not specified. Defaults to the unit of measure inferred
  // from the request.
  UNITS_UNSPECIFIED = 0;

  // Metric units of measure.
  METRIC = 1;

  // Imperial (English) units of measure.
  IMPERIAL = 2;
}
