using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using ABI.CCK.Components;
using ABI.CCK.Scripts.Editor;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

namespace ABI.CCK.Scripts.Editor
{
    [CustomEditor(typeof(ABI.CCK.Components.CVRDistanceLod), true)]
    public class CVRDistanceLodEditor : UnityEditor.Editor
    {
        private CVRDistanceLod _lod;
        
        private ReorderableList reorderableList;

        private CVRDistanceLodGroup entity;

        private void InitializeList()
        {
            reorderableList = new ReorderableList(_lod.Groups, typeof(CVRDistanceLodGroup),
                false, true, true, true);
            reorderableList.drawHeaderCallback = OnDrawHeader;
            reorderableList.drawElementCallback = OnDrawElement;
            reorderableList.elementHeightCallback = OnHeightElement;
            reorderableList.onAddCallback = OnAdd;
            reorderableList.onChangedCallback = OnChanged; 
        }

        private void OnChanged(ReorderableList list)
        {
            //EditorUtility.SetDirty(target);
        }

        private void OnAdd(ReorderableList list)
        {
            _lod.Groups.Add(new CVRDistanceLodGroup());
            Repaint();
        }

        private float OnHeightElement(int index)
        {
            return EditorGUIUtility.singleLineHeight * 3 * 1.25f;
        }

        private void OnDrawElement(Rect rect, int index, bool isactive, bool isfocused)
        {
            if (index > _lod.Groups.Count) return;
            entity = _lod.Groups[index];
            
            rect.y += 2;
            rect.x += 12;
            rect.width -= 12;
            Rect _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight);
            
            EditorGUI.LabelField(_rect, "Game Object");
            
            _rect.x += 100;
            _rect.width = rect.width - 100;

            entity.GameObject = (GameObject) EditorGUI.ObjectField(_rect, entity.GameObject, typeof(GameObject), true);
            
            rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
            _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight);

            EditorGUI.LabelField(_rect, "Min Distance");
            
            _rect.x += 100;
            _rect.width = rect.width - 100;
            
            entity.MinDistance = EditorGUI.FloatField(_rect, entity.MinDistance);
            
            rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
            _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight);

            EditorGUI.LabelField(_rect, "Max Distance");
            
            _rect.x += 100;
            _rect.width = rect.width - 100;
            
            entity.MaxDistance = EditorGUI.FloatField(_rect, entity.MaxDistance);
        }

        private void OnDrawHeader(Rect rect)
        {
            Rect _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
            GUI.Label(_rect, "Groups");
            EditorGUIExtensions.UtilityMenu(_rect, reorderableList);
        }


        public override void OnInspectorGUI()
        {
            if (_lod == null) _lod = (CVRDistanceLod) target;

            _lod.distance3D = EditorGUILayout.Toggle("3D Distance", _lod.distance3D);

            if (reorderableList == null) InitializeList();
            reorderableList.DoLayoutList();
        }
    }
}