// <copyright file="BaseItemTests.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>

namespace Jellyfin.Controller.Tests.Entities
{
    using MediaBrowser.Controller.Entities;
    using MediaBrowser.Controller.Library;
    using MediaBrowser.Model.MediaInfo;
    using Moq;
    using Xunit;

    /// <summary>
    /// Tests for <see cref="BaseItem"/>.
    /// </summary>
    public class BaseItemTests
    {
        /// <summary>
        /// Tests that ModifySortChunks correctly modifies sort chunks.
        /// </summary>
        /// <param name="input">The input string.</param>
        /// <param name="expected">The expected output string.</param>
        [Theory]
        [InlineData("", "")]
        [InlineData("1", "0000000001")]
        [InlineData("t", "t")]
        [InlineData("test", "test")]
        [InlineData("test1", "test0000000001")]
        [InlineData("1test 2", "0000000001test 0000000002")]
        public void BaseItem_ModifySortChunks_Valid(string input, string expected)
        {
            Assert.Equal(expected, BaseItem.ModifySortChunks(input));
        }

        /// <summary>
        /// Tests that GetMediaSourceName returns the correct name for media sources.
        /// </summary>
        /// <param name="primaryPath">The primary path.</param>
        /// <param name="altPath">The alternate path.</param>
        /// <param name="name">The expected name for the primary path.</param>
        /// <param name="altName">The expected name for the alternate path.</param>
        [Theory]
        [InlineData("/Movies/Ted/Ted.mp4", "/Movies/Ted/Ted - Unrated Edition.mp4", "Ted", "Unrated Edition")]
        [InlineData("/Movies/Deadpool 2 (2018)/Deadpool 2 (2018).mkv", "/Movies/Deadpool 2 (2018)/Deadpool 2 (2018) - Super Duper Cut.mkv", "Deadpool 2 (2018)", "Super Duper Cut")]
        public void GetMediaSourceName_Valid(string primaryPath, string altPath, string name, string altName)
        {
            Mock<IMediaSourceManager> mediaSourceManager = new();
            _ = mediaSourceManager.Setup(x => x.GetPathProtocol(It.IsAny<string>()))
                    .Returns((string x) => MediaProtocol.File);
            BaseItem.MediaSourceManager = mediaSourceManager.Object;

            Video video = new()
            {
                Path = primaryPath,
            };

            Video videoAlt = new()
            {
                Path = altPath,
            };

            video.LocalAlternateVersions = [videoAlt.Path];

            Assert.Equal(name, video.GetMediaSourceName(video));
            Assert.Equal(altName, video.GetMediaSourceName(videoAlt));
        }
    }
}
