syntax = "proto3";

package types;

// vote 合约交易行为总类型
message VoteAction {
    int32 ty = 1;
    oneof value {
        CreateGroup  createGroup  = 2; //创建投票组
        UpdateMember updateMember = 3; //更新组成员
        CreateVote   createVote   = 4; //创建一个投票
        CommitVote   commitVote   = 5; //组员提交投票
    }
}

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

//创建投票组
message CreateGroup {
    string   name                = 1; //投票组名称
    repeated string admins       = 2; //管理员地址列表
    repeated GroupMember members = 3; //组员
}

//更新投票组
message UpdateMember {
    string   groupID                  = 1; //投票组ID
    repeated GroupMember addMembers   = 2; //需要增加的组成员
    repeated string removeMemberAddrs = 3; //删除组成员的地址列表
}

// 投票组信息
message GroupInfo {

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

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

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

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

//投票信息
message VoteInfo {

    string   ID                        = 1; //投票ID
    string   name                      = 2; //投票名称
    string   creator                   = 3; //投票创建者
    repeated string voteGroups         = 4; //投票关联的投票组
    repeated VoteOption voteOptions    = 5; //投票的选项
    int64               beginTimestamp = 6; //投票开始时间戳
    int64               endTimestamp   = 7; //投票结束时间戳
    repeated string votedMembers       = 8; //已投票的成员
}

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

message GroupVoteInfo {

    GroupInfo groupInfo     = 1; // 投票组信息
    repeated string voteIDs = 2; //投票组关联的投票ID信息
}

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

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

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

//列表请求结构
message ReqListItem {
    string startItemID = 1; //列表开始的ID，如请求组列表即groupID，不包含在结果中
    int32  count       = 2; //请求列表项数量
    int32  direction   = 3; // 0表示根据ID降序，1表示升序
}
