using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.Mime;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Api.Attributes;
using Jellyfin.Api.Extensions;
using Jellyfin.Api.Helpers;
using Jellyfin.Api.Models.SubtitleDtos;
using MediaBrowser.Common.Api;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Subtitles;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Subtitles;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Api.Controllers;
/// 
/// Subtitle controller.
/// 
[Route("")]
public class SubtitleController : BaseJellyfinApiController
{
    private readonly IServerConfigurationManager _serverConfigurationManager;
    private readonly ILibraryManager _libraryManager;
    private readonly ISubtitleManager _subtitleManager;
    private readonly ISubtitleEncoder _subtitleEncoder;
    private readonly IMediaSourceManager _mediaSourceManager;
    private readonly IProviderManager _providerManager;
    private readonly IFileSystem _fileSystem;
    private readonly ILogger _logger;
    /// 
    /// Initializes a new instance of the  class.
    /// 
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    /// Instance of  interface.
    public SubtitleController(
        IServerConfigurationManager serverConfigurationManager,
        ILibraryManager libraryManager,
        ISubtitleManager subtitleManager,
        ISubtitleEncoder subtitleEncoder,
        IMediaSourceManager mediaSourceManager,
        IProviderManager providerManager,
        IFileSystem fileSystem,
        ILogger logger)
    {
        _serverConfigurationManager = serverConfigurationManager;
        _libraryManager = libraryManager;
        _subtitleManager = subtitleManager;
        _subtitleEncoder = subtitleEncoder;
        _mediaSourceManager = mediaSourceManager;
        _providerManager = providerManager;
        _fileSystem = fileSystem;
        _logger = logger;
    }
    /// 
    /// Deletes an external subtitle file.
    /// 
    /// The item id.
    /// The index of the subtitle file.
    /// Subtitle deleted.
    /// Item not found.
    /// A .
    [HttpDelete("Videos/{itemId}/Subtitles/{index}")]
    [Authorize(Policy = Policies.RequiresElevation)]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public async Task DeleteSubtitle(
        [FromRoute, Required] Guid itemId,
        [FromRoute, Required] int index)
    {
        var item = _libraryManager.GetItemById(itemId, User.GetUserId());
        if (item is null)
        {
            return NotFound();
        }
        await _subtitleManager.DeleteSubtitles(item, index).ConfigureAwait(false);
        return NoContent();
    }
    /// 
    /// Search remote subtitles.
    /// 
    /// The item id.
    /// The language of the subtitles.
    /// Optional. Only show subtitles which are a perfect match.
    /// Subtitles retrieved.
    /// Item not found.
    /// An array of .
    [HttpGet("Items/{itemId}/RemoteSearch/Subtitles/{language}")]
    [Authorize(Policy = Policies.SubtitleManagement)]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public async Task>> SearchRemoteSubtitles(
        [FromRoute, Required] Guid itemId,
        [FromRoute, Required] string language,
        [FromQuery] bool? isPerfectMatch)
    {
        var item = _libraryManager.GetItemById