import { __assign } from "tslib";
import { get, isFunction, isNumber, map, maxBy } from '@antv/util';
import { FUNNEL_CONVERSATION, FUNNEL_MAPPING_VALUE, FUNNEL_PERCENT } from '../constant';
export var CONVERSION_TAG_NAME = 'CONVERSION_TAG_NAME';
/**
 * 漏斗图 transform
 * @param geometry
 */
export function transformData(data, originData, options) {
    var formatData = [];
    var yField = options.yField, maxSize = options.maxSize, minSize = options.minSize;
    var maxYFieldValue = get(maxBy(originData, yField), [yField]);
    var max = isNumber(maxSize) ? maxSize : 1;
    var min = isNumber(minSize) ? minSize : 0;
    // format 数据
    formatData = map(data, function (row, index) {
        var percent = (row[yField] || 0) / maxYFieldValue;
        row[FUNNEL_PERCENT] = percent;
        row[FUNNEL_MAPPING_VALUE] = (max - min) * percent + min;
        // 转化率数据存储前后数据
        row[FUNNEL_CONVERSATION] = [get(data, [index - 1, yField]), row[yField]];
        return row;
    });
    return formatData;
}
/**
 * 漏斗图通用转化率组件
 * @param getLineCoordinate 用于获取特定的 line 的位置及配置
 */
export function conversionTagComponent(getLineCoordinate) {
    return function (params) {
        var chart = params.chart, options = params.options;
        // @ts-ignore
        var conversionTag = options.conversionTag, filteredData = options.filteredData;
        var data = filteredData || chart.getOptions().data;
        if (conversionTag) {
            var formatter_1 = conversionTag.formatter;
            data.forEach(function (obj, index) {
                if (index <= 0 || Number.isNaN(obj[FUNNEL_MAPPING_VALUE]))
                    return;
                var lineOption = getLineCoordinate(obj, index, data, {
                    top: true,
                    name: CONVERSION_TAG_NAME,
                    text: {
                        content: isFunction(formatter_1) ? formatter_1(obj, data) : formatter_1,
                        offsetX: conversionTag.offsetX,
                        offsetY: conversionTag.offsetY,
                        position: 'end',
                        autoRotate: false,
                        style: __assign({ textAlign: 'start', textBaseline: 'middle' }, conversionTag.style),
                    },
                });
                chart.annotation().line(lineOption);
            });
        }
        return params;
    };
}
//# sourceMappingURL=common.js.map