using System.Net;
using ErsatzTV.Core.Domain.Filler;

namespace ErsatzTV.Core.Domain;

public class Channel
{
    public static readonly string NumberValidator = @"^[0-9]+(\.[0-9]{1,2})?$";

    public Channel(Guid uniqueId) => UniqueId = uniqueId;
    public int Id { get; set; }
    public Guid UniqueId { get; init; }
    public string Number { get; set; }
    public double SortNumber { get; set; }
    public string Name { get; set; }
    public string Group { get; set; }
    public string Categories { get; set; }
    public int FFmpegProfileId { get; set; }
    public FFmpegProfile FFmpegProfile { get; set; }
    public double? SlugSeconds { get; set; }
    public int? WatermarkId { get; set; }
    public ChannelWatermark Watermark { get; set; }
    public int? FallbackFillerId { get; set; }
    public FillerPreset FallbackFiller { get; set; }
    public StreamingMode StreamingMode { get; set; }
    public List<Playout> Playouts { get; set; }
    public List<Artwork> Artwork { get; set; }
    public List<GraphicsElement> GraphicsElements { get; set; }
    public List<ChannelGraphicsElement> ChannelGraphicsElements { get; set; }
    public ChannelStreamSelectorMode StreamSelectorMode { get; set; }
    public string StreamSelector { get; set; }
    public string PreferredAudioLanguageCode { get; set; }
    public string PreferredAudioTitle { get; set; }
    public string PreferredSubtitleLanguageCode { get; set; }
    public ChannelSubtitleMode SubtitleMode { get; set; }
    public ChannelMusicVideoCreditsMode MusicVideoCreditsMode { get; set; }
    public string MusicVideoCreditsTemplate { get; set; }
    public ChannelSongVideoMode SongVideoMode { get; set; }
    public ChannelPlayoutSource PlayoutSource { get; set; }
    public ChannelPlayoutMode PlayoutMode { get; set; }
    public int? MirrorSourceChannelId { get; set; }
    public Channel MirrorSourceChannel { get; set; }
    public TimeSpan? PlayoutOffset { get; set; }
    public ChannelTranscodeMode TranscodeMode { get; set; }
    public ChannelIdleBehavior IdleBehavior { get; set; }
    public bool IsEnabled { get; set; }
    public bool ShowInEpg { get; set; }

    // Immutable creation-provenance (auto-tuned vs user-created); stamped once at insert, never on edit.
    public ChannelOrigin Origin { get; set; }
    public string WebEncodedName => WebUtility.UrlEncode(Name);
}
