using TeleWave.Domain.Programming;

namespace TeleWave.Application.Programming.Templates;

public sealed record SlotDto(
    Guid Id,
    Guid LayerId,
    int? Weekday,
    TimeOnly TargetStart,
    int TargetDurationMinutes,
    string Title,
    Daypart Daypart,
    SlotKind SlotKind,
    Guid? GroupId,
    string? GroupName,
    SlotStrategy? Strategy,
    RepeatSource? RepeatSource,
    SlotBlockMode BlockMode,
    int BlockValue,
    OverflowPolicy OverflowPolicy,
    bool IsAnchor,
    int MaxDriftMinutes,
    int? SnapToMinutes,
    Guid? JunctionBetweenId,
    Guid? JunctionAfterId
);

public sealed record GridLayerDto(
    Guid Id,
    string Name,
    int Priority,
    bool IsEnabled,
    bool IsBackground,
    LayerApplicability? Applicability,
    IReadOnlyList<SlotDto> Slots
);

public sealed record ScheduleTemplateDto(
    Guid Id,
    Guid ChannelId,
    string Name,
    Guid? FallbackGroupId,
    Guid? DefaultJunctionId,
    /// <summary>Правила отбора кандидатов канала: детское время и потолок повторов.</summary>
    PlanningRules? Rules,
    int Revision,
    int AppliedRevision,
    /// <summary>Есть ли правки правил, ещё не применённые к эфиру.</summary>
    bool HasPendingChanges,
    /// <summary>Есть ли к чему откатываться — снимок появляется при первом применении.</summary>
    bool CanRestore,
    /// <summary>Время канала — сетка задаётся в нём, а не в UTC.</summary>
    int UtcOffsetMinutes,
    TimeOnly DayStartTime,
    IReadOnlyList<GridLayerDto> Layers
);
