syntax = "proto3";

import "google/protobuf/empty.proto";
import "validate/validate.proto";
import "google/api/annotations.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

option go_package = "route256/pkg/api/loms/v1;loms";

option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
  info: {
    title: "LOMS Service";
    version: "1.0.0";
  };
  schemes: HTTP;
  schemes: HTTPS;
  consumes: "application/json";
  produces: "application/json";
};

service LOMS {
  option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag) = {
    description: "LOMS Service"
    external_docs: {
      url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/examples/internal/proto/examplepb/a_bit_of_everything.proto";
      description: "Find out more about grpc-gateway";
    }
  };

  rpc OrderCreate(OrderCreateRequest) returns (OrderCreateResponse) {
    option(google.api.http) = {
      post: "/order/create"
      body: "*"
    };
  }

  rpc OrderInfo(OrderInfoRequest) returns (OrderInfoResponse) {
    option (google.api.http) = {
      get: "/order/info"
    };
  }

  rpc OrderPay(OrderPayRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/order/pay"
      body: "*"
    };
  }

  rpc OrderCancel(OrderCancelRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/order/cancel"
      body: "*"
    };
  }

  rpc StocksInfo(StocksInfoRequest) returns (StocksInfoResponse) {
    option (google.api.http) = {
      get: "/stock/info"
    };
  }
}

message OrderItem {
  int64 sku = 1 [(validate.rules).int64 = {gt: 0}];
  uint32 count = 2 [(validate.rules).uint32 = {gt: 0}];
}

// OrderCreate

message OrderCreateRequest {
  int64 user_id = 1 [
    (validate.rules).int64 = {gt: 0}
  ];
  repeated OrderItem items = 2 [
    (validate.rules).repeated = {min_items: 1}
  ];
}

message OrderCreateResponse {
  int64 orderId = 1;
}

// OrderInfo

message OrderInfoRequest {
  int64 orderId = 1 [(validate.rules).int64 = {gt: 0}];
}

message OrderInfoResponse {
  string status = 1;
  int64 user_id = 2;
  repeated OrderItem items = 3;
}

enum OrderStatus {
  ORDER_STATUS_UNSPECIFIED = 0;
  ORDER_STATUS_NEW = 1;
  ORDER_STATUS_AWAITING_PAYMENT = 2;
  ORDER_STATUS_FAILED = 3;
  ORDER_STATUS_PAYED = 4;
  ORDER_STATUS_CANCELLED = 5;
}

// OrderPay

message OrderPayRequest {
  int64 order_id = 1 [(validate.rules).int64 = {gt: 0}];
}

// OrderCancel

message OrderCancelRequest {
  int64 order_id = 1 [(validate.rules).int64 = {gt: 0}];
}

// StocksInfo

message StocksInfoRequest {
  int64 sku = 1 [(validate.rules).int64 = {gt: 0}];
}

message StocksInfoResponse {
  uint32 count = 1;
}
