using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

[CustomEditor(typeof(EventListener))]
public class CustomEventListener : Editor
{
    private EventListener targetscript;
    private ReorderableList reorderableList;

    private void OnEnable()
    {
        targetscript = (EventListener)target;
        reorderableList = new ReorderableList(serializedObject, serializedObject.FindProperty("eventsList"), true, true, true, true);

        reorderableList.drawHeaderCallback += DrawHeader;
        reorderableList.drawElementCallback += DrawElement;
        reorderableList.elementHeightCallback += ElementHeightCallback;
        reorderableList.onAddCallback += AddItem;
        reorderableList.onRemoveCallback += RemoveItem;
    }

    public override void OnInspectorGUI()
    {
        //base.OnInspectorGUI();
        GUILayout.Space(20);
        reorderableList.DoLayoutList();
    }

    private void DrawHeader(Rect rect)
    {
        GUI.Label(rect, "Eventlist");
    }

    private void DrawElement(Rect rect, int index, bool active, bool focused)
    {
        EditorGUI.BeginChangeCheck();
        EventTemplate item = targetscript.eventsList[index];
        SerializedProperty unityeventprop = serializedObject.FindProperty("eventsList").GetArrayElementAtIndex(index).FindPropertyRelative("unityEvent");
        SerializedProperty essentialprop = serializedObject.FindProperty("eventsList").GetArrayElementAtIndex(index).FindPropertyRelative("essential");

        EditorGUILayout.BeginVertical();
        item.templateName = EditorGUILayout.TextField("Event name", item.templateName);
        item.delayTime = EditorGUILayout.FloatField( "Delay Time", item.delayTime);
        item.sO = (SOClass)EditorGUILayout.ObjectField( "Scriptable Object", item.sO, typeof(SOClass), true);
        item.audioclip = (AudioClip)EditorGUILayout.ObjectField("Audio", item.audioclip, typeof(AudioClip), true); ;
        EditorGUILayout.PropertyField(essentialprop);
        EditorGUILayout.PropertyField( unityeventprop);
        EditorGUILayout.EndVertical();

        if (EditorGUI.EndChangeCheck())
        {
            EditorUtility.SetDirty(target);
            serializedObject.ApplyModifiedProperties();
        }
    }

    private float ElementHeightCallback(int indexer)
    {
        float propertyHeight = EditorGUI.GetPropertyHeight(reorderableList.serializedProperty.GetArrayElementAtIndex(indexer), true);
        return propertyHeight + 160;
    }

    private void AddItem(ReorderableList list)
    {
        targetscript.eventsList.Add(new EventTemplate());
        EditorUtility.SetDirty(target);
    }

    private void RemoveItem(ReorderableList list)
    {
        targetscript.eventsList.RemoveAt(list.index);
        EditorUtility.SetDirty(target);
    }

    private void OnDisable()
    {
        reorderableList.drawHeaderCallback -= DrawHeader;
        reorderableList.drawElementCallback -= DrawElement;
        reorderableList.onAddCallback -= AddItem;
        reorderableList.onRemoveCallback -= RemoveItem;
    }
}