/** 指示线默认长度（像素），需与 datalabels 的 offset 一致，使线头与文案衔接 */ var DEFAULT_LEADER_LINE_PX = 4;
/** 曲线控制点偏移系数，使指示线呈柔和弧线 */ var CURVE_OFFSET = 12;
/** 与 datalabels 的 display 阈值一致：占比不超过此不展示标签，也不画指示线 */ var MIN_PCT_FOR_LABEL = 2;
/**
 * 数据标签指示线插件：仅在会展示数据标签的扇区上绘制线（与 datalabels display 逻辑一致，避免无线无文案）。
 * 传入的 lineLength 应与 options.plugins.datalabels.offset 一致。
 */ export var createDataLabelsLeaderLinePlugin = function createDataLabelsLeaderLinePlugin() {
    var lineLength = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : DEFAULT_LEADER_LINE_PX, darkMode = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
    return {
        id: 'datalabelsLeaderLine',
        afterDatasetDraw: function afterDatasetDraw(chart, args) {
            var _chart_data_datasets, _meta_data;
            var ctx = chart.ctx;
            var meta = chart.getDatasetMeta(args.index);
            var dataset = (_chart_data_datasets = chart.data.datasets) === null || _chart_data_datasets === void 0 ? void 0 : _chart_data_datasets[args.index];
            var values = dataset === null || dataset === void 0 ? void 0 : dataset.data;
            if (!(meta === null || meta === void 0 ? void 0 : (_meta_data = meta.data) === null || _meta_data === void 0 ? void 0 : _meta_data.length) || !(values === null || values === void 0 ? void 0 : values.length)) return;
            var total = values.reduce(function(s, v) {
                return s + (Number.isFinite(Number(v)) ? Number(v) : 0);
            }, 0);
            if (total <= 0) return;
            ctx.save();
            ctx.strokeStyle = darkMode ? 'rgba(255, 255, 255, 0.22)' : 'rgba(0, 25, 61, 0.16)';
            ctx.lineWidth = 1;
            meta.data.forEach(function(element, i) {
                var val = Number(values[i]);
                if (!Number.isFinite(val) || val / total * 100 < MIN_PCT_FOR_LABEL) return;
                var arc = element;
                var angle = (arc.startAngle + arc.endAngle) / 2;
                var cos = Math.cos(angle);
                var sin = Math.sin(angle);
                var x1 = arc.x + arc.outerRadius * cos;
                var y1 = arc.y + arc.outerRadius * sin;
                var x2 = arc.x + (arc.outerRadius + lineLength) * cos;
                var y2 = arc.y + (arc.outerRadius + lineLength) * sin;
                var midX = (x1 + x2) / 2;
                var midY = (y1 + y2) / 2;
                var ctrlX = midX + CURVE_OFFSET * -sin;
                var ctrlY = midY + CURVE_OFFSET * cos;
                ctx.beginPath();
                ctx.moveTo(x1, y1);
                ctx.quadraticCurveTo(ctrlX, ctrlY, x2, y2);
                ctx.stroke();
            });
            ctx.restore();
        }
    };
};
export var createCenterTextPlugin = function createCenterTextPlugin(value, label) {
    var isMobile = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false, darkMode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
    return {
        id: 'centerText',
        beforeDraw: function beforeDraw(chart) {
            var width = chart.width, height = chart.height, ctx = chart.ctx;
            ctx.save();
            var centerX = width / 2;
            var centerY = height / 2;
            var percentFontSize = isMobile ? 11 : 15; // px
            var labelFontSize = isMobile ? 10 : 12; // px
            // value 优先使用 Rubik
            ctx.font = "".concat(isMobile ? '400' : '500', " ").concat(percentFontSize, "px 'Rubik', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Liberation Sans', sans-serif");
            ctx.fillStyle = darkMode ? 'rgba(255, 255, 255, 0.92)' : '#343A45';
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            ctx.fillText("".concat(value, "%"), centerX, centerY - labelFontSize * 0.8);
            // label 优先使用 PingFang SC
            ctx.font = "300 ".concat(labelFontSize, "px 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Liberation Sans', sans-serif");
            ctx.fillStyle = darkMode ? 'rgba(255, 255, 255, 0.55)' : '#767E8B';
            ctx.fillText(label, centerX, centerY + labelFontSize * 0.6);
            ctx.restore();
        }
    };
};
// 单值饼图增加背景圆环
export var createBackgroundArcPlugin = function createBackgroundArcPlugin() {
    var bgColor = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : '#F7F8F9', padding = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
    return {
        id: 'backgroundArc',
        beforeDatasetDraw: function beforeDatasetDraw(chart) {
            var _meta_data;
            var meta = chart.getDatasetMeta(0);
            if (!(meta === null || meta === void 0 ? void 0 : (_meta_data = meta.data) === null || _meta_data === void 0 ? void 0 : _meta_data[0])) return;
            var arc = meta.data[0];
            var outerRadius = arc.outerRadius + padding; // 外扩
            var innerRadius = arc.innerRadius - padding; // 内缩，增加宽度
            var ctx = chart.ctx;
            ctx.save();
            ctx.beginPath();
            ctx.arc(arc.x, arc.y, outerRadius, 0, 2 * Math.PI, false);
            ctx.arc(arc.x, arc.y, innerRadius, 0, 2 * Math.PI, true);
            ctx.fillStyle = bgColor;
            ctx.fill();
            ctx.restore();
        }
    };
};
