using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using UnityEngine.EventSystems;


namespace SimplifyXR
{
    [System.Serializable]
    public class GridProperties
    {
        public int maxRows;
        public int maxColumns;
    }

    public class MenuGrid : MonoBehaviour
    {
        public GridProperties gridProps;
        public GameObject cardPrefab;
        public List<MenuCard> cards;

        GridLayoutGroup gridLayout;
        ElementRoot root;


        void Awake()
        {
            GetRequired();
        }

        private void GetRequired()
        {
            gridLayout = this.gameObject.GetComponent<GridLayoutGroup>();
            root = this.GetComponentInParent<ElementRoot>();
        }

        public void EnableDisableClickMapping(bool enable)
        {

            var buttons = this.GetComponentsInChildren<Button>().ToList();
            buttons?.ForEach((b) =>
            {
#if USING_MRTK3 || USING_XRI
                var clickMapping = b.GetComponent<XRIClickMapping>();
                if (clickMapping) clickMapping.enabled = enable;
#endif
#if USING_MRTK2
                var MRTK2clickMapping = b.GetComponent<MRTK2ClickMapping>();
                if (MRTK2clickMapping) MRTK2clickMapping.enabled = enable;
#endif
            });

        }

        public void BuildGrid(GridProperties gridProps)
        {
            GetRequired();
            DeleteCards();

            AddCards(gridProps);              
        }

        private void AddCards(GridProperties props)
        {
            var size = root.GetComponent<RectTransform>().sizeDelta;

            var number = props.maxColumns * props.maxRows;
            var horzSpacing = props.maxColumns * gridLayout.spacing.x;
            var vertSpacing = props.maxRows * gridLayout.spacing.y;
            var vertMax = 340;

            var cardSizeX = (size.x - horzSpacing) / props.maxColumns; 
            var cardSizeY = (vertMax - vertSpacing) / props.maxRows;
            gridLayout.cellSize = new Vector2(cardSizeX, cardSizeY);

#if UNITY_EDITOR
            UnityEditor.EditorUtility.SetDirty(gridLayout);
#endif

            for (int i = 0; i < number; i++)
            {
                AddCard();
            }
        }

        public void UpdateCards(List<IMenuItem> items)
        {
            int i = 0;
            var itemCount = items?.Count;

            EventSystem.current.SetSelectedGameObject(null);

            cards.ForEach(card =>
            {
                if(i <= items?.Count - 1)
                {
                    card.gameObject.SetActive(true);
                    card.SetCardData(items[i]);
                    i++;
                }
                else
                {
                    card.gameObject.SetActive(false);
                }                
            });
        }



        [ContextMenu("Build Grid")]
        public void TestCardGrid()
        {
            BuildGrid(gridProps);
        }

        private void AddCard()
        {
            var card = Instantiate(cardPrefab, this.transform);
            cards.Add(card.GetComponent<MenuCard>());
        }

        public void DeleteCards()
        {
            cards = new List<MenuCard>();
            var childCards = this.GetComponentsInChildren<MenuCard>();
            childCards.ToList().ForEach(card =>
            {
                DestroyImmediate(card.gameObject);
            });
        }
    }


}

