// 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 NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Screens;
using osu.Framework.Testing;
using osu.Game.Graphics.Sprites;
using osu.Game.Screens;
using osu.Game.Screens.Play;
using osuTK.Graphics;

namespace osu.Game.Tests.Visual
{
    [TestFixture]
    public class TestSceneOsuScreenStack : OsuTestScene
    {
        private TestOsuScreenStack stack;

        [SetUpSteps]
        public void SetUpSteps()
        {
            AddStep("Create new screen stack", () => { Child = stack = new TestOsuScreenStack { RelativeSizeAxes = Axes.Both }; });
        }

        [Test]
        public void ParallaxAssignmentTest()
        {
            NoParallaxTestScreen noParallaxScreen = null;
            TestScreen parallaxScreen = null;

            AddStep("Push no parallax", () => stack.Push(noParallaxScreen = new NoParallaxTestScreen("NO PARALLAX")));
            AddUntilStep("Wait for current", () => noParallaxScreen.IsLoaded);
            AddAssert("Parallax is off", () => stack.ParallaxAmount == 0);

            AddStep("Push parallax", () => noParallaxScreen.Push(parallaxScreen = new TestScreen("PARALLAX")));
            AddUntilStep("Wait for current", () => parallaxScreen.IsLoaded);
            AddAssert("Parallax is on", () => stack.ParallaxAmount > 0);

            AddStep("Exit from new screen", () => { noParallaxScreen.MakeCurrent(); });
            AddAssert("Parallax is off", () => stack.ParallaxAmount == 0);
        }

        public class TestScreen : ScreenWithBeatmapBackground
        {
            private readonly string screenText;

            public TestScreen(string screenText)
            {
                this.screenText = screenText;
            }

            [BackgroundDependencyLoader]
            private void load()
            {
                AddInternal(new OsuSpriteText
                {
                    Text = screenText,
                    Colour = Color4.White,
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                });
            }
        }

        private class NoParallaxTestScreen : TestScreen
        {
            public NoParallaxTestScreen(string screenText)
                : base(screenText)
            {
            }

            public override float BackgroundParallaxAmount => 0.0f;
        }

        private class TestOsuScreenStack : OsuScreenStack
        {
            public new float ParallaxAmount => base.ParallaxAmount;
        }
    }
}