using System;
using System.ComponentModel.DataAnnotations;
using System.Net.Mime;
using System.Text.Json;
using Jellyfin.Api.Attributes;
using Jellyfin.Api.Constants;
using Jellyfin.Api.Models.ConfigurationDtos;
using Jellyfin.Extensions.Json;
using MediaBrowser.Common.Api;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Branding;
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]
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