#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

namespace FishNet.Managing.Server.Editing
{
    [CustomEditor(typeof(ServerManager), true)]
    [CanEditMultipleObjects]
    public class ServerManagerEditor : Editor
    {
        private SerializedProperty _authenticator;
        private SerializedProperty _remoteClientTimeout;
        private SerializedProperty _remoteClientTimeoutDuration;
        private SerializedProperty _syncTypeRate;
        private SerializedProperty SpawnPacking;
        private SerializedProperty _changeFrameRate;
        private SerializedProperty _frameRate;
        private SerializedProperty _shareIds;
        private SerializedProperty _startOnHeadless;
        private SerializedProperty _allowPredictedSpawning;
        private SerializedProperty _reservedObjectIds;

        protected virtual void OnEnable()
        {
            _authenticator = serializedObject.FindProperty(nameof(_authenticator));
            _remoteClientTimeout = serializedObject.FindProperty(nameof(_remoteClientTimeout));
            _remoteClientTimeoutDuration = serializedObject.FindProperty(nameof(_remoteClientTimeoutDuration));
            _syncTypeRate = serializedObject.FindProperty(nameof(_syncTypeRate));
            SpawnPacking = serializedObject.FindProperty(nameof(SpawnPacking));
            _changeFrameRate = serializedObject.FindProperty(nameof(_changeFrameRate));
            _frameRate = serializedObject.FindProperty(nameof(_frameRate));
            _shareIds = serializedObject.FindProperty(nameof(_shareIds));
            _startOnHeadless = serializedObject.FindProperty(nameof(_startOnHeadless));
            _allowPredictedSpawning = serializedObject.FindProperty(nameof(_allowPredictedSpawning));
            _reservedObjectIds = serializedObject.FindProperty(nameof(_reservedObjectIds));
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            GUI.enabled = false;
            EditorGUILayout.ObjectField("Script:", MonoScript.FromMonoBehaviour((ServerManager)target), typeof(ServerManager), false);
            GUI.enabled = true;

            EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(_syncTypeRate);
            EditorGUILayout.PropertyField(SpawnPacking);
            EditorGUILayout.PropertyField(_changeFrameRate);
            if (_changeFrameRate.boolValue)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(_frameRate);
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(_startOnHeadless);
            EditorGUI.indentLevel--;
            EditorGUILayout.Space();

            EditorGUILayout.LabelField("Connections", EditorStyles.boldLabel);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(_remoteClientTimeout);
            if ((RemoteTimeoutType)_remoteClientTimeout.intValue != RemoteTimeoutType.Disabled)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(_remoteClientTimeoutDuration, new GUIContent("Timeout"));
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(_shareIds);
            EditorGUI.indentLevel--;
            EditorGUILayout.Space();

            EditorGUILayout.LabelField("Security", EditorStyles.boldLabel);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(_authenticator);

            EditorGUILayout.PropertyField(_allowPredictedSpawning);
            if (_allowPredictedSpawning.boolValue == true)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(_reservedObjectIds);
                EditorGUI.indentLevel--;
            }
            EditorGUI.indentLevel--;
            EditorGUILayout.Space();

            serializedObject.ApplyModifiedProperties();
        }
    }
}
#endif