﻿using UnityEngine;
using UnityEngine.Animations;
using UnityEditor;
using UnityEditor.Animations;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects;
using System.IO;

namespace CRPen2
{
    [CustomEditor(typeof(CRPen2Setting))]
    public partial class CRPen2Editor : Editor
    {
        string _rootDir = null;
        int toolbar = 0;

        SerializedProperty _avatar, _inkPosition, _canvasPosition;
        SerializedProperty _lifetime, _size, _drawGesture;
        SerializedProperty _hand, _useGrip, _useColor, _useSize, _useEmission;
        SerializedProperty _handClip;
        SerializedProperty _applyDirectly;

        Transform _inkTarget;
        string _dataPath;

        int _requiredParameter, _requiredEmptyParameter;


        void OnEnable()
        {
            CRPen2Setting script = (CRPen2Setting)target;

            if (PrefabUtility.IsAnyPrefabInstanceRoot(script.gameObject))
                PrefabUtility.UnpackPrefabInstance(script.gameObject, PrefabUnpackMode.OutermostRoot, InteractionMode.AutomatedAction);

            string path = AssetDatabase.GetAssetPath(script.root);
            if (!path.Equals(""))
                _rootDir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(script.root));

            _avatar = serializedObject.FindProperty(nameof(script.avatar));

            _inkPosition = serializedObject.FindProperty(nameof(script.inkPosition));
            _canvasPosition = serializedObject.FindProperty(nameof(script.canvasPosition));

            _lifetime = serializedObject.FindProperty(nameof(script.lifetime));
            _size = serializedObject.FindProperty(nameof(script.size));
            _drawGesture = serializedObject.FindProperty(nameof(script.drawGesture));

            _hand = serializedObject.FindProperty(nameof(script.useHand));
            _handClip = serializedObject.FindProperty(nameof(script.penGestureClip));

            _useGrip = serializedObject.FindProperty(nameof(script.useGrip));
            _useColor = serializedObject.FindProperty(nameof(script.useColor));
            _useSize = serializedObject.FindProperty(nameof(script.useSize));
            _useEmission = serializedObject.FindProperty(nameof(script.useEmission));

            _applyDirectly = serializedObject.FindProperty(nameof(script.applyDirectly));

            _inkTarget = script.transform.Find("InkPosition");
        }


        public override void OnInspectorGUI()
        {
            CRPen2Setting script = (CRPen2Setting)target;

            // Toolbar.
            string[] text = new string[] { "Main", "Color" };
            toolbar = GUILayout.Toolbar(toolbar, text);

            _requiredParameter = CountRequiredParameter();
            _requiredEmptyParameter = CountEmptyRequiredParameter();

            if (toolbar == 0)
                Inspector();
            else if (toolbar == 1)
                InspectorColor();

            bool error = Check();

            // Apply Button.
            EditorGUI.BeginDisabledGroup(error);
            if (GUILayout.Button("Apply"))
            {
                // Create DataFolder.
                _dataPath = _rootDir + "/Data/" + script.avatar.name;
                CreateFolders(_dataPath);

                RemovePrefab();
                RemoveAnimator();
                RemoveMenu();
                RemoveParameter();

                SetPrefab();
                ApplyDescripter();
                MakeAnimator();
                MakeMenu();
                MakeParameter();
            }
            EditorGUI.EndDisabledGroup();

            // Remove Pen Button.
            if (GUILayout.Button("Remove Pen"))
            {
                RemovePrefab();
                RemoveAnimator();
                RemoveMenu();
                RemoveParameter();
            }
        }

        [DrawGizmo(GizmoType.NonSelected | GizmoType.Active)]
        static void DrawGizmos(CRPen2Setting script, GizmoType gizmoType)
        {
            Transform inkTarget = script.transform.Find("InkPosition");
            Gizmos.color = Color.yellow;
            
            Gizmos.DrawSphere(inkTarget.position, script.size * 0.5f);
        }
    }
}
