syntax = "proto3";

package types;

message Game {
    //默认是由创建这局游戏的txHash作为gameId
    string gameId = 1;
    // create 1 -> Match 2 -> Cancel 3 -> Close 4
    int32 status = 2;
    //创建时间
    int64 createTime = 3;
    //匹配时间(何时参与对赌）
    int64 matchTime = 4;
    //状态close的时间（包括cancel）
    int64 closetime = 5;
    //赌注
    int64 value = 6;
    //发起者账号地址
    string createAddress = 7;
    //对赌者账号地址
    string matchAddress = 8;
    // hash 类型，预留字段
    string hashType = 9;
    //庄家创建游戏时，庄家自己出拳结果加密后的hash值
    bytes hashValue = 10;
    //用来公布庄家出拳结果的私钥
    string secret = 11;
    // 1 平局，2 庄家获胜，3 matcher获胜，4
    // 庄家开奖超时，matcher获胜，并获得本局所有赌资
    int32 result = 12;
    // matcher 出拳结果
    int32 matcherGuess = 13;
    // create txHash
    string createTxHash = 14;
    // matche交易hash
    string matchTxHash = 15;
    // close txhash
    string closeTxHash = 16;
    // cancel txhash
    string cancelTxHash = 17;
    int64  index        = 18;
    int64  prevIndex    = 19;
    int32  creatorGuess = 20;
}

// message for execs.game
message GameAction {
    oneof value {
        GameCreate create = 1;
        GameCancel cancel = 2;
        GameClose  close  = 3;
        GameMatch  match  = 4;
    }
    int32 ty = 10;
}

message GameMatch {
    string gameId = 1;
    int32  guess  = 2;
}

message GameCancel {
    string gameId = 1;
}

message GameClose {
    string gameId = 1;
    string secret = 2;
}

message GameCreate {
    int64 value = 1;
    //加密用的算法
    string hashType = 2;
    //加密后的值
    bytes hashValue = 3;
}

// queryByAddr 和 queryByStatus共用同一个结构体
message QueryGameListByStatusAndAddr {
    //优先根据status查询,status不可为空
    int32 status = 1;
    //二级搜索，如果要查询一个地址下的所有game信息，可以根据status，分多次查询，这样规避存储数据时的臃余情况
    string address = 2;
    // 索引值
    int64 index = 3;
    //单页返回多少条记录，默认返回20条，单次最多返回100条
    int32 count = 4;
    // 0降序，1升序，默认降序
    int32 direction = 5;
}
// 统计数量
message QueryGameListCount {
    //优先根据status查询,status不可为空
    int32 status = 1;
    //二级搜索，如果要查询一个地址下的所有game信息，可以根据status，分多次查询，这样规避存储数据时的臃余情况
    string address = 2;
}
// 索引value值
message GameRecord {
    string gameId = 1;
    int64  index  = 2;
}

message QueryGameInfo {
    string gameId = 1;
}

message QueryGameInfos {
    repeated string gameIds = 1;
}

message ReplyGameList {
    repeated Game games = 1;
}

message ReplyGameListCount {
    int64 count = 1;
}

message ReplyGame {
    Game game = 1;
}

message ReceiptGame {
    string gameId = 1;
    int32  status = 2;
    //记录上一次状态
    int32  prevStatus = 3;
    string addr       = 4;
    string createAddr = 5;
    string matchAddr  = 6;
    int64  index      = 7;
    int64  prevIndex  = 8;
}
