/*
 * @(#)BooleanRange.java 5/27/2014
 *
 * Copyright 2002 - 2014 JIDE Software Inc. All rights reserved.
 */

package com.jidesoft.range;

public class BooleanRange extends AbstractRange<Boolean> {
    private Boolean _lower = false;
    private Boolean _upper = true;

    public BooleanRange(boolean lower, boolean upper) {
        adjust(lower, upper);
    }

    @Override
    public Range<Boolean> createIntermediate(Range<Boolean> targetRange, double position) {
        return null;
    }

    @Override
    public Boolean lower() {
        return _lower;
    }

    @Override
    public Boolean upper() {
        return _upper;
    }

    @Override
    public void adjust(Boolean lower, Boolean upper) {
        setMin(lower);
        setMax(upper);
    }

    protected void setMin(boolean lower) {
        boolean old = _lower;
        _lower = lower;
        firePropertyChange(PROPERTY_MIN, old, _lower.booleanValue());
    }

    protected void setMax(boolean upper) {
        boolean old = _upper;
        _upper = upper;
        firePropertyChange(PROPERTY_MAX, old, _upper.booleanValue());
    }

    @Override
    public double minimum() {
        throw new UnsupportedOperationException("minimum() is not implemented in StringRange");
    }

    @Override
    public double maximum() {
        throw new UnsupportedOperationException("maximum() is not implemented in StringRange");
    }

    @Override
    public double size() {
        return _lower.compareTo(_upper);
    }

    @Override
    public boolean contains(Boolean x) {
        if (x == null) {
            return false;
        }
        return x.compareTo(lower()) >= 0 && x.compareTo(upper()) <= 0;
    }

    @Override
    public String toString() {
        return "BooleanRange{" +
                "lower='" + _lower + '\'' +
                ", upper='" + _upper + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof BooleanRange)) return false;

        BooleanRange that = (BooleanRange) o;

        if (_lower != null ? !_lower.equals(that._lower) : that._lower != null) return false;
        if (_upper != null ? !_upper.equals(that._upper) : that._upper != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = _lower != null ? _lower.hashCode() : 0;
        result = 31 * result + (_upper != null ? _upper.hashCode() : 0);
        return result;
    }
}
