using Kbx.Shared.ExternalData.Generated;

namespace Kbx.Shared.ExternalData;

public static class KbxExternalDataFreshnessPolicy
{
    public static KbxExternalDataState Evaluate(KbxExternalDataDatasetDefinition dataset, DateTimeOffset now, DateTimeOffset? freshUntil, DateTimeOffset? usableUntil)
    {
        if (freshUntil is null && dataset.FreshnessMode == "provider-defined") return KbxExternalDataState.Unavailable;
        if (freshUntil is not null && now <= freshUntil.Value) return KbxExternalDataState.Fresh;
        if (dataset.FreshnessMode == "strict") return KbxExternalDataState.Expired;
        if (usableUntil is not null && now <= usableUntil.Value) return KbxExternalDataState.Stale;
        return KbxExternalDataState.Expired;
    }

    public static (DateTimeOffset? FreshUntil, DateTimeOffset? UsableUntil) Window(KbxExternalDataDatasetDefinition dataset, DateTimeOffset receivedAt)
    {
        if (dataset.FreshForSeconds is null) return (null, null);
        var fresh = receivedAt.AddSeconds(dataset.FreshForSeconds.Value);
        var usable = dataset.FreshnessMode == "stale-while-revalidate" && dataset.MaxStaleSeconds is > 0
            ? fresh.AddSeconds(dataset.MaxStaleSeconds.Value)
            : fresh;
        return (fresh, usable);
    }
}
