using System;
using InABox.Core;

namespace InABox.Avalonia.Converters;

public class DateTimeToAgeConverter : AbstractConverter<DateTime, String>
{
        
    public static string FormatTime(DateTime date)
    {
        DateTime now = DateTime.Now;
        String prefix = date > now ? "In" : "";
        String suffix = date <= now ? "ago" : "";
        TimeSpan span = date > now ? date - now : now - date;
            
        if (span.Days > 365)
        {
            int years = (span.Days / 365);
            if (span.Days % 365 != 0)
                years += 1;
            return String.Format("{0} {1} {2} {3}", 
                prefix,
                years, 
                years == 1 ? "year" : "years",
                suffix).Trim();
        }
            
        if (span.Days > 30)
        {
            int months = (span.Days / 30);
            if (span.Days % 31 != 0)
                months += 1;
            return String.Format("{0} {1} {2} {3}", 
                prefix,
                months,
                months == 1 ? "month" : "months",
                suffix).Trim();
        }
            
        if (span.Days > 0)
            return String.Format("{0} {1} {2} {3}", 
                prefix,
                span.Days, 
                span.Days == 1 ? "day" : "days",
                suffix).Trim();
            
        if (span.Hours > 0)
            return String.Format("{0} about {1} {2} {3}", 
                prefix,
                span.Hours, 
                span.Hours == 1 ? "hour" : "hours",
                suffix);
            
        if (span.Minutes > 0)
            return String.Format("{0} {1} {2} {3}",
                prefix,
                span.Minutes, 
                span.Minutes == 1 ? "minute" : "minutes",
                suffix).Trim();
            
        if (span.Seconds > 5)
            return String.Format("{0} {1} seconds {2}", 
                prefix,
                span.Seconds,
                suffix).Trim();
            
        if (span.Seconds <= 5)
            return date > now
                ? "Imminently" 
                : "Just now";
            
        return string.Empty;
    }
        
    public string EmptyValue { get; set; } = String.Empty;

    public string Prefix { get; set; } = string.Empty;
    
    protected override string Convert(DateTime value, object? parameter = null)
    {
        var result = value.IsEmpty()
            ? EmptyValue
            : string.IsNullOrWhiteSpace(Prefix)
                ? FormatTime(value)
                : $"{Prefix} {FormatTime(value)}";
        return result;
    }
}