﻿using ABI.CCK.Components;
using UnityEditor;
using UnityEngine;

namespace ABI.CCK.Scripts.Editor
{
    [CustomEditor(typeof(CVRDescription))]
    public class CCK_CVRDescriptionEditor : UnityEditor.Editor
    {
        private CVRDescription _description;

        #region Unity Events

        private void OnEnable()
        {
            if (target == null) return;
            _description = (CVRDescription)target;
        }

        public override void OnInspectorGUI()
        {
            if (_description == null)
                return;

            EditorGUI.BeginChangeCheck();

            if (_description.locked)
                DrawLockedDescription();
            else
                DrawEditableDescription();

            if (EditorGUI.EndChangeCheck())
                EditorUtility.SetDirty(_description);
        }

        #endregion

        #region GUI Drawing

        private void DrawLockedDescription()
        {
            GUIStyle helpBoxStyle = new GUIStyle(EditorStyles.helpBox) 
            {
                padding = new RectOffset(10, 10, 10, 10)
            };

            GUIStyle descriptionStyle = new GUIStyle(EditorStyles.label) 
            {
                richText = true,
                wordWrap = true
            };

            EditorGUILayout.BeginVertical(helpBoxStyle);
            EditorGUILayout.BeginHorizontal();
        
            GUIContent iconContent = GUIContent.none;
            switch (_description.type)
            {
                case 1: // Info
                    iconContent = EditorGUIUtility.IconContent("console.infoicon");
                    break;
                case 2: // Warning
                    iconContent = EditorGUIUtility.IconContent("console.warnicon");
                    break;
                case 3: // Error
                    iconContent = EditorGUIUtility.IconContent("console.erroricon");
                    break;
            }

            if (iconContent != GUIContent.none)
            {
                GUILayout.Label(iconContent, GUILayout.Width(40), GUILayout.Height(40));
                GUILayout.Space(10);
            }

            using (new EditorGUILayout.ScrollViewScope(Vector2.zero, GUILayout.ExpandWidth(true)))
                EditorGUILayout.LabelField(_description.description, descriptionStyle); 
            
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();

            if (!string.IsNullOrEmpty(_description.url) && GUILayout.Button("Read more about this topic"))
                Application.OpenURL(_description.url);
        }
            
        private void DrawEditableDescription()
        {
            EditorGUILayout.LabelField("Description:", new GUIStyle(EditorStyles.label));
            _description.description = EditorGUILayout.TextArea(_description.description, 
                new GUIStyle(EditorStyles.textArea) { richText = true }, 
                GUILayout.Height(100));

            _description.url = EditorGUILayout.TextField("Documentation Url", _description.url);
            _description.type = EditorGUILayout.Popup("Icon Type", _description.type, new[] { "None", "Info", "Warning", "Error" });

            if (GUILayout.Button("Lock info"))
                _description.locked = true;
        }
        
        #endregion
    }
}