import { IGroup } from '@antv/g-base';
import { registerShape, Types, Util } from '@antv-source/g2';
import { parsePathString } from '@antv/path-util';
import { Datum, Point } from '../../types';
import { deepAssign } from '../../utils';
import { PATH_FIELD } from './constant';
import { CustomInfo } from './types';

/**
 * 获取填充属性
 * @param cfg 图形绘制数据
 */
function getFillAttrs(cfg: Types.ShapeInfo) {
  // style.fill 优先级更高
  return deepAssign({}, cfg.defaultStyle, { fill: cfg.color }, cfg.style);
}

registerShape('schema', 'venn', {
  draw(cfg: Types.ShapeInfo & { points: Point[]; nextPoints: Point[] }, container: IGroup) {
    const data = cfg.data as Datum;
    const segments = parsePathString(data[PATH_FIELD]);
    const fillAttrs = getFillAttrs(cfg);

    const group = container.addGroup({ name: 'venn-shape' });

    group.addShape('path', {
      attrs: {
        ...fillAttrs,
        path: segments,
      },
      name: 'venn-path',
    });

    const { offsetX, offsetY } = cfg.customInfo as CustomInfo;

    const matrix = Util.transform(null, [['t', offsetX, offsetY]]);
    group.setMatrix(matrix);

    return group;
  },
  getMarker(markerCfg: Types.ShapeMarkerCfg) {
    const { color } = markerCfg;
    return {
      symbol: 'circle',
      style: {
        lineWidth: 0,
        stroke: color,
        fill: color,
        r: 4,
      },
    };
  },
});
