using UnityEngine;
using EventsAppQuest.Core;

namespace EventsAppQuest.Presentation
{
    /// <summary>
    /// Controlador de foco/interação da apresentação Quest: alterna foco entre painéis, destaque visual e ação contextual (Activate).
    /// Mantém consistência com a sessão (FocusedTargetType, IsInteractionModeActive) e com o nav controller para ações.
    /// </summary>
    public class QuestPresentationFocusController : MonoBehaviour
    {
        private const int FocusTargetCount = 5; // GuidedStepPanel, HotspotPanel, SceneStatePanel, ProgressPanel, ActionPanel

        private QuestPresentationSession _session;
        private QuestPresentationNavigationController _navController;

        /// <summary>Invocado quando o foco ou o modo de interação mudam (para a UI atualizar o destaque).</summary>
        public System.Action OnFocusChanged;

        public void Bind(QuestPresentationSession session, QuestPresentationNavigationController navController)
        {
            _session = session;
            _navController = navController;
        }

        /// <summary>Avança o foco para o próximo alvo (ciclo: GuidedStep → Hotspot → SceneState → Progress → Action → GuidedStep). Na primeira vez ativa o modo de interação sem avançar.</summary>
        public void NextFocus()
        {
            if (_session == null) return;
            if (!_session.IsInteractionModeActive)
            {
                _session.IsInteractionModeActive = true;
                OnFocusChanged?.Invoke();
                return;
            }
            var next = (int)_session.FocusedTargetType + 1;
            if (next >= FocusTargetCount) next = 0;
            _session.FocusedTargetType = (QuestPresentationFocusTargetType)next;
            OnFocusChanged?.Invoke();
        }

        /// <summary>Recua o foco para o alvo anterior. Se o modo de interação estava inativo, ativa-o e mantém o foco atual.</summary>
        public void PreviousFocus()
        {
            if (_session == null) return;
            if (!_session.IsInteractionModeActive)
            {
                _session.IsInteractionModeActive = true;
                OnFocusChanged?.Invoke();
                return;
            }
            var prev = (int)_session.FocusedTargetType - 1;
            if (prev < 0) prev = FocusTargetCount - 1;
            _session.FocusedTargetType = (QuestPresentationFocusTargetType)prev;
            OnFocusChanged?.Invoke();
        }

        /// <summary>Ativa a ação contextual do alvo em foco: próximo passo, próximo hotspot, próximo estado, reiniciar ou alternar modo.</summary>
        public void ActivateFocus()
        {
            if (_session == null || _navController == null) return;
            _session.IsInteractionModeActive = true;
            switch (_session.FocusedTargetType)
            {
                case QuestPresentationFocusTargetType.GuidedStepPanel:
                    _navController.NextStep();
                    break;
                case QuestPresentationFocusTargetType.HotspotPanel:
                    _navController.NextHotspot();
                    break;
                case QuestPresentationFocusTargetType.SceneStatePanel:
                    _navController.NextSceneState();
                    break;
                case QuestPresentationFocusTargetType.ProgressPanel:
                    _navController.RestartPresentation();
                    break;
                case QuestPresentationFocusTargetType.ActionPanel:
                    _navController.ToggleNavigationMode();
                    break;
            }
            OnFocusChanged?.Invoke();
        }

        /// <summary>Sai do modo de interação por foco (navegação básica continua disponível).</summary>
        public void ExitFocusMode()
        {
            if (_session == null) return;
            _session.IsInteractionModeActive = false;
            OnFocusChanged?.Invoke();
        }

        /// <summary>Entra no modo de interação por foco (habilita indicação de foco e ações contextuais).</summary>
        public void EnterFocusMode()
        {
            if (_session == null) return;
            _session.IsInteractionModeActive = true;
            OnFocusChanged?.Invoke();
        }

        /// <summary>Define o alvo de foco diretamente.</summary>
        public void SetFocus(QuestPresentationFocusTargetType targetType)
        {
            if (_session == null) return;
            _session.IsInteractionModeActive = true;
            _session.FocusedTargetType = targetType;
            OnFocusChanged?.Invoke();
        }
    }
}
