/*
title: Simple Story Transition
category: custom
titleCN: 极简场景变换示例
difficulty: 11
*/

$.when(
    $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json'),
    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform/dist/ecSimpleTransform.min.js')
).done(function (res) {
    run(res[0]);
});

let _optionList;

function run(_rawData) {
    echarts.registerTransform(ecSimpleTransform.aggregate);
    echarts.registerTransform(ecSimpleTransform.id);


    const COUNTRY_A = 'Germany';
    const COUNTRY_B = 'France';
    const CONTENT_COLORS = {
        [COUNTRY_A]: '#5470c6',
        [COUNTRY_B]: '#91cc75'
    };
    const Z2 = {
        [COUNTRY_A]: 1,
        [COUNTRY_B]: 2
    }


    const ANIMATION_DURATION_UPDATE = 1000;
    const AXIS_NAME_STYLE = {
        nameGap: 25,
        nameTextStyle: {
            fontSize: 20
        },
    };


    const baseOption = {
        animationDurationUpdate: ANIMATION_DURATION_UPDATE,
        dataset: [{
            id: 'DatasetRaw',
            source: _rawData
        }, {
            id: 'DatasetRawWithId',
            fromDatasetId: 'DatasetRaw',
            transform: [{
                type: 'filter',
                config: {
                    dimension: 'Year', gte: 1950
                }
            }, {
                type: 'ecSimpleTransform:id',
                config: {
                    dimensionIndex: 5,
                    dimensionName: 'Id'
                }
            }]
        }, {
            id: 'DatasetCountryAB',
            fromDatasetId: 'DatasetRawWithId',
            transform: {
                type: 'filter',
                config: {
                    or: [{
                        dimension: 'Country', '=': COUNTRY_A
                    }, {
                        dimension: 'Country', '=': COUNTRY_B
                    }]
                }
            }
        }, {
            id: 'DatasetCountryABSumIncome',
            fromDatasetId: 'DatasetCountryAB',
            transform: {
                type: 'ecSimpleTransform:aggregate',
                config: {
                    resultDimensions: [
                        { from: 'Income', method: 'sum' },
                        { from: 'Country' }
                    ],
                    groupBy: 'Country'
                }
            }
        }],
        tooltip: {}
    };



    const optionCreators = {

        'Option_CountryAB_Year_Income_Bar': function (datasetId, specifiedCountry) {
            return {
                xAxis: {
                    type: 'category',
                    nameLocation: 'middle'
                },
                yAxis: {
                    name: 'Income',
                    ...AXIS_NAME_STYLE
                },
                series: {
                    type: 'custom',
                    coordinateSystem: 'cartesian2d',
                    datasetId: datasetId,
                    encode: {
                        x: 'Year',
                        y: 'Income',
                        itemName: 'Year',
                        tooltip: ['Income'],
                    },
                    renderItem: function (params, api) {
                        const valPos = api.coord([api.value('Year'), api.value('Income')]);
                        const basePos = api.coord([api.value('Year'), 0]);
                        const width = api.size([1, 0])[0] * 0.9;

                        const country = api.value('Country');
                        if (specifiedCountry != null && specifiedCountry !== country) {
                            return;
                        }

                        return {
                            type: 'group',
                            children: [{
                                type: 'rect',
                                transition: ['shape', 'style'],
                                morph: true,
                                shape: {
                                    x: basePos[0],
                                    y: basePos[1],
                                    width: width,
                                    height: valPos[1] - basePos[1]
                                },
                                z2: Z2[country],
                                style: {
                                    fill: CONTENT_COLORS[country],
                                    opacity: 0.8
                                }
                            }]
                        };
                    }
                }
            };
        },

        'Option_CountryAB_Year_Population_Bar': function (datasetId, specifiedCountry) {
            return {
                xAxis: {
                    type: 'category',
                    nameLocation: 'middle'
                },
                yAxis: {
                    name: 'Population',
                    ...AXIS_NAME_STYLE
                },
                series: {
                    type: 'custom',
                    coordinateSystem: 'cartesian2d',
                    datasetId: datasetId,
                    encode: {
                        x: 'Year',
                        y: 'Population',
                        itemName: 'Year',
                        tooltip: ['Population'],
                    },
                    renderItem: function (params, api) {
                        const valPos = api.coord([api.value('Year'), api.value('Population')]);
                        const basePos = api.coord([api.value('Year'), 0]);
                        const width = api.size([1, 0])[0] * 0.9;

                        const country = api.value('Country');
                        if (specifiedCountry != null && specifiedCountry !== country) {
                            return;
                        }

                        return {
                            type: 'group',
                            children: [{
                                type: 'rect',
                                transition: ['shape', 'style'],
                                morph: true,
                                shape: {
                                    x: basePos[0],
                                    y: basePos[1],
                                    width: width,
                                    height: valPos[1] - basePos[1]
                                },
                                style: {
                                    fill: CONTENT_COLORS[country]
                                }
                            }]
                        };
                    }
                }
            };
        },

        'Option_CountryAB_Income_Population_Scatter': function (datasetId, specifiedCountry) {
            return {
                xAxis: {
                    name: 'Income',
                    ...AXIS_NAME_STYLE,
                    scale: true,
                    nameLocation: 'middle'
                },
                yAxis: {
                    name: 'Population',
                    ...AXIS_NAME_STYLE,
                    scale: true
                },
                series: {
                    type: 'custom',
                    coordinateSystem: 'cartesian2d',
                    datasetId: datasetId,
                    encode: {
                        x: 'Income',
                        y: 'Population',
                        itemName: ['Year'],
                        tooltip: ['Income', 'Population', 'Country']
                    },
                    renderItem: function (params, api) {
                        const pos = api.coord([api.value('Income'), api.value('Population')]);

                        const country = api.value('Country');
                        if (specifiedCountry != null && specifiedCountry !== country) {
                            return;
                        }

                        return {
                            type: 'group',
                            children: [{
                                type: 'circle',
                                transition: ['shape', 'style'],
                                morph: true,
                                shape: {
                                    cx: pos[0],
                                    cy: pos[1],
                                    r: 10
                                },
                                style: {
                                    fill: CONTENT_COLORS[country],
                                    lineWidth: 1,
                                    stroke: '#333',
                                    opacity: 1,
                                    enterFrom: {
                                        opacity: 0
                                    }
                                }
                            }]
                        };
                    }
                }
            };
        },

        'Option_CountryAB_Income_Sum_Bar': function (datasetId) {
            return {
                xAxis: {
                    name: 'Income',
                    ...AXIS_NAME_STYLE,
                    nameLocation: 'middle'
                },
                yAxis: {
                    type: 'category'
                },
                series: {
                    type: 'custom',
                    coordinateSystem: 'cartesian2d',
                    datasetId: datasetId,
                    encode: {
                        x: 'Income',
                        y: 'Country',
                        itemName: ['Country'],
                        tooltip: ['Income']
                    },
                    renderItem: function (params, api) {
                        const country = api.ordinalRawValue('Country');
                        const valPos = api.coord([api.value('Income'), country]);
                        const basePos = api.coord([0, country]);
                        const height = api.size([0, 1])[1] * 0.4;

                        return {
                            type: 'group',
                            children: [{
                                type: 'rect',
                                transition: ['shape', 'style'],
                                morph: true,
                                shape: {
                                    x: basePos[0],
                                    y: valPos[1] - height / 2,
                                    width: valPos[0] - basePos[0],
                                    height: height
                                },
                                style: {
                                    fill: CONTENT_COLORS[country]
                                }
                            }]
                        };
                    }
                }
            };
        }

    };

    _optionList = [{
        backwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Year_Income_Bar']('DatasetCountryAB', COUNTRY_A)
    }, {
        backwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        forwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Year_Population_Bar']('DatasetCountryAB', COUNTRY_A)
    }, {
        backwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        forwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Income_Population_Scatter']('DatasetCountryAB', COUNTRY_A)
    }, {
        backwardTransitionOpt: {
            from: { dimension: 'Country', seriesIndex: 0 },
            to: { dimension: 'Country', seriesIndex: 0 }
        },
        forwardTransitionOpt: {
            from: { dimension: 'Id', seriesIndex: 0 },
            to: { dimension: 'Id', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Income_Population_Scatter']('DatasetCountryAB')
    }, {
        backwardTransitionOpt: {
            from: { dimension: 'Country', seriesIndex: 0 },
            to: { dimension: 'Country', seriesIndex: 0 }
        },
        forwardTransitionOpt: {
            from: { dimension: 'Country', seriesIndex: 0 },
            to: { dimension: 'Country', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Income_Sum_Bar']('DatasetCountryABSumIncome')
    }, {
        forwardTransitionOpt: {
            from: { dimension: 'Country', seriesIndex: 0 },
            to: { dimension: 'Country', seriesIndex: 0 }
        },
        option: optionCreators['Option_CountryAB_Year_Income_Bar']('DatasetCountryAB')
    }];


    myChart.setOption(baseOption, { lazyMode: true });

    // Initialize state
    myChart.setOption(_optionList[currentOptionIndex].option);
}

let currentOptionIndex = 0;
app.config = {
    'Next': function () {
        if (!_optionList || currentOptionIndex >= _optionList.length - 1) {
            return;
        }
        const optionWrap = _optionList[++currentOptionIndex];
        myChart.setOption(optionWrap.option, {
            replaceMerge: ['xAxis', 'yAxis'],
            transition: optionWrap.forwardTransitionOpt
        });
    },

    'Previous': function () {
        if (!_optionList || currentOptionIndex <= 0) {
            return;
        }
        const optionWrap = _optionList[--currentOptionIndex];
        myChart.setOption(optionWrap.option, {
            replaceMerge: ['xAxis', 'yAxis'],
            transition: optionWrap.backwardTransitionOpt
        });
    }
}
