﻿using System.Collections.Generic;
using System.Linq;
using Dissonance.Editor;
using UnityEditor;
using UnityEngine;

namespace Dissonance.Integrations.ForgeNetworking.Editor
{
    [CustomEditor(typeof(ForgeCommsNetwork))]
    public class ForgeCommsNetworkEditor
        : BaseDissonnanceCommsNetworkEditor<ForgeCommsNetwork, ForgeServer, ForgeClient, ForgePeer, Unit, Unit>
    {
        private SerializedProperty _voiceDataChannelToServerProperty;
        private int _voiceDataChannelToServer;

        private SerializedProperty _systemMessagesChannelToServerProperty;
        private int _systemMessagesChannelToServer;

        private SerializedProperty _voiceDataChannelToClientProperty;
        private int _voiceDataChannelToClient;

        private SerializedProperty _systemMessagesChannelToClientProperty;
        private int _systemMessagesChannelToClient;

        private bool _advancedFoldout;

        protected void OnEnable()
        {
            _voiceDataChannelToServerProperty = serializedObject.FindProperty("VoiceDataChannelToServer");
            _voiceDataChannelToServer = ValueOrDefault(_voiceDataChannelToServerProperty, 57729872);

            _systemMessagesChannelToServerProperty = serializedObject.FindProperty("SystemMessagesChannelToServer");
            _systemMessagesChannelToServer = ValueOrDefault(_systemMessagesChannelToServerProperty, 57729873);

            _voiceDataChannelToClientProperty = serializedObject.FindProperty("VoiceDataChannelToClient");
            _voiceDataChannelToClient = ValueOrDefault(_voiceDataChannelToClientProperty, 57729874);

            _systemMessagesChannelToClientProperty = serializedObject.FindProperty("SystemMessagesChannelToClient");
            _systemMessagesChannelToClient = ValueOrDefault(_systemMessagesChannelToClientProperty, 57729875);
        }

        private static int ValueOrDefault([NotNull] SerializedProperty prop, int defaultValue)
        {
            var val = prop.intValue;
            if (val == 0)
                val = defaultValue;
            return val;
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            using (new EditorGUI.DisabledScope(Application.isPlaying))
            {
                serializedObject.Update();

                _advancedFoldout = EditorGUILayout.Foldout(_advancedFoldout, "Advanced Config");
                if (_advancedFoldout)
                {
                    EditorGUILayout.HelpBox("Dissonance requires 4 Forge Networking event IDs. If you are not using Networking.WriteCustom you should use the default values.", MessageType.Info);

                    _voiceDataChannelToServer = EditorGUILayout.DelayedIntField("Event 1", _voiceDataChannelToServer);
                    _systemMessagesChannelToServer = EditorGUILayout.DelayedIntField("Event 2", _systemMessagesChannelToServer);
                    _voiceDataChannelToClient = EditorGUILayout.DelayedIntField("Event 3", _voiceDataChannelToClient);
                    _systemMessagesChannelToClient = EditorGUILayout.DelayedIntField("Event 4", _systemMessagesChannelToClient);

                    var set = new HashSet<int> {
                        _voiceDataChannelToServer,
                        _systemMessagesChannelToServer,
                        _voiceDataChannelToClient,
                        _systemMessagesChannelToClient
                    };

                    if (set.Count != 4)
                        EditorGUILayout.HelpBox("IDs must be unique", MessageType.Error);
                    else if (set.Any(a => a < 10000))
                        EditorGUILayout.HelpBox("IDs must be >= 10000", MessageType.Error);
                    else
                    {
                        _voiceDataChannelToServerProperty.intValue = _voiceDataChannelToServer;
                        _systemMessagesChannelToServerProperty.intValue = _systemMessagesChannelToServer;
                        _voiceDataChannelToClientProperty.intValue = _voiceDataChannelToClient;
                        _systemMessagesChannelToClientProperty.intValue = _systemMessagesChannelToClient;
                    }
                }

                serializedObject.ApplyModifiedProperties();
            }
        }
    }
}
