using System;
using AppConv.General;
using AppConv.Utils;

namespace AppConv.Units {
	class Storage : DecimalUnitConverterSimple<Storage.Units> {
		internal enum Units {
			Invalid = 0,
			Byte,
			Bit
		}

		public Storage() {
			AddUnit(Units.Byte, "B", "byte", "bytes");
			AddUnit(Units.Bit, "b", "bit", "bits");

			SetUnitFactor(Units.Bit, 8M);

			SetInvalidUnitObject(Units.Invalid);

			var bitConversionProperties = new SI.ExtededProperties {
				FactorPredicate = factor => factor > 0 && factor % 3 == 0,
				FromFunctionGenerator = exponent => () => (decimal) Math.Pow(1024, -(int) (exponent / 3)),
				ToFunctionGenerator = exponent => () => (decimal) Math.Pow(1024, (int) (exponent / 3))
			};

			SI.AddSupportCustom(typeof(Units), Units.Byte, new [] { "B" }, new [] { "byte", "bytes" }, ConvertFrom, ConvertTo, Names, bitConversionProperties);
			SI.AddSupportCustom(typeof(Units), Units.Bit, new [] { "b" }, new [] { "bit", "bits" }, ConvertFrom, ConvertTo, Names, bitConversionProperties);
		}
	}
}