using MLAPI.MonoBehaviours.Core;
using UnityEditor;
using UnityEngine;
using UnityEditorInternal;

[CustomEditor(typeof(NetworkingManager), true)]
[CanEditMultipleObjects]
public class NetworkingManagerEditor : Editor
{
    private ReorderableList networkedObjectList;

    private NetworkingManager networkingManager;
    private bool initialized;

    private void Init()
    {
        if (initialized)
            return;
        initialized = true;
        networkingManager = (NetworkingManager)target;
    }

    private void OnEnable()
    {
        networkedObjectList = new ReorderableList(serializedObject, serializedObject.FindProperty("NetworkConfig").FindPropertyRelative("NetworkedPrefabs"), true, true, true, true);
        networkedObjectList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
        {
            var element = networkedObjectList.serializedProperty.GetArrayElementAtIndex(index);
            rect.y += 2;
            EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width - 30, EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("prefab"), GUIContent.none);
            EditorGUI.PropertyField(new Rect(rect.x + rect.width - 30, rect.y, 30, EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("playerPrefab"), GUIContent.none);
        };

        networkedObjectList.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Networked Prefabs");
        };
    }

    public override void OnInspectorGUI()
    {
        Init();
        if (!networkingManager.isServer && !networkingManager.isClient)
        {
            EditorGUILayout.Space();
            serializedObject.Update();
            networkedObjectList.DoLayoutList();
            serializedObject.ApplyModifiedProperties();
            base.OnInspectorGUI(); //Only draw if we don't have a running client or server
        }
        else
        {
            string instanceType = "";
            if (networkingManager.isHost)
                instanceType = "Host";
            else if (networkingManager.isServer)
                instanceType = "Server";
            else if (networkingManager.isClient)
                instanceType = "Client";

            EditorGUILayout.HelpBox("You cannot edit the NetworkConfig when a " + instanceType + " is running", MessageType.Info);
            if (GUILayout.Toggle(false, "Stop " + instanceType, EditorStyles.miniButtonMid))
            {
                if (networkingManager.isHost)
                    networkingManager.StopHost();
                else if (networkingManager.isServer)
                    networkingManager.StopServer();
                else if (networkingManager.isClient)
                    networkingManager.StopClient();
            }
        }
        Repaint();
    }
}