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

namespace SimplifyXR
{

    [CustomEditor(typeof(MainMenuFeatures),true)]
    public class MainMenuFeaturesEditor : BasePanelFeatureEditor { 
        MainMenuFeatures mainMenu;
        bool expanded;

        public new void OnEnable()
        {

            mainMenu = (MainMenuFeatures)target;
            base.OnEnable();
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            DrawMenuItems();
            if(GUI.changed && !Application.isPlaying) UpdateGridSize();
        }         


        private void DrawMenuItems()
        {
            expanded = EditorGUILayout.Foldout(expanded, 
                "Menu Items");
            if (expanded)
            {
                mainMenu?.menuItems?.ToList().ForEach(e =>
                {
                    DrawMenuItem(e);
                });


                if (GUILayout.Button("Add New Menu Item"))
                {
                    AddMenuItem();
                }
            }           
        }


        private void DrawHandleMenuPath(MainMenuItem item)
        {
            if (mainMenu.menuType.Equals(MenuType.multiLevel))
            {
                var paths = mainMenu.menuMap?.GetMenuPaths();
                if(paths != null)
                {
                    int i = !string.IsNullOrEmpty(item.menuPath) ?
                  paths.IndexOf(item.menuPath) :
                  0;

                    i = EditorGUILayout.Popup("Menu Path", i, paths.ToArray());
                    try
                    {
                        item.menuPath = paths[i];
                    }
                    catch(System.Exception e) { }
                }              
            }            
        }

        private void DrawHandleSceneSelect(MainMenuItem item)
        {
            var module = item.scene != null ?
              StandardAssetsEditorHelpers.CheckifSceneIsModule(
                  (SceneAsset)item.scene
                  ) :
             null;
            item.isModule = module != null;

            if (!item.isModule) item.title = EditorGUILayout.TextField("Title:", item.title);
            if (item.isModule)
            {
                item.title = module.Name;
                EditorGUILayout.LabelField("Title: " + item.title);
            }

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

            item.sceneKey = item.isModule ?
                module?.Key :
                sceneName;

            var sceneAsset = EditorGUILayout.ObjectField("Scene:", item.scene, typeof(SceneAsset), true);
            item.scene = sceneAsset;
        }

        private void DrawHandleIconSelect(MainMenuItem item)
        {
            item.sceneIcon = 
                EditorGUILayout.ObjectField("Menu Icon:", item.sceneIcon, typeof(Sprite), true) as Sprite;

        }

        private void HandleDrawRemoval(MainMenuItem item)
        {
            Styles.HorizontalBlock(() =>
            {

                if (GUILayout.Button("Remove", GUILayout.Width(100)))
                {
                    bool confirm = EditorUtility.DisplayDialog(
                        "Confirm Menu Item Removal",
                        "Are you sure you want to remove this menu item?",
                        "Confirm", "Cancel");
                    if (confirm) mainMenu.menuItems.Remove(item);
                }

            });

        }

        private void UpdateGridSize()
        {
            mainMenu.baseRoot = mainMenu.gameObject.GetComponentInChildren<ElementRoot>();
            var props = mainMenu.gridSize;
            mainMenu.menuGrid.BuildGrid(props);
            var panel = mainMenu.gameObject.GetComponent<StandardPanel>();
            var configs = panel.GetAllConfigurations();
            panel?.HandleConfigurations(configs);

            EditorUtility.SetDirty(mainMenu.menuGrid);

        }

        public void DrawMenuItem(MainMenuItem item)
        {
            GUILayout.BeginVertical(GUI.skin.box);

            DrawHandleSceneSelect(item);
            DrawHandleMenuPath(item);
            DrawHandleIconSelect(item);
            HandleDrawRemoval(item);

            EditorUtility.SetDirty(mainMenu);

            GUILayout.EndVertical();
        }

        private void AddMenuItem()
        {
            if (mainMenu.menuItems == null) mainMenu.menuItems = new List<MainMenuItem>();
            mainMenu.menuItems.Add(new MainMenuItem());
        }


    }
}

