#nullable disable
namespace EllieBot.Modules.Music;

public static class MusicExtensions
{
    public static string PrettyTotalTime(this IMusicPlayer mp)
    {
        long sum = 0;
        foreach (var track in mp.GetQueuedTracks())
        {
            if (track.Duration == TimeSpan.MaxValue)
                return "∞";

            sum += track.Duration.Ticks;
        }

        var total = new TimeSpan(sum);

        return total.ToString(@"hh\:mm\:ss");
    }

    public static string PrettyVolume(this IMusicPlayer mp)
        => $"🔉 {(int)(mp.Volume * 100)}%";

    public static string PrettyName(this ITrackInfo trackInfo)
        => $"**[{trackInfo.Title.TrimTo(60).Replace("[", "\\[").Replace("]", "\\]")}]({trackInfo.Url.TrimTo(50, true)})**";

    public static string PrettyInfo(this IQueuedTrackInfo trackInfo)
        => $"{trackInfo.PrettyTotalTime()} | {trackInfo.Platform} | {trackInfo.Queuer}";

    public static string PrettyFullName(this IQueuedTrackInfo trackInfo)
        => $@"{trackInfo.PrettyName()}
		`{trackInfo.PrettyTotalTime()} | {trackInfo.Platform} | {Format.Sanitize(trackInfo.Queuer.TrimTo(15))}`";

    public static string PrettyTotalTime(this ITrackInfo trackInfo)
    {
        if (trackInfo.Duration == TimeSpan.Zero)
            return "(?)";
        if (trackInfo.Duration == TimeSpan.MaxValue)
            return "∞";
        if (trackInfo.Duration.TotalHours >= 1)
            return trackInfo.Duration.ToString("""hh\:mm\:ss""");

        return trackInfo.Duration.ToString("""mm\:ss""");
    }

    public static ICachableTrackData ToCachedData(this ITrackInfo trackInfo, string id)
        => new CachableTrackData
        {
            TotalDurationMs = trackInfo.Duration.TotalMilliseconds,
            Id = id,
            Thumbnail = trackInfo.Thumbnail,
            Url = trackInfo.Url,
            Platform = trackInfo.Platform,
            Title = trackInfo.Title
        };
}