import "dota_client_enums.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ETournamentEvent {
	k_ETournamentEvent_None = 0;
	k_ETournamentEvent_TournamentCreated = 1;
	k_ETournamentEvent_TournamentsMerged = 2;
	k_ETournamentEvent_GameOutcome = 3;
	k_ETournamentEvent_TeamGivenBye = 4;
	k_ETournamentEvent_TournamentCanceledByAdmin = 5;
	k_ETournamentEvent_TeamAbandoned = 6;
	k_ETournamentEvent_ScheduledGameStarted = 7;
	k_ETournamentEvent_Canceled = 8;
	k_ETournamentEvent_TeamParticipationTimedOut_EntryFeeRefund = 9;
	k_ETournamentEvent_TeamParticipationTimedOut_EntryFeeForfeit = 10;
	k_ETournamentEvent_TeamParticipationTimedOut_GrantedVictory = 11;
}

message CMsgDOTATournamentInfo {
	message PhaseGroup {
		optional uint32 group_id = 1;
		optional string group_name = 2;
	}

	message Phase {
		optional uint32 phase_id = 1;
		optional string phase_name = 2;
		optional uint32 type_id = 3;
		optional uint32 iterations = 4;
		optional uint32 min_start_time = 5;
		optional uint32 max_start_time = 6;
		repeated .CMsgDOTATournamentInfo.PhaseGroup group_list = 7;
	}

	message Team {
		optional uint32 team_id = 1;
		optional string name = 2;
		optional string tag = 3;
		optional uint64 team_logo = 4;
		optional bool eliminated = 5;
	}

	message UpcomingMatch {
		optional uint32 series_id = 1;
		optional uint32 team1_id = 2;
		optional uint32 team2_id = 3;
		optional uint32 bo = 4;
		optional string stage_name = 5;
		optional uint32 start_time = 6;
		optional string winner_stage = 7;
		optional string loser_stage = 8;
		optional string team1_tag = 9;
		optional string team2_tag = 10;
		optional string team1_prev_opponent_tag = 11;
		optional string team2_prev_opponent_tag = 12;
		optional uint64 team1_logo = 13;
		optional uint64 team2_logo = 14;
		optional uint64 team1_prev_opponent_logo = 15;
		optional uint64 team2_prev_opponent_logo = 16;
		optional uint32 team1_prev_opponent_id = 17;
		optional uint32 team2_prev_opponent_id = 18;
		optional uint32 team1_prev_match_score = 19;
		optional uint32 team1_prev_match_opponent_score = 20;
		optional uint32 team2_prev_match_score = 21;
		optional uint32 team2_prev_match_opponent_score = 22;
		optional uint32 phase_type = 23;
		optional uint32 team1_score = 24;
		optional uint32 team2_score = 25;
		optional uint32 phase_id = 26;
	}

	message News {
		optional string link = 1;
		optional string title = 2;
		optional string image = 3;
		optional uint32 timestamp = 4;
	}

	optional uint32 league_id = 1;
	repeated .CMsgDOTATournamentInfo.Phase phase_list = 2;
	repeated .CMsgDOTATournamentInfo.Team teams_list = 3;
	repeated .CMsgDOTATournamentInfo.UpcomingMatch upcoming_matches_list = 4;
	repeated .CMsgDOTATournamentInfo.News news_list = 5;
}

message CMsgRequestWeekendTourneySchedule {
}

message CMsgWeekendTourneySchedule {
	message Division {
		optional uint32 division_code = 1;
		optional uint32 time_window_open = 2;
		optional uint32 time_window_close = 3;
		optional uint32 time_window_open_next = 4;
		optional uint32 trophy_id = 5;
		optional bool free_weekend = 6;
	}

	repeated .CMsgWeekendTourneySchedule.Division divisions = 1;
}

message CMsgWeekendTourneyOpts {
	optional bool participating = 1;
	optional uint32 division_id = 2;
	optional uint32 buyin = 3;
	optional uint32 skill_level = 4;
	optional uint32 match_groups = 5;
	optional uint32 team_id = 6;
	optional string pickup_team_name = 7;
	optional uint64 pickup_team_logo = 8;
}

message CMsgWeekendTourneyLeave {
}

