using UnityEngine;
using EventsAppQuest.Core;

namespace EventsAppQuest.Presentation
{
    /// <summary>
    /// Controlador de raycast XR básico: dispara um raio a partir da câmera (ou origem configurável) e detecta alvos com QuestPointableTargetMarker.
    /// Quando XR está activo, permite apontar e confirmar no mundo; sem colisão mantém fallback.
    /// </summary>
    public class QuestXRRaycastController : MonoBehaviour
    {
        [Tooltip("Origem do raycast (ex.: Main Camera). Se null, usa Camera.main.")]
        [SerializeField] private Transform _rayOrigin;

        [Tooltip("Distância máxima do raycast (metros).")]
        [SerializeField] private float _maxDistance = 10f;

        [Tooltip("Layer mask para o raycast (default = Everything).")]
        [SerializeField] private LayerMask _layerMask = -1;

        private QuestXRRaycastHitResult _lastHit;
        private bool _lastFrameHadValidHit;

        /// <summary>Último resultado de raycast (pode ser null ou inválido).</summary>
        public QuestXRRaycastHitResult LastHit => _lastHit;

        /// <summary>True se o último PerformRaycast encontrou um alvo válido.</summary>
        public bool LastFrameHadValidHit => _lastFrameHadValidHit;

        /// <summary>Define a origem do raio (câmera ou rig).</summary>
        public void SetRayOrigin(Transform origin)
        {
            _rayOrigin = origin;
        }

        /// <summary>Executa um raycast a partir da origem configurada. Retorna resultado válido se atingir um objeto com QuestPointableTargetMarker.</summary>
        public QuestXRRaycastHitResult PerformRaycast()
        {
            Transform origin = _rayOrigin != null ? _rayOrigin : (Camera.main != null ? Camera.main.transform : null);
            if (origin == null)
            {
                _lastHit = new QuestXRRaycastHitResult { IsValidTarget = false, Notes = "Sem origem de raycast" };
                _lastFrameHadValidHit = false;
                return _lastHit;
            }

            Vector3 rayOrigin = origin.position;
            Vector3 rayDir = origin.forward;
            if (Physics.Raycast(rayOrigin, rayDir, out RaycastHit hit, _maxDistance, _layerMask))
            {
                var marker = hit.collider.GetComponent<QuestPointableTargetMarker>();
                if (marker != null && !string.IsNullOrEmpty(marker.TargetId))
                {
                    _lastHit = new QuestXRRaycastHitResult
                    {
                        HitObjectName = hit.collider.gameObject.name,
                        HitTargetId = marker.TargetId,
                        HitTargetType = marker.TargetType,
                        HitDistance = hit.distance,
                        IsValidTarget = true,
                        SourceMode = QuestXRRaycastSourceMode.CameraForward,
                        Notes = "XR hit"
                    };
                    _lastFrameHadValidHit = true;
                    return _lastHit;
                }

                _lastHit = new QuestXRRaycastHitResult
                {
                    HitObjectName = hit.collider.gameObject.name,
                    HitTargetId = null,
                    HitDistance = hit.distance,
                    IsValidTarget = false,
                    SourceMode = QuestXRRaycastSourceMode.CameraForward,
                    Notes = "Hit sem marcador"
                };
                _lastFrameHadValidHit = false;
                return _lastHit;
            }

            _lastHit = new QuestXRRaycastHitResult
            {
                IsValidTarget = false,
                SourceMode = QuestXRRaycastSourceMode.CameraForward,
                Notes = "Sem hit"
            };
            _lastFrameHadValidHit = false;
            return _lastHit;
        }

        /// <summary>True se a origem do raycast está disponível.</summary>
        public bool IsAvailable()
        {
            Transform origin = _rayOrigin != null ? _rayOrigin : (Camera.main != null ? Camera.main.transform : null);
            return origin != null;
        }
    }
}
