using System;
using System.ComponentModel.DataAnnotations;
using System.Net.Mime;
using System.Text.Json;
using System.Threading.Tasks;
using Jellyfin.Api.Attributes;
using Jellyfin.Api.Constants;
using Jellyfin.Api.Models.ConfigurationDtos;
using Jellyfin.Extensions.Json;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Configuration;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Jellyfin.Api.Controllers
{
    /// 
    /// Configuration Controller.
    /// 
    [Route("System")]
    [Authorize(Policy = Policies.DefaultAuthorization)]
    public class ConfigurationController : BaseJellyfinApiController
    {
        private readonly IServerConfigurationManager _configurationManager;
        private readonly IMediaEncoder _mediaEncoder;
        private readonly JsonSerializerOptions _serializerOptions = JsonDefaults.Options;
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// Instance of the  interface.
        /// Instance of the  interface.
        public ConfigurationController(
            IServerConfigurationManager configurationManager,
            IMediaEncoder mediaEncoder)
        {
            _configurationManager = configurationManager;
            _mediaEncoder = mediaEncoder;
        }
        /// 
        /// Gets application configuration.
        /// 
        /// Application configuration returned.
        /// Application configuration.
        [HttpGet("Configuration")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        public ActionResult GetConfiguration()
        {
            return _configurationManager.Configuration;
        }
        /// 
        /// Updates application configuration.
        /// 
        /// Configuration.
        /// Configuration updated.
        /// Update status.
        [HttpPost("Configuration")]
        [Authorize(Policy = Policies.RequiresElevation)]
        [ProducesResponseType(StatusCodes.Status204NoContent)]
        public ActionResult UpdateConfiguration([FromBody, Required] ServerConfiguration configuration)
        {
            _configurationManager.ReplaceConfiguration(configuration);
            return NoContent();
        }
        /// 
        /// Gets a named configuration.
        /// 
        /// Configuration key.
        /// Configuration returned.
        /// Configuration.
        [HttpGet("Configuration/{key}")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesFile(MediaTypeNames.Application.Json)]
        public ActionResult