using TeleWave.Domain.Library;
using TeleWave.Domain.Programming;

namespace TeleWave.Application.Programming.Groups;

/// <summary>Группа в списке — со сводкой, без состава.</summary>
public sealed record GroupSummaryDto(
    Guid Id,
    string Name,
    string? Description,
    int ItemCount,
    int UnitCount,
    double TotalDurationSeconds,
    bool HasFilter,
    GroupMode Mode,
    DateTimeOffset? StatsComputedAt,
    DateTimeOffset CreatedAt
);

/// <summary>
/// Позиция состава с данными элемента. <paramref name="UnitCount"/> — сколько единиц воспроизведения
/// она даёт: у фильма одна, у сериала и коллекции больше.
/// </summary>
/// <param name="Id">
/// Идентификатор строки в таблице позиций; null — элемент найден правилом динамической группы,
/// своей строки у него нет (а значит, нет и веса с порядком, которые можно править).
/// </param>
/// <param name="Pinned">Закреплён руками в динамической группе — правило его не выбрасывает.</param>
public sealed record GroupItemDto(
    Guid? Id,
    GroupElementKind ElementKind,
    Guid ElementId,
    string ElementName,
    int Weight,
    int Position,
    int UnitCount,
    ShowKind? ShowKind,
    ShowAudience? Audience,
    int? Year,
    Guid? PosterImageId,
    bool Pinned
);

/// <summary>Элемент, исключённый из динамической группы вручную.</summary>
public sealed record GroupExcludedDto(
    GroupElementKind ElementKind,
    Guid ElementId,
    string ElementName
);

public sealed record GroupDto(
    Guid Id,
    string Name,
    string? Description,
    GroupMode Mode,
    GroupFilter? Filter,
    int ItemCount,
    int UnitCount,
    double TotalDurationSeconds,
    DateTimeOffset? StatsComputedAt,
    IReadOnlyList<GroupItemDto> Items,
    IReadOnlyList<GroupExcludedDto> Excluded
);

/// <summary>Кандидат, найденный правилом набора: ещё не в группе, но подходит под фильтр.</summary>
public sealed record GroupCandidateDto(
    GroupElementKind ElementKind,
    Guid ElementId,
    string ElementName,
    int UnitCount,
    ShowKind? ShowKind,
    ShowAudience? Audience,
    int? Year,
    Guid? PosterImageId,
    bool AlreadyInGroup
);
