package probstat.util;
import java.text.NumberFormat;
/**
PrettyScale.java: given doubles minData and maxData
attempts to calculate "reasonable" begin and end
points for a scale
*/
public class PrettyScale extends Object{
    protected double minData, maxData;
    private double spreadData, logSpreadData;
    private double minDataScaled, maxDataScaled;
    private double minScaleValue, maxScaleValue;
    private long spreadPower;
    final static double log10 = Math.log(10.0);
    NumberFormat nf = NumberFormat.getNumberInstance();
    private int maxFractionDigits =2;	
    private String minScaleLabel, maxScaleLabel;

    public PrettyScale( double aMinData, double aMaxData){
        
        minData = 2*aMinData; //factor 2 allows values such as 15 as end point
        maxData = 2*aMaxData;
        spreadData = maxData - minData;
        logSpreadData = Math.log(spreadData)/log10;
        spreadPower = Math.round(Math.floor(logSpreadData));
        //Divide by appropriate power of 10 and round
        minDataScaled = minData/Math.exp(log10*spreadPower);
        maxDataScaled = maxData/Math.exp(log10*spreadPower);
        minScaleValue = Math.exp(log10*spreadPower)*Math.round(Math.floor(minDataScaled))/2.0;
        maxScaleValue = Math.exp(log10*spreadPower)*Math.round(Math.ceil(maxDataScaled))/2.0;
        maxFractionDigits = (int)Math.max(0, 1-1*spreadPower);
        nf.setMaximumFractionDigits(maxFractionDigits);
        minScaleLabel = nf.format(minScaleValue);
        maxScaleLabel = nf.format(maxScaleValue);
        
    }

    public double getMinScaleValue() { return minScaleValue;}
    public double getMaxScaleValue() { return maxScaleValue;}
    public String getMinScaleLabel() { return minScaleLabel;}
    public String getMaxScaleLabel() { return maxScaleLabel;}
    public String[] getScaleLabels() {
            double[] values = getScaleValues();
            String[] scaleLabel = new String[5];
            for (int i=0; i<5; i++) {
                scaleLabel[i] = nf.format(values[i]);
            }
            return scaleLabel;
        }
    public double[] getScaleValues(){
        double[] values = new double[5];
        for (int i=0; i<5; i++){
            values[i] = (1-i/5.0)*minScaleValue+i/5.0*maxScaleValue;
            }
        return values;
    }
}
