using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;


namespace SimplifyXR
{
    
    [CustomEditor(typeof(NavMenuFeatures))]
    public class NavMenuFeaturesInspector : BasePanelFeatureEditor
    {
        NavMenuFeatures features;
        bool expanded = true;


        public new void OnEnable()
        {
            features = (NavMenuFeatures)target;
            base.OnEnable();

            SceneView.duringSceneGui -= UpdateSceneView;
            SceneView.duringSceneGui += UpdateSceneView;
        }

        public void OnDestroy()
        {
            SceneView.duringSceneGui -= UpdateSceneView;
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            DrawHandleMenuReferences();
        }

        public void UpdateSceneView(SceneView sceneView)
        {
            UpdateHandMenuItemsScale(features);
        }

        public override void NodeInspector(float width, bool showInfo) { }

        private void UpdateHandMenuItemsScale(NavMenuFeatures features)
        {
            var menuItems = features.GetComponentInChildren<NavMenuItems>();
            var height = menuItems.GetMenuItemsHeight();
            var elements = features.GetComponentInChildren<ElementRoot>();
            var elementRect = elements.GetComponent<RectTransform>();

            var size = new Vector2(elementRect.sizeDelta.x, height);
            elementRect.sizeDelta = size;
        }


        private void DrawHandleMenuReferences()
        {

            expanded = EditorGUILayout.Foldout(expanded,
                 "Nav Items");

            features.navReferences = features.navReferences == null ?
                new List<PanelReference>() : features.navReferences;

            if (expanded)
            {
                features.navReferences?.ForEach(reference =>
                {
                    DrawHandleMenuReference(reference);
                });

                AddNewNavItemGUI(features.navReferences);
            }        

            EditorUtility.SetDirty(features);
        }

        private void AddNewNavItemGUI(List<PanelReference> references)
        {
            if(GUILayout.Button("Add New Nav Item"))
            {
                var reference = new PanelReference();
                reference.buttonLabel = "Nav Item " + (references.Count + 1);
                references.Add(reference);
            }
        }

        private void DrawHandleMenuReference(PanelReference reference)
        {
            var navMenuItems = features.GetComponentInChildren<NavMenuItems>();

            navMenuItems.UpdateOrCreateMenuItemButton(reference);

            GUILayout.BeginVertical(GUI.skin.box);

            GUILayout.Label(reference.buttonLabel, EditorStyles.boldLabel);

            reference.buttonLabel = EditorGUILayout.TextField("Button Label", reference.buttonLabel);
            reference.buttonIcon = EditorGUILayout.ObjectField("Menu Icon:", reference.buttonIcon, typeof(Sprite), true) as Sprite;

            reference.referenceType = (ReferenceType) EditorGUILayout.EnumPopup("Reference Type:", reference.referenceType);

            HandleConditionalReferenceGUI(reference);
            HandleDrawRemoval(reference);      
            
            GUILayout.EndVertical();
        }

        private void HandleConditionalReferenceGUI(PanelReference reference)
        {
            switch (reference.referenceType)
            {
                case ReferenceType.bySceneOrModule:
                    HandleModuleReferenceGUI(reference);
                    break;

                case ReferenceType.byAsset:
                    HandleAssetReferenceGUI(reference);
                    break;
            }
        }

        private void HandleAssetReferenceGUI(PanelReference reference)
        {
            reference.panelObject =
                (GameObject) EditorGUILayout.ObjectField(
                    "Asset:", reference.panelObject, typeof(GameObject), true);        }

        private void HandleModuleReferenceGUI(PanelReference reference)
        {

            reference.loadType = (SceneOrModuleLoadType)EditorGUILayout.EnumPopup("Load Type:", reference.loadType);

            reference.scene = EditorGUILayout.ObjectField("Scene:", reference.scene, typeof(SceneAsset), true);


            var module = reference.scene != null ?
                StandardAssetsEditorHelpers.CheckifSceneIsModule((SceneAsset)reference?.scene) :
                null;

            reference.isModule = module != null;

            var sceneName = reference.scene != null &&
                !reference.scene.Equals(null) ?
                reference.scene.name :
                null;

            reference.sceneKey = reference.isModule ?
                module?.Key : sceneName;
        }


        private void HandleDrawRemoval(PanelReference reference)
        {
            Styles.HorizontalBlock(() =>
            {               
                    if (GUILayout.Button("Remove", GUILayout.Width(100)))
                    {
                        bool confirm = EditorUtility.DisplayDialog(
                            "Confirm Nav Item Removal",
                            "Are you sure you want to remove this nav item?",
                            "Confirm", "Cancel");

                        if (confirm)
                        {
                            var navItems = features.GetComponentInChildren<NavMenuItems>();
                            navItems.RemoveMenuItemButton(reference);
                            features.navReferences.Remove(reference);                           
                        }
                        return;
                }              
            });
        }

    }
    


}
