using NUnit.Framework;
using UnityEngine;

namespace DayNightCycle
{
    public class LightingManagerTestsEditMode
    {
        private LightingManager lightingManager;
        private LightingPreset lightingPreset;

        [SetUp]
        public void Setup()
        {
            GameObject lightingManagerGameObject = new GameObject("LightingManager");
            lightingManager = lightingManagerGameObject.AddComponent<LightingManager>();

            lightingPreset = ScriptableObject.CreateInstance<LightingPreset>();

            lightingManager.SetDirectionalLightSun(new GameObject("DirectionalLight").AddComponent<Light>());
            lightingManager.SetLightingPreset(lightingPreset);
            lightingManager.SetAmbientMode(UnityEngine.Rendering.AmbientMode.Flat);
            lightingManager.SetUseFog(false);
        }

        [TearDown]
        public void Teardown()
        {
            Object.DestroyImmediate(lightingManager.gameObject);
            Object.DestroyImmediate(lightingManager.GetDirectionalLightSun().gameObject);
            Object.DestroyImmediate(lightingPreset);
        }

        [Test]
        public void LightingManager_Instance_IsNotNull()
        {
            Assert.IsNotNull(LightingManager.Instance);
        }

        [Test]
        public void LightingPreset_Gradients_AreNotNull()
        {
            Assert.IsNotNull(lightingPreset.AmbientColor);
            Assert.IsNotNull(lightingPreset.DirectionalColor);
            Assert.IsNotNull(lightingPreset.FogColor);
        }

        [Test]
        public void LightingManager_GetAndSetDirectionalLightSun()
        {
            Light newDirectionalLight = new GameObject("NewDirectionalLight").AddComponent<Light>();
            lightingManager.SetDirectionalLightSun(newDirectionalLight);
            Assert.AreEqual(newDirectionalLight, lightingManager.GetDirectionalLightSun());
        }

        [Test]
        public void LightingManager_GetAndSetLightingPreset()
        {
            LightingPreset newPreset = ScriptableObject.CreateInstance<LightingPreset>();
            lightingManager.SetLightingPreset(newPreset);
            Assert.AreEqual(newPreset, lightingManager.GetLightingPreset());
            Object.DestroyImmediate(newPreset);
        }

        [Test]
        public void LightingManager_GetAndSetAmbientMode()
        {
            UnityEngine.Rendering.AmbientMode newAmbientMode = UnityEngine.Rendering.AmbientMode.Skybox;
            lightingManager.SetAmbientMode(newAmbientMode);
            Assert.AreEqual(newAmbientMode, lightingManager.GetAmbientMode());
        }

        [Test]
        public void LightingManager_GetAndSetUseFog()
        {
            lightingManager.SetUseFog(true);
            Assert.IsTrue(lightingManager.GetUseFog());
        }
    }

}