namespace InnovEnergy.Lib.Utils;

public static class DateTimeUtils
{
    public static DateTime Epoch { get; } = new DateTime
    (
        year: 1970,
        month: 1,
        day: 1,
        hour: 0,
        minute: 0,
        second: 0,
        DateTimeKind.Utc
    );
    
    public static Int64 ToUnixTime(this DateTime dateTime)
    {
        var timeSinceEpoch = dateTime.ToUniversalTime() - Epoch;
        return timeSinceEpoch.Ticks / TimeSpan.TicksPerSecond;
    }

    public static DateTime DateTimeFromUnixTime(this IConvertible unixTime)
    {
        var epochTicks = Epoch.Ticks + unixTime.ConvertTo<Double>() * TimeSpan.TicksPerSecond;
        
        return new DateTime(epochTicks.ConvertTo<Int64>(), DateTimeKind.Utc);
    }

    public static DateTime Round(this DateTime date, TimeSpan interval)
    {
        var i = interval.Ticks;
        var t = date.Ticks;
        
        var intervalTicks = (t + i / 2 + 1) / i * i;
        
        return new DateTime(intervalTicks, date.Kind);
    }
}