﻿using Impact.Integration.MasterAudio;
using Impact.Utility;
using UnityEditor;
using UnityEngine;

namespace Impact.EditorScripts
{
    [CustomEditor(typeof(MasterAudioInteraction))]
    public class MasterAudioInteractionEditor : Editor
    {
        private readonly Color warningColor = new Color(1, 1, 0.5f);

        private MasterAudioInteraction interaction;
        private SerializedProperty slideSoundGroupProperty;
        private SerializedProperty rollSoundGroupProperty;
        private SerializedProperty collisionSoundGroupsProperty;

        private void OnEnable()
        {
            interaction = target as MasterAudioInteraction;

            slideSoundGroupProperty = serializedObject.FindProperty("_slideSoundGroup");
            rollSoundGroupProperty = serializedObject.FindProperty("_rollSoundGroup");
            collisionSoundGroupsProperty = serializedObject.FindProperty("_collisionSoundGroups");
        }

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

            EditorGUI.BeginChangeCheck();

            drawAudioProperties();

            ImpactEditorUtilities.Separator();

            drawInteractionProperties();

            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(interaction);
            }

            serializedObject.ApplyModifiedProperties();
        }

        private void drawInteractionProperties()
        {
            EditorGUILayout.LabelField("Interaction Properties", EditorStyles.boldLabel);

            interaction.VelocityRange = ImpactEditorUtilities.RangeEditor(interaction.VelocityRange, new GUIContent("Velocity Range (Min/Max)", "The velocity magnitude range to use when calculating collision intensity."));

            EditorGUILayout.Separator();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(new GUIContent("Collision Normal Influence", "How much the normal should affect the intensity."), GUILayout.Width(180));
            interaction.CollisionNormalInfluence = EditorGUILayout.Slider("", interaction.CollisionNormalInfluence, 0, 1);
            EditorGUILayout.EndHorizontal();

            interaction.ScaleVolumeWithVelocity = EditorGUILayout.ToggleLeft(new GUIContent("Scale Volume With Velocity", "Should volume be scaled based on the velocity?"), interaction.ScaleVolumeWithVelocity);

            if (interaction.ScaleVolumeWithVelocity)
            {
                EditorGUI.indentLevel++;

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField(new GUIContent("Volume Scale Curve", ""), GUILayout.Width(150));
                interaction.VelocityVolumeScaleCurve = EditorGUILayout.CurveField("", interaction.VelocityVolumeScaleCurve);
                EditorGUILayout.EndHorizontal();

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Separator();

            interaction.RandomPitchRange = ImpactEditorUtilities.RangeEditor(interaction.RandomPitchRange, new GUIContent("Pitch Randomness (Min/Max)", "Random multiplier for the pitch."));

            EditorGUILayout.Separator();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(new GUIContent("Slide Velocity Pitch Modifier", "How much to increase the pitch as sliding and rolling velocity increases."), GUILayout.Width(180));
            interaction.SlideVelocityPitchMultiplier = EditorGUILayout.Slider("", interaction.SlideVelocityPitchMultiplier, 0, 1);
            EditorGUILayout.EndHorizontal();
        }

        private void drawAudioProperties()
        {
            EditorGUILayout.LabelField("MasterAudio Sound Groups", EditorStyles.boldLabel);

            EditorGUILayout.BeginVertical(EditorStyles.helpBox);

            if (interaction.CollisionSoundGroups.Count == 0)
            {
                EditorGUILayout.Separator();

                EditorGUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                EditorGUILayout.LabelField("No Collision Sound Groups have been added.", GUILayout.Width(270));
                GUILayout.FlexibleSpace();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Separator();
            }
            else
            {
                GUILayout.Space(2);

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField(new GUIContent("Sound Group Selection Mode", "Should sound groups be chosen based on Velocity or be chosen Randomly?"));
                interaction.CollisionSoundGroupMode = (MasterAudioInteraction.CollisionSoundGroupSelectionMode)EditorGUILayout.EnumPopup(interaction.CollisionSoundGroupMode);
                EditorGUILayout.EndHorizontal();

                for (int i = 0; i < interaction.CollisionSoundGroups.Count; i++)
                {
                    EditorGUILayout.BeginHorizontal();

                    if (interaction.CollisionSoundGroupMode == MasterAudioInteraction.CollisionSoundGroupSelectionMode.Velocity)
                        EditorGUILayout.LabelField((i + 1) + ")", GUILayout.Width(20));
                    else
                        GUILayout.Space(5);

                    SerializedProperty sp = collisionSoundGroupsProperty.GetArrayElementAtIndex(i);
                    SerializedProperty sp2 = sp.FindPropertyRelative("SoundGroup");
                    EditorGUILayout.PropertyField(sp2, new GUIContent());

                    Color originalColor = GUI.color;
                    GUI.color = warningColor;
                    if (GUILayout.Button(new GUIContent("X", "Remove"), GUILayout.Width(18), GUILayout.Height(15)))
                    {
                        interaction.CollisionSoundGroups.RemoveAt(i);
                        i--;
                    }
                    GUI.color = originalColor;

                    EditorGUILayout.EndHorizontal();
                }

                GUILayout.Space(2);
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.BeginHorizontal();

            GUILayout.FlexibleSpace();

            if (GUILayout.Button("Add Collision Sound Group"))
            {
                interaction.CollisionSoundGroups.Add(new MasterAudioInteraction.CollisionSoundGroup());
            }

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(slideSoundGroupProperty, new GUIContent("Slide Sound Group", "The sound group to play when sliding."));
            EditorGUILayout.PropertyField(rollSoundGroupProperty, new GUIContent("Roll Sound Group", "The sound group to play when rolling."));
        }
    }
}