#nullable enable

using ErsatzTV.Application.Artworks;
using ErsatzTV.Application.Channels;
using ErsatzTV.Core.Api.Channels;
using ErsatzTV.Core.Api.LibraryBrowse;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Scheduling;

namespace ErsatzTV.Controllers.Api.Requests;

/// <summary>
///     Composite request to create a channel, its generated schedule/playlist and a classic playout in one call.
///     Template defaults are stamped at create time; any value set in <see cref="Advanced" /> overrides the template.
///     A single-item lineup references its target directly; a multi-item lineup is played in order via a generated
///     system playlist.
/// </summary>
public record CreateChannelFromLineupRequest(
    string Name,
    string Number,
    string Group,
    string Categories,
    ArtworkContentTypeModel Logo,
    bool IsEnabled,
    bool ShowInEpg,
    int TemplateId,
    CreateChannelFromLineupAdvancedOptionsRequest? Advanced,
    List<CreateChannelFromLineupItemRequest> Lineup)
{
    public CreateChannelFromLineup ToCommand() =>
        new(
            Name,
            Number,
            Group,
            Categories,
            (Logo ?? ArtworkContentTypeModel.None).Sanitized(),
            IsEnabled,
            ShowInEpg,
            TemplateId,
            Advanced?.ToCommand() ?? new CreateChannelFromLineupAdvancedOptions(),
            Lineup.Map(i => i.ToCommand()).ToList());
}

public record CreateChannelFromLineupAdvancedOptionsRequest(
    PlaybackOrder? PlaybackOrder = null,
    int? FFmpegProfileId = null,
    int? WatermarkId = null,
    int? FallbackFillerId = null,
    int? PreRollFillerId = null,
    int? MidRollFillerId = null,
    int? PostRollFillerId = null,
    ChannelStreamSelectorMode? StreamSelectorMode = null,
    string? StreamSelector = null,
    string? PreferredAudioLanguageCode = null,
    string? PreferredAudioTitle = null,
    ChannelPlayoutSource? PlayoutSource = null,
    ChannelPlayoutMode? PlayoutMode = null,
    StreamingMode? StreamingMode = null,
    string? PreferredSubtitleLanguageCode = null,
    ChannelSubtitleMode? SubtitleMode = null,
    ChannelMusicVideoCreditsMode? MusicVideoCreditsMode = null,
    string? MusicVideoCreditsTemplate = null,
    ChannelSongVideoMode? SongVideoMode = null,
    ChannelTranscodeMode? TranscodeMode = null,
    ChannelIdleBehavior? IdleBehavior = null,
    bool? ShuffleScheduleItems = null,
    bool? RandomStartPoint = null,
    FixedStartTimeBehavior? FixedStartTimeBehavior = null,
    List<CreateChannelFromLineupClearField>? Clear = null)
{
    public CreateChannelFromLineupAdvancedOptions ToCommand() =>
        new(
            PlaybackOrder,
            FFmpegProfileId,
            WatermarkId,
            FallbackFillerId,
            PreRollFillerId,
            MidRollFillerId,
            PostRollFillerId,
            StreamSelectorMode,
            StreamSelector,
            PreferredAudioLanguageCode,
            PreferredAudioTitle,
            PlayoutSource,
            PlayoutMode,
            StreamingMode,
            PreferredSubtitleLanguageCode,
            SubtitleMode,
            MusicVideoCreditsMode,
            MusicVideoCreditsTemplate,
            SongVideoMode,
            TranscodeMode,
            IdleBehavior,
            ShuffleScheduleItems,
            RandomStartPoint,
            FixedStartTimeBehavior,
            Clear);
}

public record CreateChannelFromLineupItemRequest(
    LibraryBrowseMediaType MediaType,
    CollectionType CollectionType,
    int? CollectionId,
    int? MultiCollectionId,
    int? SmartCollectionId,
    int? RerunCollectionId,
    int? MediaItemId,
    int? PlaylistId)
{
    public CreateChannelFromLineupItem ToCommand() =>
        new(
            MediaType,
            CollectionType,
            CollectionId,
            MultiCollectionId,
            SmartCollectionId,
            RerunCollectionId,
            MediaItemId,
            PlaylistId);
}
