syntax = "proto3";

package ranking_service;
option go_package = "./ranking";

message Request {
  string ping = 1;
}

message Response {
  string pong = 1;
}

// 定义SetUserGameScoreRequest消息类型
message SetUserGameScoreRequest {
  uint32 score = 1;   // 对应json的"score"
  uint32 type = 2;    // 对应json的"type", 带默认值0
  uint64 userId = 3;  // 用户id
  uint32 appId = 4;   // 小程序id
}

// 定义RankingData消息类型
message RankingList {
  string nickname = 1;    // 昵称,对应db:"nickname"
  string avatar = 2;      // 头像,对应db:"avatar"
  uint32 score = 3;       // 得分,对应db:"score"
  uint64 user_id = 4;     // 用户ID,对应db:"app_user_id"
  uint32 rank = 5;        // 排名,对应db:"rank"
  bool self = 6;          // 是否自我判断
}

message GetRankingListResponse {
  repeated RankingList rankingData = 1;
}

message  GetRankingListRequest {
  uint32 appId = 1;
  uint32 type = 2;
  uint64 userId = 3;
}

// 定义Base响应结构
message BaseResult {
  int32 error_code = 1;   // 错误码
  string error_msg = 2;    // 错误信息
}

message AddUserGameScoreRequest{
  uint32 type = 1;
  uint32 appId = 2;
  uint64 userId = 3;
  uint32 score = 4;
}

message RemoveRankingRequest{
  uint32 appId = 1;
  uint32 type = 2;
}

message AtomicGetHigherUserRequest{
  uint32 appId = 1;
  uint32 score = 2;
  uint32 type = 3;
  uint64 userId = 4;
}

message SettlementResponse{
  RankingList higher = 1;
  uint32 mineMax = 2;
  RankingList mine = 3;
}



service ranking_service {
  rpc Ping(Request) returns(Response);

  rpc SetUserGameScore (SetUserGameScoreRequest) returns (BaseResult);

  rpc GetRankingList (GetRankingListRequest) returns (GetRankingListResponse);

  rpc AddUserGameScore(AddUserGameScoreRequest) returns(BaseResult);

  rpc RemoveRanking(RemoveRankingRequest) returns(BaseResult);

  rpc AtomicGetHigherUser(AtomicGetHigherUserRequest) returns(RankingList);

  rpc Settlement(AtomicGetHigherUserRequest) returns(SettlementResponse);
}