/*
title: Aggregate Morphing Between Scatter and Bar
category: custom
titleCN: 聚合分割形变（散点图 - 柱状图）
difficulty: 9
*/

var SCATTER_COLORS = [
  '#5470c6',
  '#91cc75',
  '#fac858',
  '#ee6666',
  '#73c0de',
  '#3ba272',
  '#fc8452',
  '#9a60b4',
  '#ea7ccc'
];
var BAR_COLOR = '#37A2DA';
var ANIMATION_DURATION_UPDATE = 1500;

var RAW_DATA = [
  [1425139200000, 34, 0.13, 2, 'MD', 'ZD', 'P0'],
  [1425225600000, 28, 0.71, 1.5, 'MB', 'ZD', 'P1'],
  [1425312000000, 23, 0.9, 2.8, 'MA', 'ZC', 'P2'],
  [1425398400000, 21, 0.58, 6, 'MB', 'ZC', 'P3'],
  [1425484800000, 14, 0.1, 1.6, 'MC', 'ZA', 'P4'],
  [1425571200000, 21, 0.6, 7.7, 'MC', 'ZA', 'P5'],
  [1425657600000, 23, 0.31, 2.6, 'MC', 'ZC', 'P6'],
  [1425744000000, 34, 0.74, 2.4, 'MD', 'ZE', 'P7'],
  [1425830400000, 14, 0.59, 2.3, 'MB', 'ZD', 'P8'],
  [1425916800000, 18, 0.85, 5.1, 'MB', 'ZB', 'P9'],
  [1426003200000, 36, 0.96, 1.2, 'MC', 'ZC', 'P10'],
  [1426089600000, 18, 0.28, 2.5, 'MA', 'ZC', 'P11'],
  [1426176000000, 20, 0.62, 6, 'MB', 'ZD', 'P12'],
  [1426262400000, 32, 0.79, 1.7, 'MB', 'ZA', 'P13'],
  [1426348800000, 17, 0.58, 4.4, 'MD', 'ZB', 'P14'],
  [1426435200000, 23, 0.77, 3, 'MB', 'ZA', 'P15'],
  [1426521600000, 39, 0.87, 4.6, 'MC', 'ZA', 'P16'],
  [1426608000000, 15, 0.7, 6, 'MB', 'ZC', 'P17'],
  [1426694400000, 21, 0.94, 2.7, 'MB', 'ZD', 'P18'],
  [1426780800000, 28, 0.48, 4.5, 'MC', 'ZC', 'P19'],
  [1426867200000, 31, 0.49, 9.8, 'MA', 'ZC', 'P20'],
  [1426953600000, 27, 0.87, 7.7, 'MB', 'ZB', 'P21'],
  [1427040000000, 27, 0.82, 5.5, 'MC', 'ZB', 'P22'],
  [1427126400000, 11, 0.53, 2.7, 'MD', 'ZC', 'P23'],
  [1427212800000, 13, 0.7, 7.6, 'MB', 'ZD', 'P24'],
  [1427299200000, 39, 0.99, 4.8, 'MB', 'ZD', 'P25'],
  [1427385600000, 32, 0.91, 2.1, 'MB', 'ZE', 'P26'],
  [1427472000000, 20, 0.97, 5, 'MB', 'ZA', 'P27'],
  [1427558400000, 36, 0.01, 8.9, 'MB', 'ZD', 'P28'],
  [1427644800000, 22, 0.08, 9.2, 'MB', 'ZE', 'P29'],
  [1427731200000, 21, 0.36, 3.1, 'MD', 'ZC', 'P30'],
  [1427817600000, 11, 0.15, 5.8, 'MD', 'ZB', 'P31'],
  [1427904000000, 39, 0.02, 1.4, 'MC', 'ZD', 'P32'],
  [1427990400000, 20, 0.86, 8.7, 'MB', 'ZD', 'P33'],
  [1428076800000, 23, 0.24, 7.2, 'MD', 'ZB', 'P34'],
  [1428163200000, 12, 0.06, 2, 'MD', 'ZB', 'P35'],
  [1428249600000, 36, 0.42, 8.2, 'MA', 'ZB', 'P36'],
  [1428336000000, 17, 0.48, 7.5, 'MB', 'ZC', 'P37'],
  [1428422400000, 19, 0.12, 6.6, 'MB', 'ZB', 'P38'],
  [1428508800000, 39, 0.58, 3.1, 'MC', 'ZE', 'P39'],
  [1428595200000, 10, 0.18, 6.6, 'MC', 'ZD', 'P40'],
  [1428681600000, 22, 0.28, 2.1, 'MB', 'ZE', 'P41'],
  [1428768000000, 27, 0.33, 1.9, 'MC', 'ZB', 'P42'],
  [1428854400000, 37, 0.46, 9.4, 'MD', 'ZE', 'P43'],
  [1428940800000, 18, 0.96, 5.5, 'MB', 'ZA', 'P44'],
  [1429027200000, 11, 0.61, 8.2, 'MD', 'ZC', 'P45'],
  [1429113600000, 15, 0.88, 4.6, 'MD', 'ZA', 'P46'],
  [1429200000000, 38, 0.89, 7.2, 'MD', 'ZC', 'P47'],
  [1429286400000, 20, 0.39, 5.4, 'MB', 'ZB', 'P48'],
  [1429372800000, 30, 0.71, 5.5, 'MA', 'ZA', 'P49']
];

