package ecoparasite.population;

/**
 * Classe qui permet de gérer un intervalle de données issues d'un CSV.
 *
 * Trois données : minimum, maximum et moyenne entre minimum et maximum.
 */
public class PopulationArgInterval {

    /**
     * Valeur minimale.
     */
    private Double min;

    /**
     * Valeur maximale.
     */
    private Double max;

    /**
     * Moyenne entre la valeur minimale et maximale.
     */
    private Double mean;

    /**
     * Constructeur. La moyenne doit être précisée.
     * @param min Valeur minimale
     * @param max Valeur maximale
     * @param mean Moyenne
     */
    public PopulationArgInterval(Double min, Double max, Double mean) {
        this.min = min;
        this.max = max;
        this.mean = mean;
    }

    /**
     * Constructeur. La moyenne est calculé automatiquement.
     * @param min Valeur minimale
     * @param max Valeur maximale.
     */
    public PopulationArgInterval(Double min, Double max) {
        this.min = min;
        this.max = max;
        this.mean = ( this.max + this.min ) / 2;
    }

    public Double getMin() {
        return this.min;
    }
    public Double getMax() {
        return this.max;
    }
    public Double getMean() {
        return this.mean;
    }

    /**
     * Permet de transformer un intervalle en double.
     * Si le minimum est égal au maximum, cette valeur est retourné.
     * Sinon la moyenne est retourné.
     *
     * @return La valeur transformée en Double.
     */
    public Double transformToDouble(){
        if( this.min == this.max )
            return this.min;
        return this.mean;
    }

    /**
     * Permet de transformer une String (Extraite d'un fichier CSV) et de la transformer en Intervalle.
     * Gère les séparateurs +/- ainsi que l'entre deux. Sinon, elle sera juste convertie avec minimum = maximum.
     *
     * @param rawValue La valeur brute.
     * @return La valeur en tant qu'intervalle.
     */
    public static PopulationArgInterval fromString( String rawValue ){

        if( rawValue.contains( "±" ) ){ // Plus ou moins.

            String[] numbers = rawValue.split("±");
            Double mean = Double.parseDouble(numbers[0].trim());
            Double interval = Double.parseDouble(numbers[1].trim());
            return new PopulationArgInterval(mean - interval, mean + interval, mean);

        } else if( rawValue.contains( " - " ) ){ // Entre.

            String[] numbers = rawValue.split("-");
            Double min = Double.parseDouble(numbers[0].trim());
            Double max = Double.parseDouble(numbers[1].trim());
            return new PopulationArgInterval(min, max);

        } else {
            Double number =  Double.parseDouble(rawValue);
            return new PopulationArgInterval(number, number);
        }

    }

}
