/**
 * Booking related messages.
 *
 * This file is really just an example. The data model is completely
 * fictional.
 */
syntax = "proto3";

import "google/api/annotations.proto";
import "github.com/mwitkow/go-proto-validators/validator.proto";

package com.example;

/**
 * Represents the booking status ID.
 */
message BookingStatusID {
  int32 id = 1; /// Unique booking status ID.
}

/**
 * Represents the status of a vehicle booking.
 */
message BookingStatus {
  int32 id           = 1; /// Unique booking status ID.
  string description = 2 [(validator.field) = {string_not_empty: true, length_lt: 255}]; /// Booking status description. E.g. "Active".
}

/**
 * Represents the booking of a vehicle.
 *
 * Vehicles are some cool shit. But drive carefully!
 */
message Booking {
  int32 vehicle_id     = 1; /// ID of booked vehicle.
  int32 customer_id    = 2; /// Customer that booked the vehicle.
  BookingStatus status = 3; /// Status of the booking.

  /** Has booking confirmation been sent? */
  bool confirmation_sent = 4;

  /** Has payment been received? */
  bool payment_received = 5;

  string color_preference = 6 [deprecated=true]; // Color preference of the customer.
}

// An empty message for testing
message EmptyBookingMessage {
}

/**
 * Service for handling vehicle bookings.
 */
service BookingService {
  /// Used to book a vehicle. Pass in a Booking and a BookingStatus will be returned.
  rpc BookVehicle (Booking) returns (BookingStatus) {
    option (google.api.http) = {
      post: "/api/bookings/vehicle/{vehicle_id}"
      body: "*"
    };
  }

  /// Used to subscribe to updates of the BookingStatus.
  rpc BookingUpdates (BookingStatusID) returns (stream BookingStatus);
}
