#nullable enable
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Model.MediaInfo;
using Microsoft.Extensions.Logging;
using Nikse.SubtitleEdit.Core;
using ILogger = Microsoft.Extensions.Logging.ILogger;
using SubtitleFormat = Nikse.SubtitleEdit.Core.SubtitleFormats.SubtitleFormat;
namespace MediaBrowser.MediaEncoding.Subtitles
{
    /// 
    /// SubStation Alpha subtitle parser.
    /// 
    /// The .
    public abstract class SubtitleEditParser : ISubtitleParser
        where T : SubtitleFormat, new()
    {
        private readonly ILogger _logger;
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The logger.
        protected SubtitleEditParser(ILogger logger)
        {
            _logger = logger;
        }
        /// 
        public SubtitleTrackInfo Parse(Stream stream, CancellationToken cancellationToken)
        {
            var subtitle = new Subtitle();
            var subRip = new T();
            var lines = stream.ReadAllLines().ToList();
            subRip.LoadSubtitle(subtitle, lines, "untitled");
            if (subRip.ErrorCount > 0)
            {
                _logger.LogError("{ErrorCount} errors encountered while parsing subtitle.");
            }
            var trackInfo = new SubtitleTrackInfo();
            int len = subtitle.Paragraphs.Count;
            var trackEvents = new SubtitleTrackEvent[len];
            for (int i = 0; i < len; i++)
            {
                var p = subtitle.Paragraphs[i];
                trackEvents[i] = new SubtitleTrackEvent(p.Number.ToString(CultureInfo.InvariantCulture), p.Text)
                {
                    StartPositionTicks = p.StartTime.TimeSpan.Ticks,
                    EndPositionTicks = p.EndTime.TimeSpan.Ticks
                };
            }
            trackInfo.TrackEvents = trackEvents;
            return trackInfo;
        }
    }
}