package meta;

//========================================================================
//
// Metadata
//
//========================================================================

message Data {
	required uint64 Term = 1;
	required uint64 Index = 2;
	required uint64 ClusterID = 3;

	repeated NodeInfo Nodes = 4;
	repeated DatabaseInfo Databases = 5;
	repeated UserInfo Users = 6;

	required uint64 MaxNodeID = 7;
	required uint64 MaxShardGroupID = 8;
	required uint64 MaxShardID = 9;

	// added for 0.10.0
	repeated NodeInfo DataNodes = 10;
	repeated NodeInfo MetaNodes = 11;
}

message NodeInfo {
	required uint64 ID = 1;
	required string Host = 2;
	optional string TCPHost = 3;
}

message DatabaseInfo {
	required string Name = 1;
	required string DefaultRetentionPolicy = 2;
	repeated RetentionPolicyInfo RetentionPolicies = 3;
	repeated ContinuousQueryInfo ContinuousQueries = 4;
}

message RetentionPolicySpec {
	optional string Name               = 1;
	optional int64  Duration           = 2;
	optional int64  ShardGroupDuration = 3;
	optional uint32 ReplicaN           = 4;
}

message RetentionPolicyInfo {
	required string Name = 1;
	required int64 Duration = 2;
	required int64 ShardGroupDuration = 3;
	required uint32 ReplicaN = 4;
	repeated ShardGroupInfo ShardGroups = 5;
	repeated SubscriptionInfo Subscriptions = 6;
}

message ShardGroupInfo {
	required uint64 ID = 1;
	required int64 StartTime = 2;
	required int64 EndTime = 3;
	required int64 DeletedAt = 4;
	repeated ShardInfo Shards = 5;
	optional int64 TruncatedAt = 6;
}

message ShardInfo {
	required uint64 ID = 1;
	repeated uint64 OwnerIDs = 2 [deprecated=true];
	repeated ShardOwner Owners = 3;
}

message SubscriptionInfo{
	required string Name = 1;
	required string Mode = 2;
	repeated string Destinations = 3;
}

message ShardOwner {
	required uint64 NodeID = 1;
}

message ContinuousQueryInfo {
	required string Name = 1;
	required string Query = 2;
}

message UserInfo {
	required string Name = 1;
	required string Hash = 2;
	required bool Admin = 3;
	repeated UserPrivilege Privileges = 4;
}

message UserPrivilege {
	required string Database = 1;
	required int32 Privilege = 2;
}


//========================================================================
//
// COMMANDS
//
//========================================================================

message Command {
	extensions 100 to max;

	enum Type {
		CreateNodeCommand                = 1;
		DeleteNodeCommand                = 2;
		CreateDatabaseCommand            = 3;
		DropDatabaseCommand              = 4;
		CreateRetentionPolicyCommand     = 5;
		DropRetentionPolicyCommand       = 6;
		SetDefaultRetentionPolicyCommand = 7;
		UpdateRetentionPolicyCommand     = 8;
		CreateShardGroupCommand          = 9;
		DeleteShardGroupCommand          = 10;
		CreateContinuousQueryCommand     = 11;
		DropContinuousQueryCommand       = 12;
		CreateUserCommand                = 13;
		DropUserCommand                  = 14;
		UpdateUserCommand                = 15;
		SetPrivilegeCommand              = 16;
		SetDataCommand                   = 17;
		SetAdminPrivilegeCommand         = 18;
		UpdateNodeCommand                = 19;
		CreateSubscriptionCommand        = 21;
		DropSubscriptionCommand          = 22;
		RemovePeerCommand                = 23;
		CreateMetaNodeCommand            = 24;
		CreateDataNodeCommand            = 25;
		UpdateDataNodeCommand            = 26;
		DeleteMetaNodeCommand            = 27;
		DeleteDataNodeCommand            = 28;
		SetMetaNodeCommand               = 29;
		DropShardCommand                 = 30;
	}

	required Type type = 1;
}

// This isn't used in >= 0.10.0. Kept around for upgrade purposes. Instead
// look at CreateDataNodeCommand and CreateMetaNodeCommand
message CreateNodeCommand {
	extend Command {
		optional CreateNodeCommand command = 101;
	}
	required string Host = 1;
	required uint64 Rand = 2;
}

message DeleteNodeCommand {
	extend Command {
		optional DeleteNodeCommand command = 102;
	}
	required uint64 ID = 1;
	required bool Force = 2;
}

message CreateDatabaseCommand {
	extend Command {
		optional CreateDatabaseCommand command = 103;
	}
	required string Name = 1;
	optional RetentionPolicyInfo RetentionPolicy = 2;
}

message DropDatabaseCommand {
	extend Command {
		optional DropDatabaseCommand command = 104;
	}
	required string Name = 1;
}

