using ErsatzTV.Application.Artworks;
using ErsatzTV.Application.Channels;
using ErsatzTV.Core.Domain;

namespace ErsatzTV.Controllers.Api.Requests;

/// <summary>
///     JSON request body for updating a channel. The channel id comes from the route, not the body;
///     all other fields mirror <see cref="UpdateChannel" />.
/// </summary>
public record UpdateChannelRequest(
    string Name,
    string Number,
    string Group,
    string Categories,
    int FFmpegProfileId,
    double? SlugSeconds,
    ArtworkContentTypeModel Logo,
    ChannelStreamSelectorMode StreamSelectorMode,
    string StreamSelector,
    string PreferredAudioLanguageCode,
    string PreferredAudioTitle,
    ChannelPlayoutSource PlayoutSource,
    ChannelPlayoutMode PlayoutMode,
    int? MirrorSourceChannelId,
    TimeSpan? PlayoutOffset,
    StreamingMode StreamingMode,
    int? WatermarkId,
    int? FallbackFillerId,
    string PreferredSubtitleLanguageCode,
    ChannelSubtitleMode SubtitleMode,
    ChannelMusicVideoCreditsMode MusicVideoCreditsMode,
    string MusicVideoCreditsTemplate,
    ChannelSongVideoMode SongVideoMode,
    ChannelTranscodeMode TranscodeMode,
    ChannelIdleBehavior IdleBehavior,
    bool IsEnabled,
    bool ShowInEpg,
    List<int> GraphicsElementIds)
{
    public UpdateChannel ToCommand(int channelId) =>
        new(
            channelId,
            Name,
            Number,
            Group,
            Categories,
            FFmpegProfileId,
            SlugSeconds,
            (Logo ?? ArtworkContentTypeModel.None).Sanitized(),
            StreamSelectorMode,
            StreamSelector,
            PreferredAudioLanguageCode,
            PreferredAudioTitle,
            PlayoutSource,
            PlayoutMode,
            MirrorSourceChannelId,
            PlayoutOffset,
            StreamingMode,
            WatermarkId,
            FallbackFillerId,
            PreferredSubtitleLanguageCode,
            SubtitleMode,
            MusicVideoCreditsMode,
            MusicVideoCreditsTemplate,
            SongVideoMode,
            TranscodeMode,
            IdleBehavior,
            IsEnabled,
            ShowInEpg,
            GraphicsElementIds ?? []);
}
