using UnityEditor;
using UnityEngine;

namespace M2DVisualQuestEditor
{
    public static class QuestAssetMenuExtensions
    {
        [MenuItem("Assets/Open in Graph Editor", true)]
        private static bool ValidateOpenInGraphEditor()
        {
            var selectedObject = Selection.activeObject;
            return selectedObject is Gyvr.Mythril2D.Quest;
        }

        [MenuItem("Assets/Open in Graph Editor", false, 20)]
        private static void OpenInGraphEditor()
        {
            var quest = Selection.activeObject as Gyvr.Mythril2D.Quest;
            if (quest != null)
            {
                QuestGraphEditorWindow.OpenQuest(quest);
            }
        }

        [UnityEditor.Callbacks.OnOpenAsset(1)]
        public static bool OnOpenQuestAsset(int instanceID, int line)
        {
#pragma warning disable CS0618
            var obj = EditorUtility.InstanceIDToObject(instanceID);
#pragma warning restore CS0618
            
            if (obj is Gyvr.Mythril2D.Quest quest)
            {
                QuestGraphEditorWindow.OpenQuest(quest, forceNewWindow: true);
                return true;
            }

            return false;
        }

        [InitializeOnLoadMethod]
        private static void RegisterSelectionCallback()
        {
            Selection.selectionChanged += OnSelectionChanged;
        }

        private static void OnSelectionChanged()
        {
            if (Selection.activeObject is Gyvr.Mythril2D.Quest quest)
            {
                var existingWindow = Resources.FindObjectsOfTypeAll<QuestGraphEditorWindow>();
                if (existingWindow != null && existingWindow.Length > 0)
                {
                    QuestGraphEditorWindow.OpenQuest(quest, forceNewWindow: false);
                }
            }
        }
    }

    [CustomEditor(typeof(Gyvr.Mythril2D.Quest))]
    public class QuestInspectorButton : Editor
    {
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();

            GUILayout.Space(10);

            if (GUILayout.Button("Open in Graph Editor", GUILayout.Height(1)))
            {
                var quest = target as Gyvr.Mythril2D.Quest;
                if (quest != null)
                {
                    QuestGraphEditorWindow.OpenQuest(quest);
                }
            }
        }
    }
}
