/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

$(function() {
    doLocale();
    renderPieChartSinceLastMinuteData();
    renderPieChartSinceLastHourData();
    renderPieChartSinceLastWeekData();
    renderJobTypePieChart();
    renderJobExecutionTypePieChart();
    renderStaticsJobsLineChart();
    renderRunningJobsAndTasksLineChart();
    renderRegisteredJobs();
});

function doLocale() {
    if ($("#content-right").hasClass("lang-en")) {
        i18n("en");
    } else {
        i18n("zh");
    }
    renderPieChartSinceLastMinuteData();
    renderPieChartSinceLastHourData();
    renderPieChartSinceLastWeekData();
    renderJobTypePieChart();
    renderJobExecutionTypePieChart();
    renderStaticsJobsLineChart();
    renderRunningJobsAndTasksLineChart();
    renderRegisteredJobs();
}

function renderPieChartSinceLastMinuteData() {
    $.ajax({
        url: "/api/job/statistics/tasks/results/lastMinute",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#total-jobs-lastMinute";
                var color = ["rgb(144,237,125)","red"];
                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
                renderPieChart(chartName, $.i18n.prop("job-info-for-one-minute"), color, jobResult);
            }
        }
    });
}

function renderPieChartSinceLastHourData() {
    $.ajax({
        url: "/api/job/statistics/tasks/results/lastHour",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#total-jobs-lastHour";
                var color = ["rgb(144,237,125)", "red"];
                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
                renderPieChart(chartName, $.i18n.prop("job-info-for-one-hour"), color, jobResult);
            }
        }
    });
}

function renderPieChartSinceLastWeekData() {
    $.ajax({
        url: "/api/job/statistics/tasks/results/lastWeek",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#total-jobs-weekly";
                var color = ["rgb(144,237,125)", "red"];
                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
                renderPieChart(chartName, $.i18n.prop("job-info-for-one-week"), color, jobResult);
            }
        }
    });
}

function renderJobTypePieChart() {
    $.ajax({
        url: "/api/job/statistics/jobs/type",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#job-type";
                var color = ["rgb(144, 237, 125)", "rgb(247, 163, 92)", "rgb(67, 67, 72)"];
                var jobResult = [["DATAFLOW", jobData.dataflowJobCount], ["SIMPLE", jobData.simpleJobCount], ["SCRIPT", jobData.scriptJobCount]];
                renderPieChart(chartName, $.i18n.prop("job-type"), color, jobResult);
            }
        }
    });
}

function renderJobExecutionTypePieChart() {
    $.ajax({
        url: "/api/job/statistics/jobs/executionType",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#job-execution-type";
                var color = ["rgb(144, 237, 125)", "rgb(124, 181, 236)"];
                var jobResult = [["TRANSIENT", jobData.transientJobCount], ["DAEMON", jobData.daemonJobCount]];
                renderPieChart(chartName, $.i18n.prop("job-execution-type"), color, jobResult);
            }
        }
    });
}

function renderStaticsJobsLineChart() {
    $.ajax({
        url: "/api/job/statistics/tasks/results?since=last24hours",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#statictis_jobs";
                var successData = [];
                var failData = [];
                for(var i = 0; i < jobData.length; i++) {
                    var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000*60*60*8;
                    successData.push([dateTime, jobData[i].successCount]);
                    failData.push([dateTime, jobData[i].failedCount]);
                }
                var resultData = [{type: "spline", name: $.i18n.prop("job-success-count"), data: successData}, {type: "spline", name: $.i18n.prop("job-failure-count"), data: failData}];
                renderLineChart(chartName, $.i18n.prop("dashboard-succ-and-fail-count"), resultData);
            }
        }
    });
}