message CMsgDOTATournament {
	message Team {
		optional fixed64 team_gid = 1;
		optional uint32 node_or_state = 2;
		repeated uint32 players = 3 [packed = true];
		repeated uint32 player_buyin = 9 [packed = true];
		repeated uint32 player_skill_level = 10 [packed = true];
		optional uint32 match_group_mask = 12;
		optional uint32 team_id = 4;
		optional string team_name = 5;
		optional uint64 team_base_logo = 7;
		optional uint64 team_ui_logo = 8;
	}

	message Game {
		optional uint32 node_idx = 1;
		optional fixed64 lobby_id = 2;
		optional uint64 match_id = 3;
		optional bool team_a_good = 4;
		optional .ETournamentGameState state = 5 [default = k_ETournamentGameState_Unknown];
		optional uint32 start_time = 6;
	}

	message Node {
		optional uint32 node_id = 1;
		optional uint32 team_idx_a = 2;
		optional uint32 team_idx_b = 3;
		optional .ETournamentNodeState node_state = 4 [default = k_ETournamentNodeState_Unknown];
	}

	optional uint32 tournament_id = 1;
	optional uint32 division_id = 2;
	optional uint32 schedule_time = 3;
	optional uint32 skill_level = 4;
	optional .ETournamentTemplate tournament_template = 5 [default = k_ETournamentTemplate_None];
	optional .ETournamentState state = 6 [default = k_ETournamentState_Unknown];
	optional uint32 state_seq_num = 10;
	optional uint32 season_trophy_id = 11;
	repeated .CMsgDOTATournament.Team teams = 7;
	repeated .CMsgDOTATournament.Game games = 8;
	repeated .CMsgDOTATournament.Node nodes = 9;
}

message CMsgDOTATournamentStateChange {
	message GameChange {
		optional uint64 match_id = 1;
		optional .ETournamentGameState new_state = 2 [default = k_ETournamentGameState_Unknown];
	}

	message TeamChange {
		optional uint64 team_gid = 1;
		optional uint32 new_node_or_state = 2;
		optional uint32 old_node_or_state = 3;
	}

	optional uint32 new_tournament_id = 1;
	optional .ETournamentEvent event = 2 [default = k_ETournamentEvent_None];
	optional .ETournamentState new_tournament_state = 3 [default = k_ETournamentState_Unknown];
	repeated .CMsgDOTATournamentStateChange.GameChange game_changes = 4;
	repeated .CMsgDOTATournamentStateChange.TeamChange team_changes = 5;
	repeated uint32 merged_tournament_ids = 6 [packed = true];
	optional uint32 state_seq_num = 7;
}

message CMsgDOTATournamentRequest {
	optional uint32 tournament_id = 1;
	optional uint64 client_tournament_gid = 2;
}

message CMsgDOTATournamentResponse {
	optional uint32 result = 1 [default = 2];
	optional .CMsgDOTATournament tournament = 2;
}

message CMsgDOTAClearTournamentGame {
	optional uint32 tournament_id = 1;
	optional uint32 game_id = 2;
}

message CMsgDOTAWeekendTourneyPlayerSkillLevelStats {
	optional uint32 skill_level = 1;
	optional uint32 times_won_0 = 2;
	optional uint32 times_won_1 = 3;
	optional uint32 times_won_2 = 4;
	optional uint32 times_won_3 = 5;
	optional uint32 times_bye_and_lost = 6;
	optional uint32 times_bye_and_won = 7;
	optional uint32 times_unusual_champ = 10;
	optional uint32 total_games_won = 8;
	optional uint32 score = 9;
}

message CMsgDOTAWeekendTourneyPlayerStats {
	optional uint32 account_id = 1;
	optional uint32 season_trophy_id = 2;
	repeated .CMsgDOTAWeekendTourneyPlayerSkillLevelStats skill_levels = 3;
	optional uint32 current_tier = 4;
}

message CMsgDOTAWeekendTourneyPlayerStatsRequest {
	optional uint32 account_id = 1;
	optional uint32 season_trophy_id = 2;
}

message CMsgDOTAWeekendTourneyPlayerHistoryRequest {
	optional uint32 account_id = 1;
	optional uint32 season_trophy_id = 2;
}

message CMsgDOTAWeekendTourneyPlayerHistory {
	message Tournament {
		optional uint32 tournament_id = 1;
		optional uint32 start_time = 2;
		optional uint32 tournament_tier = 3;
		optional uint32 team_id = 4;
		optional uint32 team_date = 5;
		optional uint32 team_result = 6;
		repeated uint32 account_id = 7;
		optional string team_name = 8;
		optional uint32 season_trophy_id = 9;
	}

	optional uint32 account_id = 1;
	repeated .CMsgDOTAWeekendTourneyPlayerHistory.Tournament tournaments = 3;
}

message CMsgDOTAWeekendTourneyParticipationDetails {
	message Tier {
		optional uint32 tier = 1;
		optional uint32 players = 2;
		optional uint32 teams = 3;
		optional uint32 winning_teams = 4;
		optional uint32 players_streak_2 = 5;
		optional uint32 players_streak_3 = 6;
		optional uint32 players_streak_4 = 7;
		optional uint32 players_streak_5 = 8;
	}

	message Division {
		optional uint32 division_id = 1;
		optional uint32 schedule_time = 2;
		repeated .CMsgDOTAWeekendTourneyParticipationDetails.Tier tiers = 3;
	}

	repeated .CMsgDOTAWeekendTourneyParticipationDetails.Division divisions = 1;
}
