// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using NUnit.Framework;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Screens.Select;

namespace osu.Game.Tests.Visual.Multiplayer
{
    public class TestMultiplayerModLoading : OsuGameTestScene
    {
        [SetUp]
        public void SetUp() => Schedule(() =>
        {
            SelectedMods.Value = Array.Empty<Mod>();
        });

        /// <summary>
        /// This is a regression test that tests whether a singleplayer mod can transfer over to a multiplayer screen.
        /// It should not carry over from these screens, prevents regression on https://github.com/ppy/osu/pull/17352 
        /// </summary>
        [Test]
        public void TestSingleplayerModsDontCarryToMultiplayerScreens()
        {
            PushAndConfirm(() => new PlaySongSelect());

            // Select Mods while a "singleplayer" screen is active
            var osuAutomationMod = new OsuModAutoplay();
            var expectedMods = new[] { osuAutomationMod };

            AddStep("Toggle on the automation Mod.", () => { SelectedMods.Value = expectedMods; });
            AddAssert("Mods are loaded before the multiplayer screen is pushed.", () => SelectedMods.Value == expectedMods);

            PushAndConfirm(() => new TestMultiplayerComponents());
            AddAssert("Mods are Empty After A Multiplayer Screen Loads", () => SelectedMods.Value.Count == 0);

            AddStep("Retoggle on the automation Mod.", () => { SelectedMods.Value = expectedMods; });
            AddAssert("Mods are loaded before the playlist screen is pushed", () => SelectedMods.Value == expectedMods);

            // TODO: Implement TestPlaylistComponents? 
            //PushAndConfirm(() => new TestPlaylistComponents());
            //AddAssert("Mods are Empty After Playlist Screen Loads", () => !SelectedMods.Value.Any());
        }
    }
}