using System;
using MediaBrowser.Controller.BaseItemManager;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Configuration;
using Moq;
using Xunit;

namespace Jellyfin.Controller.Tests
{
    public class BaseItemManagerTests
    {
        [Theory]
        [InlineData(typeof(Book), "LibraryEnabled", true)]
        [InlineData(typeof(Book), "LibraryDisabled", false)]
        [InlineData(typeof(MusicArtist), "Enabled", true)]
        [InlineData(typeof(MusicArtist), "ServerDisabled", false)]
        public void IsMetadataFetcherEnabled_ChecksOptions_ReturnsExpected(Type itemType, string fetcherName, bool expected)
        {
            BaseItem item = (BaseItem)Activator.CreateInstance(itemType)!;

            var libraryTypeOptions = itemType == typeof(Book)
                ? new TypeOptions
                {
                    Type = "Book",
                    MetadataFetchers = new[] { "LibraryEnabled" }
                }
                : null;

            var serverConfiguration = new ServerConfiguration();
            foreach (var typeConfig in serverConfiguration.MetadataOptions)
            {
                typeConfig.DisabledMetadataFetchers = new[] { "ServerDisabled" };
            }

            var serverConfigurationManager = new Mock<IServerConfigurationManager>();
            serverConfigurationManager.Setup(scm => scm.Configuration)
                .Returns(serverConfiguration);

            var baseItemManager = new BaseItemManager(serverConfigurationManager.Object);
            var actual = baseItemManager.IsMetadataFetcherEnabled(item, libraryTypeOptions, fetcherName);

            Assert.Equal(expected, actual);
        }

        [Theory]
        [InlineData(typeof(Book), "LibraryEnabled", true)]
        [InlineData(typeof(Book), "LibraryDisabled", false)]
        [InlineData(typeof(MusicArtist), "Enabled", true)]
        [InlineData(typeof(MusicArtist), "ServerDisabled", false)]
        public void IsImageFetcherEnabled_ChecksOptions_ReturnsExpected(Type itemType, string fetcherName, bool expected)
        {
            BaseItem item = (BaseItem)Activator.CreateInstance(itemType)!;

            var libraryTypeOptions = itemType == typeof(Book)
                ? new TypeOptions
                {
                    Type = "Book",
                    ImageFetchers = new[] { "LibraryEnabled" }
                }
                : null;

            var serverConfiguration = new ServerConfiguration();
            foreach (var typeConfig in serverConfiguration.MetadataOptions)
            {
                typeConfig.DisabledImageFetchers = new[] { "ServerDisabled" };
            }

            var serverConfigurationManager = new Mock<IServerConfigurationManager>();
            serverConfigurationManager.Setup(scm => scm.Configuration)
                .Returns(serverConfiguration);

            var baseItemManager = new BaseItemManager(serverConfigurationManager.Object);
            var actual = baseItemManager.IsImageFetcherEnabled(item, libraryTypeOptions, fetcherName);

            Assert.Equal(expected, actual);
        }
    }
}