syntax = "proto3";

package types;

// vote 合约交易行为总类型
message VoteAction {
    int32 ty = 1;
    oneof value {
        CreateGroup  createGroup  = 2; //创建投票组
        UpdateGroup  updateGroup  = 3; //更新组成员
        CreateVote   createVote   = 4; //创建一个投票
        CommitVote   commitVote   = 5; //组员提交投票
        CloseVote    closeVote    = 6; //关闭投票
        UpdateMember updateMember = 7; //更新用户信息
    }
}

message GroupMember {
    string addr       = 1; //用户地址
    uint32 voteWeight = 2; //投票权重， 不填时默认为1
    string nickName   = 3; //群昵称
}

//创建投票组
message CreateGroup {
    string   name                    = 1; //投票组名称
    repeated string admins           = 2; //管理员地址列表，创建者默认为管理员
    repeated GroupMember members     = 3; //组员
    string               description = 4; //描述
}

//更新投票组
message UpdateGroup {
    string   groupID                = 1; //投票组ID
    repeated GroupMember addMembers = 2; //需要增加的组成员
    repeated string removeMembers   = 3; //删除组成员的地址列表
    repeated string addAdmins       = 4; //增加管理员
    repeated string removeAdmins    = 5; //删除管理员
}

// 投票组信息
message GroupInfo {

    string   ID                      = 1; //投票组ID
    string   name                    = 2; //投票组名称
    uint32   memberNum               = 3; //组员数量
    string   creator                 = 4; //创建者
    repeated string admins           = 5; //管理员列表
    repeated GroupMember members     = 6; //成员列表
    string               description = 7; //描述信息
    uint32               voteNum     = 8; //投票数量
}

message GroupInfos {
    repeated GroupInfo groupList = 1; //投票组信息列表
}

//投票选项
message VoteOption {
    string option = 1; //投票选项
    uint32 score  = 2; //投票得分
}

// 创建投票交易，请求结构
message CreateVote {
    string   name                  = 1; //投票名称
    string   groupID               = 2; //投票关联组
    repeated string voteOptions    = 3; //投票选项列表
    int64           beginTimestamp = 4; //投票开始时间戳
    int64           endTimestamp   = 5; //投票结束时间戳
    string          description    = 6; //描述信息
}

// 创建提交投票交易，请求结构
message CommitVote {
    string voteID      = 1; //投票ID
    uint32 optionIndex = 2; //投票选项数组下标，下标对应投票内容
}

message CommitInfo {
    string addr       = 1; //提交地址
    string txHash     = 2; //提交交易哈希
    uint32 voteWeight = 3; //投票权重
}

message CloseVote {
    string voteID = 1; // 投票ID
}

message UpdateMember {
    string name = 1; //用户名称
}

//投票信息
message VoteInfo {

    string   ID                        = 1;  //投票ID
    string   name                      = 2;  //投票名称
    string   creator                   = 3;  //创建者
    string   groupID                   = 4;  //投票关联的投票组
    repeated VoteOption voteOptions    = 5;  //投票的选项
    int64               beginTimestamp = 6;  //投票开始时间戳
    int64               endTimestamp   = 7;  //投票结束时间戳
    repeated CommitInfo commitInfos    = 8;  //已投票的提交信息
    string              description    = 9;  //描述信息
    uint32              status         = 10; //状态，1即将开始，2正在进行，3已经结束，4已关闭
}

message VoteInfos {
    repeated VoteInfo voteList = 1; //投票信息列表
}

message MemberInfo {
    string   addr            = 1; //地址
    string   name            = 2; //用户名称
    repeated string groupIDs = 3; //所属投票组的ID列表
}

message MemberInfos {
    repeated MemberInfo memberList = 1; //投票组成员信息列表
}

message ReqStrings {
    repeated string items = 1; //请求项数组
}

//列表请求结构
message ReqListItem {
    string startItemID = 1; //列表开始的ID，如请求组列表即groupID，不包含在结果中
    int32  count       = 2; //请求列表项数量, 0表示请求所有
    int32  direction   = 3; // 0表示根据ID降序，1表示升序，目前ID和区块高度正相关
}

message ReqListVote {
    string      groupID = 1; //指定所属组ID
    ReqListItem listReq = 2; //列表请求
    uint32      status  = 3; //指定投票状态
}

message ReplyVoteList {
    repeated VoteInfo voteList         = 1; //投票列表
    int64             currentTimestamp = 2; //当前系统时间
}
