function barChart(id, data, labels, tooltip, title, scale_label_x, scale_label_y) {
    const canvas = document.getElementById('bar_chart'+id)
    const ctx = canvas.getContext("2d");

    data = data.map((item) => DecimalPrecision.round(item, 2));
    
    // Gradient 
    var gradient = ctx.createLinearGradient(0, 0, 0, 500);
        gradient.addColorStop(0, '#f4a260');
        gradient.addColorStop(1, '#2ec4b6');

    // Data
    var displayData = {
        labels: labels,
        datasets: [
            {
                label: tooltip,
                data: data,
                backgroundColor: gradient,
            }
        ]
    };

    // Options
    var options = {
        responsive: true,
        
        scales: {
            x: {
                display: true,
                text: scale_label_x,
            },
            y: {
                display: true,
                text: scale_label_y,
                beginAtZero: true
            }
        },

        plugins: {
            title: {
                display: true,
                text: title,
                font: {
                    size: 20,
                }
            }  
        },

    };
    
    var config = {
        type: 'bar',
        data: displayData,
        options: options
    };

    new Chart(ctx, config);
}

function barLineChart(id, data, labels, tooltip, title, scale_label_x, scale_label_y) {
    const canvas = document.getElementById('bar_line_chart'+id)
    const ctx = canvas.getContext("2d");

    // Gradient 
    const gradient = ctx.createLinearGradient(0, 0, 0, 500);
        gradient.addColorStop(0, '#f4a260');
        gradient.addColorStop(1, '#2ec4b6');

    const sum = data.reduce((partialSum, a) => partialSum + a, 0);
    const percentage = data.map((item) => DecimalPrecision.round(item/sum*100, 2));
    var percentageTick = 100;
    var percentageTickSize = 20;
    
    // Data
    const displayData = {
        labels: labels,
        datasets: [
            {
                label: "Percentage",
                data: percentage,
                borderColor: '#E0E1DD',
                backgroundColor: '#2ec4b6',
                yAxisID: 'y1',
                type: 'line',
            },
            {
                label: tooltip,
                data: data,
                backgroundColor: gradient,
                yAxisID: 'y',
            },
            
        ]
    };

    // Options
    const options = {
        responsive: true,
        
        scales: {
            x: {
                display: true,
                text: scale_label_x,
            },
            y: {
                display: true,
                text: scale_label_y,
                beginAtZero: true,
                max: Math.max.apply(null, data) + 1,
            },

            y1: {
                display: true,
                position: 'right',
                beginAtZero: true,
                max: percentageTick,
                ticks: {
                    stepSize: percentageTickSize,
                },
            },
        },

        plugins: {
            title: {
                display: true,
                text: title,
                font: {
                    size: 20,
                }
            }  
        },

    };
    
    const config = {
        type: 'bar',
        data: displayData,
        options: options
    };

    let barlinechart = new Chart(ctx, config);
    
    // Actions
    const actions = [
        {
            name: "Toggle Tick",
            handler(chart) {
                if (percentageTick == 100 ) {
                    percentageTick = Math.trunc(Math.max.apply(null, percentage) + 1);
                    percentageTickSize = Math.trunc(percentageTick / 5);
                }
                else {
                    percentageTick = 100;
                    percentageTickSize = 20;
                }
                barlinechart.options.scales.y1.max = percentageTick;
                barlinechart.options.scales.y1.ticks.stepSize = percentageTickSize;
                chart.update();
            }
        }
    ];

    actions.forEach((a, i) => {
        let button = document.createElement("button");
        button.id = "button"+i;
        button.innerText = a.name;
        button.onclick = () => a.handler(barlinechart);
        document.querySelector(".button_row").appendChild(button);
    });
}

function pieChart(id, data, labels, tooltip, title, scale_label_x, scale_label_y) {
    const canvas = document.getElementById('pie_chart'+id)
    const ctx = canvas.getContext("2d");

    // Data
    var displayData = {
        labels: labels,
        datasets: [
            {
                label: tooltip,
                data: data,
                backgroundColor: [
                    '#f4a260',
                    '#e77f7a',
                    '#be6d8e',
                    '#856490',
                    '#4f597b',
                    '#2f4858',
                ],
            }
        ]
    };

    // Options
    var options = {
        responsive: true,
    };
    
    var config = {
        type: 'pie',
        data: displayData,
        options: options
    };

    new Chart(ctx, config);
}

function doughnutChart(id, data, labels, tooltip, title, scale_label_x, scale_label_y) {
    const canvas = document.getElementById('doughnut_chart'+id)
    const ctx = canvas.getContext("2d");

    // Data
    var displayData = {
        labels: labels,
        datasets: [
            {
                label: tooltip,
                data: data,
                backgroundColor: [
                    '#f4a260',
                    '#e77f7a',
                    '#be6d8e',
                    '#856490',
                    '#4f597b',
                    '#2f4858',
                ],
            }
        ]
    };

    // Options
    var options = {
        responsive: true,
    };
    
    var config = {
        type: 'doughnut',
        data: displayData,
        options: options
    };

    new Chart(ctx, config);
}

function polarChart(id, data, labels, tooltip, title, scale_label_x, scale_label_y) {
    const canvas = document.getElementById('polar_chart'+id)
    const ctx = canvas.getContext("2d");

    // Data
    var displayData = {
        labels: labels,
        datasets: [
            {
                label: tooltip,
                data: data,
                backgroundColor: [
                    '#f4a260',
                    '#e77f7a',
                    '#be6d8e',
                    '#856490',
                    '#4f597b',
                    '#2f4858',
                ],
            }
        ]
    };

    // Options
    var options = {
        responsive: true,

        scales: {
            x: {
                border: { display: true },
                grid: {
                    display: false,
                    drawOnChartArea: true,
                    drawTicks: false,
                },
            },
        },
    };
    
    var config = {
        type: 'polarArea',
        data: displayData,
        options: config,
    };

    new Chart(ctx, config);
}
