Insolation
using Autodesk.DesignScript.Runtime;
using System;
using System.Collections.Generic;
using System.Globalization;
namespace DynamoUnits
{
    [IsVisibleInDynamoLibrary(false)]
    public class Insolation : SIUnit, IComparable, IEquatable<Insolation>
    {
        private const double WHM2_TO_KWHM2 = 0.001;
        private const double WHM2_TO_BT_UFT2 = 0.317;
        public const string WATT_HOURS_PER_SQUARE_METER = "Wh/m²";
        public const string KILLOWATT_HOURS_PER_SQUARE_METER = "kWh/m²";
        public const string BTU_PER_SQUARE_FOOT = "BTU/ft²";
        private InsolationUnit _insolationUnit;
        [IsVisibleInDynamoLibrary(false)]
        public InsolationUnit InsolationUnit {
            get {
                return _insolationUnit;
            }
            set {
                _insolationUnit = value;
            }
        }
        [IsVisibleInDynamoLibrary(false)]
        public double UiInsolationConversion {
            get {
                switch (_insolationUnit) {
                case InsolationUnit.WattHoursPerMeterSquared:
                    return 1;
                case InsolationUnit.KilowattHoursPerMeterSquared:
                    return ToKwhMeter2;
                case InsolationUnit.BTUPerFootSquared:
                    return ToBTUFoot2;
                default:
                    return 1;
                }
            }
        }
        [IsVisibleInDynamoLibrary(false)]
        public override double UnitValue {
            get {
                return _value * UiInsolationConversion;
            }
        }
        public static double ToKwhMeter2 => 0.001;
        public static double ToBTUFoot2 => 0.317;
        public new static Dictionary<string, double> Conversions => new Dictionary<string, double> {
            {
                "Wh/m²",
                1
            },
            {
                "kWh/m²",
                0.001
            },
            {
                "BTU/ft²",
                0.317
            }
        };
        public static Insolation FromDouble(double value)
        {
            return new Insolation(value);
        }
        internal Insolation(double value)
            : base(value)
        {
        }
        public override void SetValueFromString(string value)
        {
            throw new NotImplementedException();
        }
        public override SIUnit Add(SIUnit x)
        {
            if (x is Insolation)
                return new Insolation(_value + x.Value);
            throw new UnitsException(GetType(), x.GetType());
        }
        public override SIUnit Add(double x)
        {
            return new Insolation(_value + x);
        }
        public override SIUnit Subtract(SIUnit x)
        {
            if (x is Insolation)
                return new Insolation(_value - x.Value);
            throw new UnitsException(GetType(), x.GetType());
        }
        public override SIUnit Subtract(double x)
        {
            return new Insolation(_value - x);
        }
        public override SIUnit Multiply(SIUnit x)
        {
            throw new UnitsException(GetType(), x.GetType());
        }
        public override SIUnit Multiply(double x)
        {
            return new Insolation(_value * x);
        }
        public override dynamic Divide(SIUnit x)
        {
            throw new UnitsException(GetType(), x.GetType());
        }
        public override SIUnit Divide(double x)
        {
            return new Insolation(_value / x);
        }
        public override SIUnit Modulo(SIUnit x)
        {
            if (x is Insolation)
                return new Insolation(_value % x.Value);
            throw new UnitsException(GetType(), x.GetType());
        }
        public override SIUnit Modulo(double x)
        {
            return new Insolation(_value % x);
        }
        public override SIUnit Round()
        {
            return new Insolation(Math.Round(_value));
        }
        public override SIUnit Ceiling()
        {
            return new Insolation(Math.Ceiling(_value));
        }
        public override SIUnit Floor()
        {
            return new Insolation(Math.Floor(_value));
        }
        public override double ConvertToHostUnits()
        {
            return base.Value;
        }
        public int CompareTo(object obj)
        {
            if (obj == null)
                return 1;
            Insolation insolation = obj as Insolation;
            if (insolation != null)
                return _value.CompareTo(insolation.Value);
            throw new ArgumentException("Object is not an Insolation.");
        }
        public bool Equals(Insolation other)
        {
            if (other == null)
                return false;
            return Math.Abs(other.Value - _value) < BaseUnit.Epsilon;
        }
        [IsVisibleInDynamoLibrary(false)]
        public override string ToString()
        {
            double num;
            switch (InsolationUnit) {
            case InsolationUnit.WattHoursPerMeterSquared:
                return _value.ToString(BaseUnit.NumberFormat, CultureInfo.InvariantCulture) + "Wh/m²";
            case InsolationUnit.KilowattHoursPerMeterSquared:
                num = _value * ToKwhMeter2;
                return num.ToString(BaseUnit.NumberFormat, CultureInfo.InvariantCulture) + "kWh/m²";
            case InsolationUnit.BTUPerFootSquared:
                num = _value * ToBTUFoot2;
                return num.ToString(BaseUnit.NumberFormat, CultureInfo.InvariantCulture) + "BTU/ft²";
            default:
                return _value.ToString(BaseUnit.NumberFormat, CultureInfo.InvariantCulture) + "Wh/m²";
            }
        }
    }
}