using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace TimeScheduler.Common
{
  /// <summary>Basis-Klasse für Objekte, die sich der Oberfläche mitteilen möchten</summary>
  public abstract class NotifyableObject : INotifyPropertyChanged
  {
    /// <summary>Setzt den neuen Wert auf das Feld, wenn sie unterschiedlich sind und wird das <see cref="PropertyChanged"/>-Ereignis</summary>
    /// <typeparam name="T">Typ des Feldes</typeparam>
    /// <param name="field">Verweis aufs Feld</param>
    /// <param name="newValue">Neuer Wert</param>
    /// <param name="propertyName">Name der Eigenschaft, die verändert wird</param>
    /// <returns><c>Wahr</c>, wenn es ein neuer Wert ist, sonst <c>Falsch</c></returns>
    protected bool SetField<T>(ref T field, T newValue, [CallerMemberName]string propertyName = null)
    {
      // Wenn beide Werte gleich sind, dann nichts tun
      if (object.Equals(field, newValue)) return false;
      //if (Comparer<T>.Default.Compare(field, newValue) == 0) return false;

      field = newValue;
      OnPropertyChanged(propertyName);
      return true;
    }

    /// <summary>Wirft das Ereignis <see cref="PropertyChanged"/></summary>
    /// <param name="propertyName"></param>
    protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
      var handler = PropertyChanged;
      if (handler != null)
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
    /// <summary>Ereignis um der Oberfläche mitzuteilen, dass sich eine Eigenschaft verändert hat</summary>
    public event PropertyChangedEventHandler PropertyChanged;
  }
}
