let grandprix_blocks;
let races;

function positionToScore(i) {
    switch(i) {
        case 0:
            return 4;
        case 1:
            return 2;
        case 2:
            return 1;
        default:
            return 0;
    }
}

function supertuxkartScoreUpdate() {
    d3.json("/dynamic/supertuxkartscore.json").then((data) => {
        grandprix_blocks = d3.select('#supertuxkart-results')
            .selectAll('div.grandprix-div')
            .data(data)
            .join(
                (enter) => {
                    const e = enter.append('div')
                        .classed('grandprix-div', true);
                    e.append('h3')
                        .text((d, i) => 'Grand prix ' + (i+1));
                    e.append('div').classed('races', true);
                    return e;
                },
                (update) => {
                    update.select('h3')
                        .text((d, i) => 'Grand prix ' + (i+1));
                    return update;
                },
                (exit) => {
                    exit.remove();
                }
            );

        races = grandprix_blocks.select('div.races')
            .selectAll('table')
            .data((d) => {
                return d.races.map((x) => {
                    x["total"] = d.total_races;
                    return x;
                });
            })
            .join(
                (enter) => {
                    const table = enter.append('table')
                        .classed('table', true);
                    let thead = table.append('thead');
                    thead.append('tr')
                        .append('th')
                        .attr('colspan', 4)
                        .text((d, i) => {
                            return "Race " + (i+1) + " out of " + d.total + " on " + d.track;
                        });
                    let headerrows = thead.append('tr');
                    ["Rank", "Name", "Time", "Points"].forEach((col) => {
                        headerrows.append('th').text(col);
                    });
                    table.append('tbody')
                        .classed('grandprix-tbody', true);
                    return table;
                },
                (update) => {
                    const u = update;
                    update.select('th[colspan="4"]')
                        .text((d, i) => {
                            return "Race " + (i+1) + " out of " + d.total + " on " + d.track;
                        });
                    return u;
                },
                (exit) => {
                    exit.remove();
                }
            );

        let tbodies = races.select('tbody.grandprix-tbody')
            .selectAll('tr')
            .data((d) => d.players)
            .join(
                (enter) => {
                    let e = enter.append('tr');
                    e.append('td')
                        .text((d,i) => (i+1) + '.');
                    e.append('td')
                        .text((d,i) => d.name);
                    e.append('td')
                        .text((d,i) => d.time);
                    e.append('td')
                        .text((d,i) => positionToScore(i));
                    return e;
                },
                (update) => {
                    update.select('td:nth-child(1)')
                        .text((d,i) => {console.log(d); return (i+1) + '.'});
                    update.select('td:nth-child(2)')
                        .text((d,i) => d.name);
                    update.select('td:nth-child(3)')
                        .text((d,i) => d.time);
                    update.select('td:nth-child(4)')
                        .text((d,i) => positionToScore(i));
                    return update;
                },
                (exit) => exit.remove()
            )
    });
}