message CreateRetentionPolicyCommand {
	extend Command {
		optional CreateRetentionPolicyCommand command = 105;
	}
	required string Database = 1;
	required RetentionPolicyInfo RetentionPolicy = 2;
}

message DropRetentionPolicyCommand {
	extend Command {
		optional DropRetentionPolicyCommand command = 106;
	}
	required string Database = 1;
	required string Name = 2;
}

message SetDefaultRetentionPolicyCommand {
	extend Command {
		optional SetDefaultRetentionPolicyCommand command = 107;
	}
	required string Database = 1;
	required string Name = 2;
}

message UpdateRetentionPolicyCommand {
	extend Command {
		optional UpdateRetentionPolicyCommand command = 108;
	}
	required string Database = 1;
	required string Name = 2;
	optional string NewName = 3;
	optional int64 Duration = 4;
	optional uint32 ReplicaN = 5;
}

message CreateShardGroupCommand {
	extend Command {
		optional CreateShardGroupCommand command = 109;
	}
	required string Database = 1;
	required string Policy = 2;
	required int64 Timestamp = 3;
}

message DeleteShardGroupCommand {
	extend Command {
		optional DeleteShardGroupCommand command = 110;
	}
	required string Database = 1;
	required string Policy = 2;
	required uint64 ShardGroupID = 3;
}

message CreateContinuousQueryCommand {
	extend Command {
		optional CreateContinuousQueryCommand command = 111;
	}
	required string Database = 1;
	required string Name = 2;
	required string Query = 3;
}

message DropContinuousQueryCommand {
	extend Command {
		optional DropContinuousQueryCommand command = 112;
	}
	required string Database = 1;
	required string Name = 2;
}

message CreateUserCommand {
	extend Command {
		optional CreateUserCommand command = 113;
	}
	required string Name = 1;
	required string Hash = 2;
	required bool Admin = 3;
}

message DropUserCommand {
	extend Command {
		optional DropUserCommand command = 114;
	}
	required string Name = 1;
}

message UpdateUserCommand {
	extend Command {
		optional UpdateUserCommand command = 115;
	}
	required string Name = 1;
	required string Hash = 2;
}

message SetPrivilegeCommand {
	extend Command {
		optional SetPrivilegeCommand command = 116;
	}
	required string Username = 1;
	required string Database = 2;
	required int32 Privilege = 3;
}

message SetDataCommand {
	extend Command {
		optional SetDataCommand command = 117;
	}
	required Data Data = 1;
}

message SetAdminPrivilegeCommand {
	extend Command {
		optional SetAdminPrivilegeCommand command = 118;
	}
	required string Username = 1;
	required bool Admin = 2;
}

message UpdateNodeCommand {
	extend Command {
		optional UpdateNodeCommand command = 119;
	}
	required uint64 ID = 1;
	required string Host = 2;
}

message CreateSubscriptionCommand {
	extend Command {
		optional CreateSubscriptionCommand command = 121;
	}
	required string Name = 1;
	required string Database = 2;
	required string RetentionPolicy = 3;
	required string Mode = 4;
	repeated string Destinations = 5;

}

message DropSubscriptionCommand {
	extend Command {
		optional DropSubscriptionCommand command = 122;
	}
	required string Name = 1;
	required string Database = 2;
	required string RetentionPolicy = 3;
}

message RemovePeerCommand {
	extend Command {
		optional RemovePeerCommand command = 123;
	}
	optional uint64 ID = 1;
	required string Addr = 2;
}

message CreateMetaNodeCommand {
	extend Command {
		optional CreateMetaNodeCommand command = 124;
	}
	required string HTTPAddr = 1;
	required string TCPAddr = 2;
	required uint64 Rand = 3;
}

message CreateDataNodeCommand {
	extend Command {
		optional CreateDataNodeCommand command = 125;
	}
	required string HTTPAddr = 1;
	required string TCPAddr = 2;
}

message UpdateDataNodeCommand {
	extend Command {
		optional UpdateDataNodeCommand command = 126;
	}
	required uint64 ID = 1;
	required string Host = 2;
	required string TCPHost = 3;
}

message DeleteMetaNodeCommand {
	extend Command {
		optional DeleteMetaNodeCommand command = 127;
	}
	required uint64 ID = 1;
}

message DeleteDataNodeCommand {
	extend Command {
		optional DeleteDataNodeCommand command = 128;
	}
	required uint64 ID = 1;
}

message Response {
	required bool OK = 1;
	optional string Error = 2;
	optional uint64 Index = 3;
}

// SetMetaNodeCommand is for the initial metanode in a cluster or
// if the single host restarts and its hostname changes, this will update it
message SetMetaNodeCommand {
	extend Command {
		optional SetMetaNodeCommand command = 129;
	}
	required string HTTPAddr = 1;
	required string TCPAddr = 2;
	required uint64 Rand = 3;
}

message DropShardCommand {
	extend Command {
		optional DropShardCommand command = 130;
	}
	required uint64 ID = 1;
}
