// FlexiMotion // https://kybernetik.com.au/flexi-motion // Copyright 2023-2025 Kybernetik //

#if UNITY_EDITOR

using System;
using UnityEditor;
using UnityEngine;

namespace FlexiMotion.Editor
{
    /// <summary>[Editor-Only] A custom editor for <see cref="FlexiMotionComponent"/>.</summary>
    /// https://kybernetik.com.au/flexi-motion/api/FlexiMotion.Editor/FlexiMotionEditor
    /// 
    [CustomEditor(typeof(FlexiMotionComponent), true)]
    public class FlexiMotionEditor : UnityEditor.Editor
    {
        /************************************************************************************************************************/

        [SerializeField] private bool _ModifiersExpanded;

        [NonSerialized] private SerializedProperty _DefinitionProperty;

        /************************************************************************************************************************/

        private readonly Action<SerializedProperty> OnEditButton;

        /// <summary>Creates a new <see cref="FlexiMotionEditor"/>.</summary>
        public FlexiMotionEditor()
        {
            OnEditButton = property => SpringDefinitionsWindow.Open<SpringDefinitionsWindow>((FlexiMotionComponent)target);
        }

        /************************************************************************************************************************/

        /// <summary>Initializes this editor.</summary>
        protected virtual void OnEnable()
        {
            _DefinitionProperty = serializedObject.FindProperty(FlexiMotionComponent.DefinitionFieldName);
            _DefinitionProperty.Next(true);
        }

        /************************************************************************************************************************/

        /// <inheritdoc/>
        public override void OnInspectorGUI()
        {
            try
            {
                EditableFieldDrawer.OnEdit += OnEditButton;

                FMEditorGUI.DrawPropertyFields(_DefinitionProperty);
                DrawModifiers();
            }
            finally
            {
                EditableFieldDrawer.OnEdit -= OnEditButton;
            }
        }

        /************************************************************************************************************************/

        private void DrawModifiers()
        {
            var target = (IFlexiMotionComponent)this.target;
            target.Modifiers.DrawGUI(ref _ModifiersExpanded);
        }

        /************************************************************************************************************************/
    }
}

#endif

