using System;
using System.Collections.Generic;
using EventsAppQuest.Core;
using UnityEngine;

namespace EventsAppQuest.Presentation
{
    /// <summary>
    /// Disponibiliza presets de apresentação Quest e aplica-os à sessão actual (modos de navegação,
    /// aiming, confirmação e ênfases). Mantém presets padrão em memória; preparado para futura configuração externa.
    /// </summary>
    public class QuestPresentationPresetController : MonoBehaviour
    {
        private QuestPresentationSession _session;
        private List<QuestPresentationPreset> _defaultPresets;

        /// <summary>Preset actual aplicado (pode ser null).</summary>
        public QuestPresentationPreset Current => _session?.CurrentPresentationPreset;

        /// <summary>Presets padrão disponíveis (criados na primeira leitura).</summary>
        public IReadOnlyList<QuestPresentationPreset> GetDefaultPresets()
        {
            if (_defaultPresets == null)
                _defaultPresets = BuildDefaultPresets();
            return _defaultPresets;
        }

        public void Bind(QuestPresentationSession session)
        {
            _session = session;
        }

        /// <summary>Aplica um preset à sessão actual: define NavigationMode, AimingMode, ConfirmationMode e guarda o preset.</summary>
        public void ApplyPreset(QuestPresentationPreset preset)
        {
            if (_session == null || preset == null) return;
            try
            {
                _session.NavigationMode = preset.DefaultNavigationMode;
                _session.AimingMode = preset.DefaultAimingMode;
                _session.ConfirmationMode = preset.DefaultConfirmationMode;
                _session.CurrentPresentationPreset = preset;
                _session.LastAppliedPresentationPresetAt = DateTime.UtcNow;
                _session.HasPresentationPreset = true;
            }
            catch (Exception)
            {
                // Fallback: não quebrar a apresentação
            }
        }

        /// <summary>Aplica o preset com o id dado, se existir nos presets padrão.</summary>
        public bool ApplyPresetById(string presetId)
        {
            if (string.IsNullOrEmpty(presetId)) return false;
            var presets = GetDefaultPresets();
            foreach (var p in presets)
            {
                if (string.Equals(p.PresetId, presetId, StringComparison.OrdinalIgnoreCase))
                {
                    ApplyPreset(p);
                    return true;
                }
            }
            return false;
        }

        /// <summary>Remove o preset da sessão; navegação/aiming/confirmation mantêm os valores actuais (não repõe defaults globais).</summary>
        public void ClearPreset()
        {
            if (_session == null) return;
            _session.CurrentPresentationPreset = null;
            _session.LastAppliedPresentationPresetAt = null;
            _session.HasPresentationPreset = false;
        }

        private static List<QuestPresentationPreset> BuildDefaultPresets()
        {
            return new List<QuestPresentationPreset>
            {
                new QuestPresentationPreset
                {
                    PresetId = "QuickPitch",
                    Name = "Pitch rápido",
                    Description = "Foco em fechamento e CTA; duração curta.",
                    PresetType = QuestPresentationPresetType.QuickPitch,
                    RecommendedUseCase = "Cliente com pouco tempo; fechar decisão rapidamente.",
                    PrioritizedSections = new List<string> { "Closing", "GuidedTour" },
                    SkipOptionalSections = true,
                    DefaultNavigationMode = QuestPresentationNavigationMode.Guided,
                    DefaultAimingMode = QuestAimingMode.XRRaycastPreferred,
                    DefaultConfirmationMode = QuestTargetConfirmationMode.DwellOrExplicit,
                    EmphasizeHotspots = false,
                    EmphasizeComparison = false,
                    EmphasizeClosing = true,
                    EstimatedDurationMinutes = 5
                },
                new QuestPresentationPreset
                {
                    PresetId = "GuidedSales",
                    Name = "Vendas guiadas",
                    Description = "Roteiro guiado e hotspots em sequência.",
                    PresetType = QuestPresentationPresetType.GuidedSales,
                    RecommendedUseCase = "Demonstração completa passo a passo.",
                    PrioritizedSections = new List<string> { "GuidedTour", "Hotspots", "Closing" },
                    SkipOptionalSections = false,
                    DefaultNavigationMode = QuestPresentationNavigationMode.Guided,
                    DefaultAimingMode = QuestAimingMode.XRRaycastPreferred,
                    DefaultConfirmationMode = QuestTargetConfirmationMode.DwellOrExplicit,
                    EmphasizeHotspots = true,
                    EmphasizeComparison = false,
                    EmphasizeClosing = true,
                    EstimatedDurationMinutes = 15
                },
                new QuestPresentationPreset
                {
                    PresetId = "PremiumShowcase",
                    Name = "Showcase premium",
                    Description = "Destaque em hotspots e micro-narrativas.",
                    PresetType = QuestPresentationPresetType.PremiumShowcase,
                    RecommendedUseCase = "Cliente interessado em experiência e detalhe.",
                    PrioritizedSections = new List<string> { "Hotspots", "GuidedTour", "Closing" },
                    SkipOptionalSections = false,
                    DefaultNavigationMode = QuestPresentationNavigationMode.FocusedHotspot,
                    DefaultAimingMode = QuestAimingMode.XRRaycastPreferred,
                    DefaultConfirmationMode = QuestTargetConfirmationMode.DwellOrExplicit,
                    EmphasizeHotspots = true,
                    EmphasizeComparison = true,
                    EmphasizeClosing = true,
                    EstimatedDurationMinutes = 20
                },
                new QuestPresentationPreset
                {
                    PresetId = "ComparisonMode",
                    Name = "Modo comparação",
                    Description = "Prioriza comparação entre hotspots.",
                    PresetType = QuestPresentationPresetType.ComparisonMode,
                    RecommendedUseCase = "Escolha entre opções ou variantes.",
                    PrioritizedSections = new List<string> { "Comparison", "Hotspots", "Closing" },
                    SkipOptionalSections = false,
                    DefaultNavigationMode = QuestPresentationNavigationMode.FocusedHotspot,
                    DefaultAimingMode = QuestAimingMode.XRRaycastPreferred,
                    DefaultConfirmationMode = QuestTargetConfirmationMode.DwellOrExplicit,
                    EmphasizeHotspots = true,
                    EmphasizeComparison = true,
                    EmphasizeClosing = true,
                    EstimatedDurationMinutes = 15
                },
                new QuestPresentationPreset
                {
                    PresetId = "ExecutiveReview",
                    Name = "Revisão executiva",
                    Description = "Resumo, resultado e fechamento.",
                    PresetType = QuestPresentationPresetType.ExecutiveReview,
                    RecommendedUseCase = "Decisor com foco em conclusão e próximo passo.",
                    PrioritizedSections = new List<string> { "Closing", "Review", "GuidedTour" },
                    SkipOptionalSections = true,
                    DefaultNavigationMode = QuestPresentationNavigationMode.Guided,
                    DefaultAimingMode = QuestAimingMode.FallbackOnly,
                    DefaultConfirmationMode = QuestTargetConfirmationMode.ExplicitOnly,
                    EmphasizeHotspots = false,
                    EmphasizeComparison = false,
                    EmphasizeClosing = true,
                    EstimatedDurationMinutes = 10
                }
            };
        }
    }
}
