import { Util, View } from '@antv-source/g2';
import { get, isEmpty, isFunction, reduce } from '@antv/util';
import { Legend } from '../../../types/legend';
import { deepAssign, findGeometry } from '../../../utils';
import { GeometryOption } from '../types';
import { isLine } from './option';

/**
 * 获取 view 的 legendItem，供存在不含有 seriesField 的图形使用
 * @param params
 */
export function getViewLegendItems(params: {
  view: View;
  yField: string;
  geometryOption: GeometryOption;
  legend: Legend;
}) {
  const { view, geometryOption, yField, legend } = params;
  const userMarker = get(legend, 'marker');

  const geometry = findGeometry(view, isLine(geometryOption) ? 'line' : 'interval');
  if (!geometryOption.seriesField) {
    const legendItemName = get(view, `options.scales.${yField}.alias`) || yField;
    // 返回 g2 设置的图例
    const colorAttribute = geometry.getAttribute('color');
    let color = view.getTheme().defaultColor;
    if (colorAttribute) {
      color = Util.getMappingValue(colorAttribute, legendItemName, get(colorAttribute, ['values', 0], color));
    }

    const marker =
      (isFunction(userMarker)
        ? userMarker
        : !isEmpty(userMarker) &&
          deepAssign(
            {},
            {
              style: {
                stroke: color,
                fill: color,
              },
            },
            userMarker
          )) ||
      (isLine(geometryOption)
        ? {
            symbol: (x: number, y: number, r: number) => {
              return [
                ['M', x - r, y],
                ['L', x + r, y],
              ];
            },
            style: {
              lineWidth: 2,
              r: 6,
              stroke: color,
            },
          }
        : {
            symbol: 'square',
            style: {
              fill: color,
            },
          });
    return [
      {
        value: yField,
        name: legendItemName,
        marker,
        isGeometry: true,
        viewId: view.id,
      },
    ];
  }

  const attributes = geometry.getGroupAttributes();
  return reduce(
    attributes,
    (items, attr) => {
      const attrItems = Util.getLegendItems(view, geometry, attr, view.getTheme(), userMarker);
      return items.concat(attrItems);
    },
    []
  );
}
