+ get_group('Group A', function(response_a) {
+ get_group('Group B', function(response_b) {
+ get_group('Group C', function(response_c) {
+ publish_group_rank(response_a, 'Group A');
+ publish_group_rank(response_b, 'Group B');
+ publish_group_rank(response_c, 'Group C');
+
+ let replacements = montecarlo([response_a, response_b, response_c]);
+ let team_a = parse_teams_from_spreadsheet(response_a);
+ let team_b = parse_teams_from_spreadsheet(response_b);
+ let team_c = parse_teams_from_spreadsheet(response_c);
+ fill_playoff(replacements, [team_a, team_b, team_c]);
+ });
+ });
+ });
+}
+
+function get_ranked(response, group_name) {
+ let teams = parse_teams_from_spreadsheet(response);
+ let games = parse_games_from_spreadsheet(response, group_name, false);
+ apply_games_to_teams(games, teams);
+ let tiebreakers = [];
+ teams = rank(games, teams, 1, tiebreakers);
+ return teams;
+}
+
+// Pick out everything that is at rank N _or_ avoids rank N by lack of tiebreakers only.
+function pick_out_rank(teams, rank, candidates) {
+ let lowest_rank = teams[rank - 1].rank;
+
+ let count = 0;
+ for (const team of teams) {
+ if (team.rank >= lowest_rank && team.rank <= rank) {
+ ++count;
+ }
+ }
+
+ if (count >= teams.length / 2) {
+ // We have no info yet, ignore this group.
+ return;
+ }
+
+ for (const team of teams) {
+ if (team.rank >= lowest_rank && team.rank <= rank) {
+ candidates.push(team);
+ }
+ }
+}
+
+function publish_best_thirds() {
+ get_group('Group A', function(response_a) {
+ get_group('Group B', function(response_b) {
+ get_group('Group C', function(response_c) {
+ let A = get_ranked(response_a, 'Group A');
+ let B = get_ranked(response_b, 'Group B');
+ let C = get_ranked(response_c, 'Group C');
+
+ let candidates = [];
+ pick_out_rank(A, 3, candidates);
+ pick_out_rank(B, 3, candidates);
+ pick_out_rank(C, 3, candidates);
+
+ let tiebreakers = [];
+ let text = "";
+ if (candidates.length >= 2) {
+ let ranked = rank_thirds([], candidates, 1, tiebreakers);
+ text = "Best thirds: " + ranked[0].mediumname + ", " + ranked[1].mediumname + "\n" + tiebreakers.join("\n");
+ }
+ let updates = [];
+ updates.push({ "range": ultimateconfig['explain_third_cell'], "values": [ [ text ] ] });
+ let json = {
+ "valueInputOption": "USER_ENTERED",
+ "data": updates
+ };
+ possibly_update_oauth_key(function() {
+ post_json('https://sheets.googleapis.com/v4/spreadsheets/' + ultimateconfig['score_sheet_id'] + '/values:batchUpdate?key=' + ultimateconfig['api_key'], json, function(response) {}, current_oauth_access_token);
+ });
+ });
+ });
+ });