using NUnit.Framework;
using System.Collections;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.TestTools;

namespace Unity.Tutorials.Core.Editor.Tests
{
    public class ProjectResourceTests
    {
        readonly string[] k_UITexturePaths =
        {
            UIElementsUtils.s_UIResourcesPath,
        };
        TutorialWindow Window => TutorialWindow.Instance;

        [UnityTearDown]
        public IEnumerator TearDown()
        {
            if (Window != null)
            {
                yield return new WaitForDelayCall();
                if (Window.Model.Tutorial.CurrentTutorial)
                {
                    TutorialWindow.ExitTutorial();
                }
                Window.Close();
            }
        }

        [Test]
        public void CommonResourcesExist()
        {
            Assert.IsTrue(Directory.Exists(UIElementsUtils.s_UIResourcesPath), $"'{UIElementsUtils.s_UIResourcesPath}' does not exist");

            const string commonCallbacks = "Packages/com.unity.learn.iet-framework/Editor/DefaultAssets/CommonTutorialCallbacksHandler.asset";
            Assert.IsTrue(File.Exists(commonCallbacks), $"'{commonCallbacks}' does not exist");

            Assert.IsTrue(File.Exists(TutorialContainer.k_DefaultLayoutPath), $"'{TutorialContainer.k_DefaultLayoutPath}' does not exist");

            Assert.IsTrue(File.Exists(TutorialProjectSettings.k_DefaultStyleAsset), $"'{TutorialProjectSettings.k_DefaultStyleAsset}' does not exist");

            Assert.IsTrue(File.Exists(TutorialStyles.DefaultDarkStyleFile), $"'{TutorialStyles.DefaultDarkStyleFile}' does not exist");
            Assert.IsTrue(File.Exists(TutorialStyles.DefaultLightStyleFile), $"'{TutorialStyles.DefaultLightStyleFile}' does not exist");
        }

        [Ignore("Works locally, fails on Yamato")]
        [Test]
        public void DefaultLayoutContainsTutorialWindow()
        {
            TutorialModel.OnLayoutLoaded -= OnLayoutLoaded;
            TutorialModel.OnLayoutLoaded += OnLayoutLoaded;

            TutorialWindow.GetOrCreateWindow(null);
            TutorialWindow.Instance.Model.Tutorial.SaveOriginalWindowLayout();
            TutorialModel.LoadWindowLayout(TutorialContainer.k_DefaultLayoutPath);
            bool hasTutorialWindow = EditorWindowUtils.FindOpenInstance<TutorialWindow>();
            TutorialModel.ReopenWindowLayoutAsBeforeTutorialStarted(null);
            Assert.IsTrue(hasTutorialWindow, $"{TutorialContainer.k_DefaultLayoutPath} does not contain TutorialWindow.");
        }

        void OnLayoutLoaded(bool obj)
        {
            TutorialFrameworkModel.s_AreTestsRunning = true;
        }

        [Test]
        public void UITexturesPathsExist()
        {
            k_UITexturePaths.ToList().ForEach(path =>
                Assert.IsTrue(Directory.Exists(path), $"Path '{path}' does not exist")
            );
        }

        [Test]
        public void UITexturesHaveCorrectTextureType()
        {
            var texturesWithWrongType = AssetDatabase.FindAssets("t:Texture2D", k_UITexturePaths)
                .Select(guid => AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(guid)) as TextureImporter)
                .Where(importer => importer.textureType != TextureImporterType.GUI)
                .Select(importer => $"\"{importer.assetPath}\"")
                .ToArray();

            Assert.IsEmpty(texturesWithWrongType);
        }
    }
}