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

namespace EventsAppQuest.Presentation
{
    /// <summary>
    /// Controla o onboarding imersivo da sessão Quest: abre/fecha o painel de entrada guiada,
    /// preenche contexto (proposta, preset, modo, objetivo, dicas) a partir da sessão.
    /// Mantém estado em memória; preparado para reabertura manual.
    /// </summary>
    public class QuestPresentationOnboardingController : MonoBehaviour
    {
        private QuestPresentationSession _session;

        /// <summary>Estado actual do onboarding (pode ser null).</summary>
        public QuestPresentationOnboardingState Current => _session?.CurrentOnboardingState;

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

        /// <summary>Abre o onboarding e actualiza o estado com dados da sessão (proposta, preset, modo, objetivo, dicas).</summary>
        public void OpenOnboarding()
        {
            if (_session == null) return;
            try
            {
                EnsureState();
                _session.CurrentOnboardingState.IsOnboardingOpen = true;
                _session.CurrentOnboardingState.LastOpenedAt = DateTime.UtcNow;
                UpdateStateContent();
            }
            catch (Exception)
            {
                // Fallback: não quebrar a apresentação
            }
        }

        /// <summary>Fecha o painel de onboarding (estado mantém-se; pode reabrir).</summary>
        public void CloseOnboarding()
        {
            if (_session?.CurrentOnboardingState == null) return;
            try
            {
                _session.CurrentOnboardingState.IsOnboardingOpen = false;
            }
            catch (Exception) { }
        }

        /// <summary>Inicia a apresentação: fecha onboarding e marca HasSeenOnboarding.</summary>
        public void StartPresentation()
        {
            if (_session == null) return;
            try
            {
                CloseOnboarding();
                _session.HasSeenOnboarding = true;
            }
            catch (Exception) { }
        }

        /// <summary>Actualiza o conteúdo do estado a partir da sessão (título, proposta, preset, modo, objetivo, dicas, duração, pronto).</summary>
        public void UpdateStateContent()
        {
            if (_session?.CurrentOnboardingState == null) return;
            try
            {
                var state = _session.CurrentOnboardingState;
                state.SessionTitle = !string.IsNullOrEmpty(_session.MRPlan?.PresentationTitle)
                    ? _session.MRPlan.PresentationTitle
                    : "Apresentação Quest";
                state.ProposalLabel = _session.Proposal != null
                    ? (_session.Proposal.Name ?? _session.Proposal.Id ?? "Proposta activa")
                    : "—";
                var preset = _session.CurrentPresentationPreset;
                state.PresetLabel = preset != null ? (preset.Name ?? preset.PresetId ?? "Preset") : "Nenhum";
                state.RuntimeModeLabel = _session.RuntimeMode.ToString();
                state.PrimaryGoal = preset != null && !string.IsNullOrEmpty(preset.RecommendedUseCase)
                    ? preset.RecommendedUseCase
                    : "Conhecer a proposta e concluir com decisão ou próximo passo.";
                state.InteractionHints = BuildHints();
                state.EstimatedDurationMinutes = preset != null && preset.EstimatedDurationMinutes > 0
                    ? preset.EstimatedDurationMinutes
                    : 15;
                state.IsReadyToStart = _session.MRPlan != null && (_session.GuidedSteps != null && _session.GuidedSteps.Count > 0 || _session.Hotspots != null && _session.Hotspots.Count > 0);
            }
            catch (Exception) { }
        }

        private void EnsureState()
        {
            if (_session.CurrentOnboardingState == null)
                _session.CurrentOnboardingState = new QuestPresentationOnboardingState();
        }

        private List<string> BuildHints()
        {
            var hints = new List<string>();
            hints.Add("Use os botões ou teclas para navegar (próximo passo, hotspot, modo).");
            hints.Add("Abra o contexto dos hotspots para detalhes e micro-narrativa.");
            hints.Add("Use o painel de fechamento para concluir e confirmar CTA.");
            if (_session?.CurrentPresentationPreset != null)
            {
                if (_session.CurrentPresentationPreset.EmphasizeComparison)
                    hints.Add("Compare hotspots para ver diferenças entre opções.");
                if (_session.CurrentPresentationPreset.EmphasizeHotspots)
                    hints.Add("Este modo destaca a exploração de hotspots.");
            }
            return hints;
        }
    }
}
