<!DOCTYPE html>
<!--
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.
-->


<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <script src="lib/canteen.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>

        <div id="main0"></div>
        <div id="record"></div>

        <script>

        var recordContainer = document.getElementById('record');
        var chart;

        testHelper.controlFrame({
            pauseAt: 1,
            onFrame: function (frameNumber) {
                testHelper.printCanvasLayerDrawOperationsOnFrame(chart, frameNumber, recordContainer);
            }
        });

        require([
            'echarts',
            './data/nutrients.json'
        ], function (echarts, rawData) {

            colorTool = echarts.color;

            const _ctx = {
                rawDataCount: {
                    text: 'rawDataCount:',
                    value: undefined,
                    values: [undefined, 10, 100, 1e3, 5e3],
                    // value: 10,
                    // values: [10, 100, 1e3, 5e3],
                },
                br0: {},
                hoverLayerThreshold: {
                    text: 'hoverLayerThreshold:',
                    value: undefined,
                    values: [undefined, 300, 1000, 0],
                },
                large: {
                    text: 'large:',
                    value: true,
                    values: [true, false],
                },
                largeThreshold: {
                    text: 'largeThreshold:',
                    value: undefined,
                    values: [undefined, 1, 1000],
                },
                progressive: {
                    text: 'progressive:',
                    value: 100,
                    values: [1e4, 100, 300, undefined, 0, 1, 1000, 1e4],
                },
                progressiveThreshold: {
                    text: 'progressiveThreshold:',
                    value: undefined,
                    values: [undefined, 1, 1000],
                },
            };

            function createOption() {

                var groupCategories = [];
                var groupColors = [];

                var largeSettingsSeries = {};
                if (_ctx.large.value != null) {
                    largeSettingsSeries.large = _ctx.large.value;
                }
                if (_ctx.largeThreshold.value != null) {
                    largeSettingsSeries.largeThreshold = _ctx.largeThreshold.value;
                }
                if (_ctx.progressive.value != null) {
                    largeSettingsSeries.progressive = _ctx.progressive.value;
                }
                if (_ctx.progressiveThreshold.value != null) {
                    largeSettingsSeries.progressiveThreshold = _ctx.progressiveThreshold.value;
                }

                var largeSettingsGlobal = {};
                if (_ctx.hoverLayerThreshold.value != null) {
                    largeSettingsSeries.hoverLayerThreshold = _ctx.hoverLayerThreshold.value;
                }

                var indices = {
                    name: 0,
                    group: 1,
                    id: 16
                };

                normalizeData(rawData);

                var schema = [
                    {name: 'name', index: 0},
                    {name: 'group', index: 1},
                    {name: 'protein', index: 2},
                    {name: 'calcium', index: 3},
                    {name: 'sodium', index: 4},
                    {name: 'fiber', index: 5},
                    {name: 'vitaminc', index: 6},
                    {name: 'potassium', index: 7},
                    {name: 'carbohydrate', index: 8},
                    {name: 'sugars', index: 9},
                    {name: 'fat', index: 10},
                    {name: 'water', index: 11},
                    {name: 'calories', index: 12},
                    {name: 'saturated', index: 13},
                    {name: 'monounsat', index: 14},
                    {name: 'polyunsat', index: 15},
                    {name: 'id', index: 16}
                ];

                function normalizeData(originData) {
                    var groupMap = {};
                    originData.forEach(row => {
                        var groupName = row[indices.group];
                        if (!groupMap.hasOwnProperty(groupName)) {
                            groupMap[groupName] = 1;
                        }
                    });

                    originData.forEach(row => {
                        row.forEach((item, index) => {
                            if (index !== indices.name
                                && index !== indices.group
                                && index !== indices.id
                            ) {
                                // Convert null to zero, as all of them under unit "g".
                                row[index] = parseFloat(item) || 0;
                            }
                        });
                    });

                    for (var groupName in groupMap) {
                        if (groupMap.hasOwnProperty(groupName)) {
                            groupCategories.push(groupName);
                        }
                    }
                    var hStep = Math.round(300 / (groupCategories.length - 1));
                    for (var i = 0; i < groupCategories.length; i++) {
                        groupColors.push(colorTool.modifyHSL('#5A94DF', hStep * i));
                    }
                }

                var lineStyle = {
                    normal: {
                        width: 0.5,
                        opacity: 0.05
                        // shadowBlur: 10,
                        // shadowOffsetX: 0,
                        // shadowOffsetY: 0,
                        // shadowColor: 'rgba(0, 0, 0, 0.5)'
                    }
                };

                console.log('rawDataCount: ' + rawData.length);
                var currentData = rawData;
                if (_ctx.rawDataCount.value != null) {
                    currentData = rawData.slice(0, _ctx.rawDataCount.value);
                }
                console.log('current displayed data count: ' + currentData.length);

                var option = {

                    ...largeSettingsGlobal,
                    animation: false,

                    backgroundColor: '#333',
                    // tooltip: {
                    //     padding: 10,
                    //     backgroundColor: '#222',
                    //     borderColor: '#777',
                    //     borderWidth: 1
                    // },
                    title: [
                        {
                            text: 'Groups',
                            top: 0,
                            left: 0,
                            textStyle: {
                                color: '#fff'
                            }
                        }
                    ],
                    visualMap: {
                        show: true,
                        type: 'piecewise',
                        categories: groupCategories,
                        dimension: indices.group,
                        inRange: {
                            color: groupColors //['#d94e5d','#eac736','#50a3ba']
                        },
                        outOfRange: {
                            color: ['#ccc'] //['#d94e5d','#eac736','#50a3ba']
                        },
                        top: 20,
                        textStyle: {
                            color: '#fff'
                        },
                        realtime: false
                    },
                    parallelAxis: [
                        {dim: 16, name: schema[16].name, scale: true, nameLocation: 'end'},
                        {dim: 2, name: schema[2].name, nameLocation: 'end'},
                        {dim: 4, name: schema[4].name, nameLocation: 'end'},
                        {dim: 3, name: schema[3].name, nameLocation: 'end'},
                        {dim: 5, name: schema[5].name, nameLocation: 'end'},
                        {dim: 6, name: schema[6].name, nameLocation: 'end'},
                        {dim: 7, name: schema[7].name, nameLocation: 'end'},
                        {dim: 8, name: schema[8].name, nameLocation: 'end'},
                        {dim: 9, name: schema[9].name, nameLocation: 'end'},
                        {dim: 10, name: schema[10].name, nameLocation: 'end'},
                        {dim: 11, name: schema[11].name, nameLocation: 'end'},
                        {dim: 12, name: schema[12].name, nameLocation: 'end'},
                        {dim: 13, name: schema[13].name, nameLocation: 'end'},
                        {dim: 14, name: schema[14].name, nameLocation: 'end'},
                        {dim: 15, name: schema[15].name, nameLocation: 'end'}
                    ],
                    parallel: {
                        left: 280,
                        top: 20,
                        // top: 150,
                        // height: 300,
                        width: 400,
                        layout: 'vertical',
                        parallelAxisDefault: {
                            type: 'value',
                            name: 'nutrients',
                            nameLocation: 'end',
                            nameGap: 20,
                            nameTextStyle: {
                                color: '#fff',
                                fontSize: 14
                            },
                            axisLine: {
                                lineStyle: {
                                    color: '#aaa'
                                }
                            },
                            axisTick: {
                                lineStyle: {
                                    color: '#777'
                                }
                            },
                            splitLine: {
                                show: false
                            },
                            axisLabel: {
                                textStyle: {
                                    color: '#fff'
                                }
                            },
                            realtime: false
                        }
                    },

                    series: [{

                        ...largeSettingsSeries,

                        name: 'nutrients',
                        type: 'parallel',
                        lineStyle: lineStyle,
                        // inactiveOpacity: 0,
                        // activeOpacity: 0.01,
                        smooth: true,
                        data: currentData
                    }]
                };


                return option;
            }

            function updateChart() {
                chart.setOption(createOption(), {notMerge: true});
            }

            chart = testHelper.create(echarts, 'main0', {
                title: [
                    'Click **Resume**',
                    'parallels',
                ],
                option: createOption(),
                height: 350,
                // recordCanvas: true
                inputsStyle: 'compact',
                inputs: testHelper.createInputsSimply(_ctx, updateChart),
            });
        });
        </script>


    </body>
</html>

