namespace InnovEnergy.Lib.Units;

using T = Percent;

public readonly struct Percent
{
    public static String Unit   => "%"; 
    public static String Symbol => "%"; // ??

    public Percent(Decimal value) => Value = value;

    // not generated
    // TODO: generate?
    
    public Decimal Value { get; }
    public override String ToString() => Value + Unit;
    
    // scalar multiplication
    public static Decimal operator *(Decimal scalar, T t) => scalar * t.Value / 100m;
    public static Decimal operator *(T t, Decimal scalar) => scalar * t.Value / 100m;

    // parallel
    public static Percent operator |(T left, T right) => new T((left.Value + right.Value) / 2m);
    
    // compare
    public static Boolean operator ==(T left, T right) => left.Value == right.Value;
    public static Boolean operator !=(T left, T right) => left.Value != right.Value;
    public static Boolean operator > (T left, T right) => left.Value >  right.Value;
    public static Boolean operator < (T left, T right) => left.Value <  right.Value;
    public static Boolean operator >=(T left, T right) => left.Value >= right.Value;
    public static Boolean operator <=(T left, T right) => left.Value <= right.Value;

    // conversion
    public static implicit operator T(Decimal d) => new T(d);
    public static implicit operator T(Double d)  => new T((Decimal)d);
    public static implicit operator T(Int32 i)   => new T(i);
    public static implicit operator Decimal(T t) => t.Value;

    // equality
    public Boolean Equals(T other) => Value == other.Value;
    public override Boolean Equals(Object? obj) => obj is T other && Equals(other);
    public override Int32 GetHashCode() => Value.GetHashCode();
}