package eu.gity.jmeter.ddos.stairsddosthreadgrp.charting.plotters;

import eu.gity.jmeter.ddos.stairsddosthreadgrp.charting.AbstractGraphRow;
import eu.gity.jmeter.ddos.stairsddosthreadgrp.charting.ChartSettings;
import eu.gity.jmeter.ddos.stairsddosthreadgrp.charting.CubicSpline;
import org.apache.jorphan.gui.NumberRenderer;

import java.awt.*;

public class CSplineRowPlotter extends AbstractRowPlotter {

    private static final long serialVersionUID = 240L;

    private final long splineLinesCount = 200L;

    public CSplineRowPlotter(ChartSettings chartSettings, NumberRenderer labelRenderer) {
        super(chartSettings, labelRenderer);
        allowMarkers = true;
    }

    @Override
    protected void processPoint(Graphics2D g2d, int granulation) {
        // do nothing
    }

    @Override
    protected void postPaintRow(AbstractGraphRow row, Graphics2D g2d) {
        if (chartSettings.getLineWidth() == 0) return;

        if (row.size() >= 3) {
            CubicSpline cs = new CubicSpline(row);
            long minX = row.getMinX();
            long maxX = row.getMaxX();

            double step = (double) (maxX - minX) / splineLinesCount;

            double currentX = minX;

            while (currentX <= maxX) {
                x = chartRect.x + (int) ((currentX - minXVal) * dxForDVal);
                int yHeight = (int) ((cs.interpolate(currentX) - minYVal) * dyForDVal);
                y = chartRect.y + chartRect.height - yHeight;

                // prevent out of range
                if (y < chartRect.y) {
                    y = chartRect.y;
                }
                if (y > chartRect.y + chartRect.height) {
                    y = chartRect.y + chartRect.height;
                }
                currentX += step;

                if (prevX >= 0) {
                    g2d.drawLine(prevX, prevY, x, y);
                }
                prevX = x;
                prevY = y;
            }
        }
    }
}
