// VRC Messages — objet à glisser sur l'avatar (Hierarchy ou Scene) pour installer le clavier.
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using VRC.SDK3.Avatars.Components;

public class VRCMKeyboardInstaller : ScriptableObject
{
}

[InitializeOnLoad]
static class VRCMKeyboardDropHandler
{
    static VRCMKeyboardDropHandler()
    {
        DragAndDrop.AddDropHandler(OnHierarchyDrop);
        DragAndDrop.AddDropHandler(OnSceneDrop);
    }

    static bool IsOurs()
    {
        foreach (var o in DragAndDrop.objectReferences)
            if (o is VRCMKeyboardInstaller) return true;
        return false;
    }

    static DragAndDropVisualMode Handle(GameObject target, bool perform)
    {
        if (!IsOurs()) return DragAndDropVisualMode.None;
        var desc = target != null ? target.GetComponentInParent<VRCAvatarDescriptor>() : null;
        if (desc == null) return DragAndDropVisualMode.Rejected;
        if (perform)
        {
            DragAndDrop.AcceptDrag();
            EditorApplication.delayCall += () => VRCMessagesSimpleToggle.Install(desc);
        }
        return DragAndDropVisualMode.Link;
    }

    static DragAndDropVisualMode OnHierarchyDrop(int dropTargetInstanceID, HierarchyDropFlags dropMode,
                                                 Transform parentForDraggedObjects, bool perform)
    {
        return Handle(EditorUtility.InstanceIDToObject(dropTargetInstanceID) as GameObject, perform);
    }

    static DragAndDropVisualMode OnSceneDrop(Object dropUpon, Vector3 worldPosition, Vector2 viewportPosition,
                                             Transform parentForDraggedObjects, bool perform)
    {
        return Handle(dropUpon as GameObject, perform);
    }
}

[CustomEditor(typeof(VRCMKeyboardInstaller))]
class VRCMKeyboardInstallerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        EditorGUILayout.HelpBox(
            "Glisse cet objet sur ton avatar dans la Hierarchy (ou dans la Scene) pour ajouter le menu Messages (Écrire, Conversation, Vocal).\n\n" +
            "Ou clique sur le bouton de ton avatar ci-dessous.", MessageType.Info);

        var avatars = Object.FindObjectsOfType<VRCAvatarDescriptor>(true);
        if (avatars.Length == 0)
        {
            EditorGUILayout.LabelField("Aucun avatar dans la scène ouverte.");
            return;
        }
        foreach (var desc in avatars)
            if (GUILayout.Button("Installer sur « " + desc.gameObject.name + " »", GUILayout.Height(30)))
                VRCMessagesSimpleToggle.Install(desc);
    }
}
#endif
