namespace HKW.HKWUtils;

/// <summary>
/// 可观察的范围
/// </summary>
/// <typeparam name="T">类型</typeparam>
public class ObservableRange<T>
    : ObservableClass<ObservableRange<T>>,
        IEquatable<ObservableRange<T>>
{
    private T _min;
    public T Min
    {
        get => _min;
        set => SetProperty(ref _min, value);
    }

    private T _max;
    public T Max
    {
        get => _max;
        set => SetProperty(ref _max, value);
    }

    public ObservableRange() { }

    public ObservableRange(T min, T max)
    {
        _min = min;
        _max = max;
    }

    /// <summary>
    /// 复制一个新的对象
    /// </summary>
    /// <returns>新对象</returns>
    public ObservableRange<T> Copy()
    {
        return new(Min, Max);
    }

    #region Other

    /// <inheritdoc/>
    public override int GetHashCode()
    {
        return HashCode.Combine(Min, Max);
    }

    /// <inheritdoc/>
    public override bool Equals(object? obj)
    {
        return obj is ObservableRange<T> temp
            && EqualityComparer<T>.Default.Equals(Min, temp.Min)
            && EqualityComparer<T>.Default.Equals(Max, temp.Max);
    }

    /// <inheritdoc/>
    public bool Equals(ObservableRange<T>? other)
    {
        return Equals(obj: other);
    }

    /// <inheritdoc/>
    public static bool operator ==(ObservableRange<T> a, ObservableRange<T> b)
    {
        return Equals(a, b);
    }

    /// <inheritdoc/>
    public static bool operator !=(ObservableRange<T> a, ObservableRange<T> b)
    {
        return Equals(a, b) is not true;
    }

    #endregion
}