using System;

namespace TimeScheduler.Common
{
  /// <summary>Mathematische Funktionen</summary>
  public static class MathUtil
  {
    /// <summary>Verringert/Erhöht die Zahl</summary>
    /// <param name="num">Nummer die verändert werden soll</param>
    /// <param name="minValue">Minmal erlaubter Wert</param>
    /// <param name="maxValue">Maximal erlaubter Wert</param>
    /// <param name="increment">Veränderungsrichtung</param>
    /// <returns>Der veränderte Wert</returns>
    public static int IncrementDecrementNumber(string num, int minValue, int maxValue, bool increment)
    {
      int newNum = ValidateNumber(num, minValue, maxValue);
      if (increment)
        newNum = Math.Min(newNum + 1, maxValue);
      else
        newNum = Math.Max(newNum - 1, 0);
      return newNum;
    }

    /// <summary>Prüft den Wert auf den gültigen Bereich</summary>
    /// <param name="newNum">zu Prüfender Wert</param>
    /// <param name="minValue">Minmal erlaubter Wert</param>
    /// <param name="maxValue">Maximal erlaubter Wert</param>
    /// <returns>Der Wert, wenn er im Bereich liegt, sonst der jeweilige Grenzwert, der überschriten wurde</returns>
    public static int ValidateNumber(string newNum, int minValue, int maxValue)
    {
      int num;
      if (!int.TryParse(newNum, out num))
        num = 0;

      return ValidateNumber(num, minValue, maxValue);
    }

    /// <summary>Prüft den Wert auf den gültigen Bereich</summary>
    /// <param name="newNum">zu Prüfender Wert</param>
    /// <param name="minValue">Minmal erlaubter Wert</param>
    /// <param name="maxValue">Maximal erlaubter Wert</param>
    /// <returns>Der Wert, wenn er im Bereich liegt, sonst der jeweilige Grenzwert, der überschriten wurde</returns>
    public static int ValidateNumber(int newNum, int minValue, int maxValue)
    {
      newNum = Math.Max(newNum, minValue);
      newNum = Math.Min(newNum, maxValue);

      return newNum;
    }
  }
}