$.when(
  $.getScript(
    'https://fastly.jsdelivr.net/npm/echarts-simple-transform@1.0.0/dist/ecSimpleTransform.min.js'
  )
).done(function () {
  init();

  var currentIsBar = false;
  setScatterOption();

  setInterval(function () {
    if (currentIsBar) {
      currentIsBar = false;
      setScatterOption();
    } else {
      currentIsBar = true;
      setBarOption();
    }
  }, 3000);
});

function init() {
  echarts.registerTransform(ecSimpleTransform.aggregate);

  var baseOption = {
    dataset: [
      {
        id: 'raw_dataset',
        dimensions: [
          'DATE',
          'COUNT',
          'PRICE',
          'WEIGHT',
          'M_TAG',
          'Z_TAG',
          'ID'
        ],
        source: RAW_DATA
      },
      {
        id: 'mTagSum_dataset',
        fromDatasetId: 'raw_dataset',
        transform: {
          type: 'ecSimpleTransform:aggregate',
          config: {
            resultDimensions: [
              { from: 'COUNT', method: 'sum' },
              { from: 'PRICE', method: 'sum' },
              { from: 'WEIGHT', method: 'sum' },
              { from: 'M_TAG' }
            ],
            groupBy: 'M_TAG'
          }
        }
      }
    ],
    tooltip: {}
  };

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

function setScatterOption() {
  var option = {
    grid: {
      containLabel: true
    },
    xAxis: {
      name: 'PRICE'
    },
    yAxis: {
      name: 'COUNT'
    },
    series: {
      type: 'custom',
      coordinateSystem: 'cartesian2d',
      animationDurationUpdate: ANIMATION_DURATION_UPDATE,
      datasetId: 'raw_dataset',
      encode: {
        itemName: 'ID',
        x: 'PRICE',
        y: 'COUNT',
        tooltip: ['PRICE', 'COUNT', 'WEIGHT']
      },
      renderItem: function (params, api) {
        var pos = api.coord([api.value('PRICE'), api.value('COUNT')]);
        var color = getFromPalette(api.value('Z_TAG'), SCATTER_COLORS);
        return {
          type: 'circle',
          morph: true,
          shape: {
            cx: pos[0],
            cy: pos[1],
            r: 10
          },
          style: {
            fill: color
          },
          transition: ['shape', 'style']
        };
      }
    }
  };

  myChart.setOption(option, {
    replaceMerge: ['xAxis', 'yAxis'],
    transition: {
      from: { seriesIndex: 0, dimension: 'M_TAG' },
      to: { seriesIndex: 0, dimension: 'M_TAG' }
    }
  });
}

function setBarOption() {
  var option = {
    grid: {
      containLabel: true
    },
    xAxis: {
      type: 'category'
    },
    yAxis: {},
    series: {
      type: 'custom',
      coordinateSystem: 'cartesian2d',
      animationDurationUpdate: ANIMATION_DURATION_UPDATE,
      datasetId: 'mTagSum_dataset',
      encode: {
        x: 'M_TAG',
        y: 'COUNT',
        tooltip: ['M_TAG', 'COUNT', 'WEIGHT']
      },
      renderItem: function (params, api) {
        var mTagVal = api.value('M_TAG');
        var ataVal = api.value('COUNT');
        var tarPos = api.coord([mTagVal, ataVal]);
        var zeroPos = api.coord([mTagVal, 0]);
        var size = api.size([mTagVal, ataVal]);
        var width = size[0] * 0.4;
        return {
          type: 'rect',
          morph: true,
          shape: {
            x: tarPos[0] - width / 2,
            y: tarPos[1],
            height: zeroPos[1] - tarPos[1],
            width: width
          },
          style: {
            fill: BAR_COLOR
          },
          transition: ['shape', 'style']
        };
      }
    }
  };

  myChart.setOption(option, {
    replaceMerge: ['xAxis', 'yAxis', 'visualMap'],
    transition: {
      from: { seriesIndex: 0, dimension: 'M_TAG' },
      to: { seriesIndex: 0, dimension: 'M_TAG' }
    }
  });
}

function getFromPalette(value, palette) {
  if (!palette.__colorMap) {
    palette.__colorMap = {};
  }
  if (palette.__colorIdx == null) {
    palette.__colorIdx = 0;
  }
  if (!palette.__colorMap[value]) {
    palette.__colorMap[value] = palette[palette.__colorIdx];
    palette.__colorIdx++;
    if (palette.__colorIdx >= palette.length) {
      palette.__colorIdx = 0;
    }
  }
  return palette.__colorMap[value];
}