function renderRunningJobsAndTasksLineChart() {
    $.ajax({
        url: "/api/job/statistics/jobs/running?since=lastWeek",
        dataType: "json",
        success: function(jobData) {
            $.ajax({
                url: "/api/job/statistics/tasks/running?since=lastWeek",
                dataType: "json",
                success: function(taskData) {
                    if(null !== taskData) {
                        var chartName = "#run-jobs";
                        var jobRunningData = [];
                        var taskRunningData = [];
                        for(var i = 0; i < jobData.length; i++) {
                            var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
                            jobRunningData.push([dateTime, jobData[i].runningCount]);
                        }
                        for(var i = 0; i < taskData.length; i++) {
                            var dateTime = new Date(taskData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
                            taskRunningData.push([dateTime, taskData[i].runningCount]);
                        }
                        var resultData = [{type: "spline", name: $.i18n.prop("task-running-count"), data: taskRunningData}, {type: "spline", name: $.i18n.prop("task-running-count"), data: jobRunningData}];
                        renderLineChart(chartName, $.i18n.prop("dashboard-job-task-running-count"), resultData);
                    }
                }
            });
        }
    });
}

function renderRegisteredJobs() {
    $.ajax({
        url: "/api/job/statistics/jobs/register",
        dataType: "json",
        success: function(jobData) {
            if(null !== jobData) {
                var chartName = "#regist-jobs";
                var registerData = [];
                for(var i = 0; i < jobData.length; i++) {
                    var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
                    registerData.push([dateTime, jobData[i].registeredCount]);
                }
                var resultData = [{ type: "spline", name: $.i18n.prop("dashboard-current-jobs-count"), data: registerData}];
                renderLineChart(chartName, $.i18n.prop("dashboard-current-jobs-count"), resultData);
            }
        }
    });
}

function renderPieChart(chartName, title, color, jobData) {
    $(chartName).highcharts({
        chart: {
            backgroundColor: "rgba(255, 255, 255, 0)"
        },
        title: {
            text: title
        },
        plotOptions: {
            pie: {
                size: "60%",
                allowPointSelect: true,
                cursor: "pointer",
                dataLabels: {
                    enabled: true,
                    format: "<b>{point.name}</b>:<br> {point.percentage:.1f} % ",
                    distance: 5
                }
            }
        },
        colors: color,
        series: [{
            type: "pie",
            name: $.i18n.prop("sidebar-job"),
            data: jobData
        }],
        credits: {
            enabled: false
        }
    });
}

function renderLineChart(chartName, title, jobData) {
    Highcharts.setOptions({
        lang: {
            resetZoom: $.i18n.prop("operation-reset"),
            resetZoomTitle: $.i18n.prop("operation-reset-scaling")
        }
    });
    $(chartName).highcharts({
        chart: {
            zoomType: "x",
            resetZoomButton: {
                position: {
                    align: "right",
                    verticalAlign: "top",
                    x: 0,
                    y: -50
                }
            },
            backgroundColor: "rgba(255, 255, 255, 0)"
        },
        credits: {
            enabled: false
        },
        title: {
            text: title
        },
        subtitle: {
            text: document.ontouchstart === undefined ? $.i18n.prop("highchart-tooltip-info1") : $.i18n.prop("highchart-tooltip-info2")
        },
        tooltip: {
            shared: true,
            crosshairs: true,
            dateTimeLabelFormats: {
                millisecond: "%H:%M:%S.%L",
                second: "%Y-%m-%d %H:%M:%S",
                minute: "%Y-%m-%d %H:%M",
                hour: "%Y-%m-%d %H:%M",
                day: "%Y-%m-%d",
                week: "%m-%d",
                month: "%Y-%m",
                year: "%Y"
            }
        },
        xAxis: {
            type: "datetime",
            dateTimeLabelFormats: {
                millisecond: "%H:%M:%S.%L",
                second: "%H:%M:%S",
                minute: "%H:%M",
                hour: "%H:%M",
                day: "%m-%d",
                week: "%m-%d",
                month: "%Y-%m",
                year: "%Y"
            } 
        },
        yAxis: {
            title: {
                text: ""
            },
            labels: {
                align: "left",
                x: -10,
                y: 0
            }
        },
        series: jobData
    });
}
