using System.Text.Json;
using System.Text.Json.Serialization;

namespace TeleWave.Application.Programming.Templates;

/// <summary>
/// Условия показа врезки. Хранятся структурно, а не выражением: парсер выражений, его валидация
/// и отдельный UI обошлись бы дорого, а покрывают ровно те же несколько реальных случаев.
/// </summary>
public sealed record JunctionConditions(
    /// <summary>Ставить только при смене шоу, а не между сериями одного.</summary>
    bool OnlyOnElementChange = false,
    /// <summary>Не ставить чаще, чем раз в N минут (0 — без ограничения).</summary>
    int MinMinutesBetween = 0
)
{
    private static readonly JsonSerializerOptions Options = new()
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
        Converters = { new JsonStringEnumConverter() },
    };

    public string ToJson() => JsonSerializer.Serialize(this, Options);

    public static JunctionConditions? FromJson(string? json)
    {
        if (string.IsNullOrWhiteSpace(json))
            return null;

        try
        {
            return JsonSerializer.Deserialize<JunctionConditions>(json, Options);
        }
        catch (JsonException)
        {
            return null;
        }
    }
}
