using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// Bitte beachten Sie auch den Fortsetzungsband zu diesem Buch, falls
// Ihnen das Programmieren Spaß gemacht hat und Sie sich fortgeschritteneren 
// Themen zuwenden wollen. Alle Informationen zum Fortsetzungsband finden
// Sie auf der Website: www.tiefer-einsteigen.de 

namespace MetricsConverter
{
    /// <summary>
    /// <para>Die Klasse Temperature stellt Methoden zur Verfügung, mit denen</para>
    /// <para>Temperaturen zwischen Celsius, Fahrenheit und Kelvin konvertiert</para>
    /// <para>werden können.</para>
    /// </summary>
    public static class Temperature
    {
        private const double absZeroFahrenheit = -459.67;
        private const double absZeroKelvin = 0;
        private const double absZeroCelsius = -273.15;

        /// <summary>
        /// Konvertiert eine Temperatur von Celsius nach Fahrenheit
        /// </summary>
        /// <param name="celsius">Temperatur in Celsius</param>
        /// <returns>Temperatur in Fahrenheit</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Celsius ist -273,15°. 
        /// </exception>
        public static double CelsiusToFahrenheit(double celsius)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (celsius < absZeroCelsius)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return (celsius * 1.8 + 32);
        }

        /// <summary>
        /// Konvertiert eine Temperatur von Celsius nach Kelvin
        /// </summary>
        /// <param name="celsius">Temperatur in Celsius</param>
        /// <returns>Temperatur in Kelvin</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Celsius ist -273,15°. 
        /// </exception>
        public static double CelsiusToKelvin(double celsius)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (celsius < absZeroCelsius)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return (celsius + Math.Abs(absZeroCelsius));
        }


        /// <summary>
        /// Konvertiert eine Temperatur von Fahrenheit nach Celsius 
        /// </summary>
        /// <param name="fahrenheit">Temperatur in Fahrenheit</param>
        /// <returns>Temperatur in Celsius</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Fahrenheit ist -459.67. 
        /// </exception>
        public static double FahrenheitToCelsius(double fahrenheit)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (fahrenheit < absZeroFahrenheit)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return ((fahrenheit - 32) / 1.8);
        }


        /// <summary>
        /// Konvertiert eine Temperatur von Fahrenheit nach Kelvin
        /// </summary>
        /// <param name="fahrenheit">Temperatur in Fahrenheit</param>
        /// <returns>Temperatur in Kelvin</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Fahrenheit ist -459.67. 
        /// </exception>
        public static double FahrenheitToKelvin(double fahrenheit)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (fahrenheit < absZeroFahrenheit)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return ((fahrenheit + Math.Abs(absZeroFahrenheit)) / 1.8);
        }

        /// <summary>
        /// Konvertiert eine Temperatur von Kelvin nach Fahrnheit
        /// </summary>
        /// <param name="kelvin">Temperatur in Kelvin</param>
        /// <returns>Temperatur in Fahrenheit</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Kelvin ist 0. 
        /// </exception>
        public static double KelvinToFahrenheit(double kelvin)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (kelvin < absZeroKelvin)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return ((kelvin * 1.8) - Math.Abs(absZeroFahrenheit));
        }


        /// <summary>
        /// Konvertiert eine Temperatur von Kelvin nach Celsius
        /// </summary>
        /// <param name="fahrenheit">Temperatur in Kelvin</param>
        /// <returns>Temperatur in Celsius</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// Der absolute Nullpunkt in Kelvin ist 0. 
        /// </exception>
        public static double KelvinToCelsius(double kelvin)
        {
            // Prüfen, ob Parameter im zulässigen Wertebereich
            // wenn nicht, Ausnahme auslösen
            if (kelvin < absZeroKelvin)
                throw new System.ArgumentOutOfRangeException();

            // Temperatur konvertieren
            return (kelvin - Math.Abs(absZeroCelsius));
        }

        /// <summary>
        /// ReadOnly-Property für den kleinsten möglichen Kelvin-Wert.
        /// </summary>
        public static double MinValueKelvin
        {
            get { return absZeroKelvin; }

        }

        /// <summary>
        /// ReadOnly-Property für den kleinsten möglichen Fahrenheit-Wert.
        /// </summary>
        public static double MinValueFahrenheit
        {
            get { return absZeroFahrenheit; }
        }

        /// <summary>
        /// ReadOnly-Property für den kleinsten möglichen Celsius-Wert.
        /// </summary>
        public static double MinValueCelsius
        {
            get { return absZeroCelsius; }

        }
    }
}
