using LiteCqrs;
using TeleWave.Application.Common.Models;

namespace TeleWave.Application.Programming.Templates.Validate;

/// <summary>
/// Проверки сетки по правилам, до генерации (см. 5.1). Ничего не считает по ленте — только по
/// шаблону и статистике групп, поэтому дёшево и вызывается на каждом открытии редактора.
/// </summary>
public sealed record ValidateTemplateQuery(Guid ChannelId)
    : IQuery<Result<IReadOnlyList<TemplateIssueDto>>>;

public enum TemplateIssueKind
{
    /// <summary>Слот ссылается на пустую группу — место закроет фон.</summary>
    GroupEmpty = 0,

    /// <summary>Позиций в группе меньше, чем выходов слота в неделю.</summary>
    GroupTooSmall = 1,

    /// <summary>Интервал суток не покрыт ни одним слотом, даже фоновым.</summary>
    GridGap = 2,

    /// <summary>Два слота одного слоя перекрываются — сыграет только первый.</summary>
    SlotOverlap = 3,

    /// <summary>Остывание длиннее, чем группа успевает прокрутиться.</summary>
    CooldownUnreachable = 4,

    /// <summary>В группе есть контент строже, чем разрешает окно детского времени.</summary>
    AudienceConflict = 5,

    /// <summary>Слот без группы: контент брать неоткуда.</summary>
    GroupMissing = 6,
}

/// <summary>Насколько это больно: <c>Error</c> — в эфире будет фон вместо контента.</summary>
public enum TemplateIssueSeverity
{
    Warning = 0,
    Error = 1,
}

public sealed record TemplateIssueDto(
    TemplateIssueKind Kind,
    TemplateIssueSeverity Severity,
    Guid? LayerId,
    Guid? SlotId,
    string Details
);
