package usda.weru.soil;

//import	java.awt.*;
import javax.swing.*;

/**
 *
 * @author maxerdwien
 */
public class ErrorRange {

    String title;
    double loValue;
    double hiValue;

    /**
     * wjr
     * @param lo
     */
    public void setLowValue(double lo) {
        loValue = lo;
    }

    /**
     * wjr
     * @param high
     */
    public void setHighValue(double high) {
        hiValue = high;
    }

    /********************************************************************* wjr */
    /**
     * wjr
     * @param ti
     * @param lo
     * @param hi
     */
    /* entry for integer or double */
    public ErrorRange(String ti, double lo, double hi) {
        title = ti;
        loValue = lo;
        hiValue = hi;
    }

    /**
     * wjr
     * @param ti
     */
    /* entry for string */
    public ErrorRange(String ti) {
        title = ti;
        loValue = 0;
        hiValue = -1;
    }

    /**
     * wjr
     * @param label
     * @return
     */
    public final int errorBox(String label) {
        int rtnval = checkRange(label);
        return errorBox(rtnval);
    }

    /**
     *
     * @param value
     * @return
     */
    public final int errorBox(double value) {
        int rtnval = checkRange(value);
        return errorBox(rtnval);
    }

    private int errorBox(int rtnval) {
        String message = null;
        //System.out.println("ER_eB: " + rtnval);
        switch (rtnval) {
            case -1:
            case -2:
            case 1:
                message = "\nRange = " + loValue + " to " + hiValue + ".";
                break;
            case 2:
                message = "\nInvalid character for number";
                break;
            case 3:
                message = "\nBlank entry is not valid";
                break;
        }

        if (rtnval != 0) {
            JOptionPane.showMessageDialog(new JPanel(),
                    title + message, "Invalid input", JOptionPane.WARNING_MESSAGE);
        }
        return rtnval;
    }

    /**
     * wjr *
     * @param label
     * @return
     */
    public int checkRange(String label) {
        double range = 0.0;

        if (loValue == 0 && hiValue == -1) {		// it's a string
            if (label == null) {
                return -3;
            }
            if (label.trim().length() > 0) {
                return 0;
            }
            return -3;
        }

////System.out.println("checkRange: " + title + " " + label + " " + loValue + " " + hiValue);
        if (label == null) {
            return -2;
        }
        try {										// it's a number
            range = Double.valueOf(label).doubleValue();
            if (range < loValue || range > hiValue) {
                return (range < loValue) ? -1 : 1;
            }
        } catch (NumberFormatException e) {
            return -2;
        }
        return 0;

    }

    /**
     *
     * @param value
     * @return
     */
    public int checkRange(double value) {
        if (Double.isNaN(value)) {
            return -1;
        }
        if (value < loValue || value > hiValue) {
            return (value < loValue) ? -1 : 1;
        }
        return 0;
    }

    /**
     * wjr *
     * @param idx
     * @return
     */
    public String adjValue(int idx) {
        if (idx == -3) {
            return "no value given";
        }
        double rtn = 0;
        switch (idx) {
            case -1:
                rtn = loValue;
                break;
            case 1:
                rtn = hiValue;
                break;
            case -2:
                rtn = (loValue + hiValue) / 2;
                break;
        }
        int numdigits = (int) -(Math.log(rtn) / Math.log(10.0)) + 4;
        if (numdigits < 0) {
            numdigits = 0;
        }
        return usda.weru.util.Util.formatDouble(rtn, numdigits);
    }

    /**
     * wjr *
     * @param inpval
     * @return
     */
    public double adjValue(double inpval) {
        if (inpval < loValue) {
            return loValue;
        }
        if (inpval > hiValue) {
            return hiValue;
        }
        return inpval;
    }

    /**
     * wjr *
     * @return
     */
    public String getToolTipText() {
        if (loValue > hiValue) {
            return title;
        } else {
            return title + " " + loValue + " - " + hiValue;
        }
    }

    /************************************************************************ wjr **/
}
