using UnityEngine;
using UnityEngine.EventSystems;

namespace Jovian.PopupSystem.UI {
    /// <summary>
    /// Reference holder MonoBehaviour for popup triggers. Attach to any UI element with a
    /// Graphic component (Image, TMP_Text, etc.) that has Raycast Target enabled.
    /// Configure category, anchor side, and position mode in the Inspector.
    /// Forwards pointer events to the bound <see cref="PopupTriggerView"/>.
    /// </summary>
    public class PopupTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
        [SerializeField] PopupCategory category;
        [SerializeField] AnchorSide anchorSide = AnchorSide.Below;
        [SerializeField] PopupPositionMode positionMode = PopupPositionMode.AnchorToElement;

        PopupTriggerView handler;

        /// <summary>The popup category this trigger belongs to.</summary>
        public PopupCategory Category => category;

        /// <summary>Which side of this element the popup anchors to.</summary>
        public AnchorSide AnchorSide => anchorSide;

        /// <summary>Whether the popup anchors to this element or follows the mouse.</summary>
        public PopupPositionMode PositionMode => positionMode;

        /// <summary>The bound behavior handler. Null until <see cref="Bind"/> is called.</summary>
        public PopupTriggerView Handler => handler;

        /// <summary>
        /// Binds a <see cref="PopupTriggerView"/> to this trigger. Called automatically
        /// by <see cref="IPopupSystem.ScanTriggers"/> or <see cref="IPopupSystem.InitializeTriggersInChildren"/>.
        /// </summary>
        public void Bind(PopupTriggerView view) {
            handler = view;
        }

        /// <summary>Forwards pointer enter to the bound handler.</summary>
        public void OnPointerEnter(PointerEventData eventData) {
            handler?.OnPointerEnter(this);
        }

        /// <summary>Forwards pointer exit to the bound handler.</summary>
        public void OnPointerExit(PointerEventData eventData) {
            handler?.OnPointerExit(this);
        }
    }
}
