using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;

namespace Woop.Unity.Editor
{
    [CustomEditor(typeof(WoopCutoutRig2D))]
    public sealed class WoopCutoutRig2DEditor : UnityEditor.Editor
    {
        private static readonly Color BoneColor = new(0.1f, 1f, 0.82f, 1f);
        private static readonly Color JointColor = new(1f, 0.72f, 0.12f, 1f);

        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();
            EditorGUILayout.Space();
            EditorGUILayout.HelpBox(
                "选中角色根节点即可在 Scene 中显示骨骼。骨骼位于 Visual/Rig/Bone_part_*；旋转 Bone 可直接摆姿势。",
                MessageType.Info);
        }

        private void OnSceneGUI()
        {
            var rig = (WoopCutoutRig2D)target;
            WoopCutoutRig2D.BoneBinding[] bones = rig.Bones;
            if (bones == null)
                return;

            CompareFunction previousZTest = Handles.zTest;
            Handles.zTest = CompareFunction.Always;

            foreach (WoopCutoutRig2D.BoneBinding binding in bones)
            {
                Transform bone = binding.bone;
                if (bone == null)
                    continue;

                Transform parent = bone.parent;
                if (parent != null && parent != rig.RigRoot)
                {
                    Handles.color = BoneColor;
                    Handles.DrawAAPolyLine(6f, parent.position, bone.position);
                }

                float handleSize = HandleUtility.GetHandleSize(bone.position);
                Handles.color = JointColor;
                Handles.DrawSolidDisc(bone.position, Vector3.forward, handleSize * 0.045f);
                Handles.color = Color.black;
                Handles.DrawWireDisc(bone.position, Vector3.forward, handleSize * 0.052f, 2f);

                GUIStyle labelStyle = new(EditorStyles.miniBoldLabel)
                {
                    normal = { textColor = BoneColor }
                };
                Handles.Label(
                    bone.position + Vector3.up * handleSize * 0.08f,
                    binding.partId,
                    labelStyle);
            }

            Handles.zTest = previousZTest;
        }
    }
}
