using System.Diagnostics.CodeAnalysis;

namespace StabilityMatrix.Core.Helper;

[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
public static class Size
{
    public const ulong KiB = 1024;
    public const ulong MiB = KiB * 1024;
    public const ulong GiB = MiB * 1024;

    private static string TrimZero(string value)
    {
        return value.TrimEnd('0').TrimEnd('.');
    }

    public static string FormatBytes(ulong bytes, bool trimZero = false)
    {
        return bytes switch
        {
            < KiB => $"{bytes:0} Bytes",
            < MiB
                => (trimZero ? $"{bytes / (double)KiB:0.0}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)KiB:0.0}")
                    + " KiB",
            < GiB
                => (trimZero ? $"{bytes / (double)MiB:0.0}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)MiB:0.0}")
                    + " MiB",
            _
                => (trimZero ? $"{bytes / (double)GiB:0.0}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)GiB:0.0}")
                    + " GiB"
        };
    }

    public static string FormatBase10Bytes(ulong bytes, bool trimZero = false)
    {
        return bytes switch
        {
            < KiB => $"{bytes:0} Bytes",
            < MiB
                => (trimZero ? $"{bytes / (double)KiB:0.0}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)KiB:0.0}")
                    + " KB",
            < GiB
                => (trimZero ? $"{bytes / (double)MiB:0.0}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)MiB:0.0}")
                    + " MB",
            _
                => (trimZero ? $"{bytes / (double)GiB:0.00}".TrimEnd('0').TrimEnd('.') : $"{bytes / (double)GiB:0.00}")
                    + " GB"
        };
    }

    public static string FormatBase10Bytes(long bytes)
    {
        return FormatBase10Bytes(Convert.ToUInt64(bytes));
    }
}
