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

namespace EventsAppQuest.Presentation
{
    /// <summary>
    /// Consolida o plano de melhorias da sessão Quest a partir do diagnóstico de qualidade,
    /// outcome, handoff e export. Gera recomendações com categoria, prioridade e acção sugerida.
    /// Mantém tudo em memória; preparado para futura otimização comercial.
    /// </summary>
    public class QuestSessionImprovementPlanController : MonoBehaviour
    {
        private QuestPresentationSession _session;

        /// <summary>Plano actual (pode ser null até GeneratePlan).</summary>
        public QuestSessionImprovementPlan Current => _session?.CurrentImprovementPlan;

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

        /// <summary>Gera ou regera o plano de melhorias a partir do estado actual (quality assessment, outcome, handoff, export).</summary>
        public void GeneratePlan()
        {
            if (_session == null) return;
            try
            {
                var assessment = _session.CurrentQualityAssessment;
                var outcome = _session.CurrentCommercialOutcome;
                var handoff = _session.CurrentHandoffReport;
                var export = _session.CurrentExportPayload;

                var sessionId = assessment?.SessionId ?? handoff?.SessionId ?? export?.SessionId ?? ("Quest_" + DateTime.UtcNow.ToString("yyyyMMddHHmmss"));
                var recommendations = new List<QuestSessionImprovementRecommendation>();
                var id = 0;

                // Recomendações a partir do diagnóstico de qualidade (weaknesses, suggestions, scores baixos)
                if (assessment != null)
                {
                    if (assessment.Weaknesses != null)
                    {
                        foreach (var w in assessment.Weaknesses)
                        {
                            if (string.IsNullOrWhiteSpace(w)) continue;
                            id++;
                            var (category, priority, blocking) = InferCategoryAndPriority(w, assessment);
                            recommendations.Add(new QuestSessionImprovementRecommendation
                            {
                                RecommendationId = "Rec_" + id,
                                Category = category,
                                Priority = priority,
                                Title = "Corrigir ponto fraco",
                                Summary = w,
                                SuggestedAction = "Rever conteúdo ou fluxo da apresentação nesta área.",
                                RelatedArea = category,
                                ExpectedImpact = "Aumentar qualidade percebida da sessão.",
                                IsBlockingIssue = blocking
                            });
                        }
                    }
                    if (assessment.ImprovementSuggestions != null)
                    {
                        foreach (var s in assessment.ImprovementSuggestions)
                        {
                            if (string.IsNullOrWhiteSpace(s)) continue;
                            id++;
                            var (category, priority, blocking) = InferCategoryAndPriority(s, assessment);
                            recommendations.Add(new QuestSessionImprovementRecommendation
                            {
                                RecommendationId = "Rec_" + id,
                                Category = category,
                                Priority = priority,
                                Title = "Aplicar sugestão",
                                Summary = s,
                                SuggestedAction = s,
                                RelatedArea = category,
                                ExpectedImpact = "Melhorar resultado comercial ou engajamento.",
                                IsBlockingIssue = blocking
                            });
                        }
                    }
                    // Recomendações por sub-score baixo
                    if (assessment.PresentationQualityScore < 50)
                    {
                        id++;
                        recommendations.Add(new QuestSessionImprovementRecommendation
                        {
                            RecommendationId = "Rec_" + id,
                            Category = "Presentation",
                            Priority = "High",
                            Title = "Reforçar estrutura da apresentação",
                            Summary = "Score de qualidade da apresentação abaixo de 50.",
                            SuggestedAction = "Garantir plano MR, roteiro guiado e hotspots preenchidos; abrir fechamento pelo menos uma vez.",
                            RelatedArea = "Presentation",
                            ExpectedImpact = "Aumentar PresentationQualityScore.",
                            IsBlockingIssue = false
                        });
                    }
                    if (assessment.CommercialClarityScore < 50)
                    {
                        id++;
                        recommendations.Add(new QuestSessionImprovementRecommendation
                        {
                            RecommendationId = "Rec_" + id,
                            Category = "Commercial",
                            Priority = "High",
                            Title = "Melhorar clareza comercial",
                            Summary = "Clareza comercial abaixo do esperado.",
                            SuggestedAction = "Preencher outcome, decisão e handoff; gerar resumo compartilhável.",
                            RelatedArea = "Commercial",
                            ExpectedImpact = "Aumentar CommercialClarityScore.",
                            IsBlockingIssue = false
                        });
                    }
                    if (assessment.InteractionQualityScore < 50)
                    {
                        id++;
                        recommendations.Add(new QuestSessionImprovementRecommendation
                        {
                            RecommendationId = "Rec_" + id,
                            Category = "Interaction",
                            Priority = "Medium",
                            Title = "Aumentar interação",
                            Summary = "Poucas interações com hotspots, comparação ou fechamento.",
                            SuggestedAction = "Abrir contexto de hotspots, comparação e painel de fechamento; confirmar CTA.",
                            RelatedArea = "Interaction",
                            ExpectedImpact = "Aumentar InteractionQualityScore.",
                            IsBlockingIssue = false
                        });
                    }
                    if (assessment.DecisionReadinessScore < 50)
                    {
                        id++;
                        recommendations.Add(new QuestSessionImprovementRecommendation
                        {
                            RecommendationId = "Rec_" + id,
                            Category = "Decision",
                            Priority = "High",
                            Title = "Definir decisão ou próximo passo",
                            Summary = "Decisão ainda em exploração.",
                            SuggestedAction = "Confirmar CTA no fechamento ou marcar como NeedsFollowUp/ReadyToAdvance no painel de resultado.",
                            RelatedArea = "Closing",
                            ExpectedImpact = "Aumentar DecisionReadinessScore.",
                            IsBlockingIssue = false
                        });
                    }
                    if (assessment.EngagementContributionScore < 50)
                    {
                        id++;
                        recommendations.Add(new QuestSessionImprovementRecommendation
                        {
                            RecommendationId = "Rec_" + id,
                            Category = "Engagement",
                            Priority = "Medium",
                            Title = "Aumentar engajamento",
                            Summary = "Baixo engajamento durante a sessão.",
                            SuggestedAction = "Navegar por mais passos do roteiro, abrir hotspots e confirmar CTA.",
                            RelatedArea = "Engagement",
                            ExpectedImpact = "Aumentar EngagementContributionScore.",
                            IsBlockingIssue = false
                        });
                    }
                }

                // Recomendações a partir de dados em falta
                if (export == null && _session.MRPlan != null)
                {
                    id++;
                    recommendations.Add(new QuestSessionImprovementRecommendation
                    {
                        RecommendationId = "Rec_" + id,
                        Category = "Export",
                        Priority = "High",
                        Title = "Gerar payload de exportação",
                        Summary = "Payload de exportação ainda não foi gerado.",
                        SuggestedAction = "Abrir painel de exportação e usar Gerar payload.",
                        RelatedArea = "Export",
                        ExpectedImpact = "Permitir integração futura com web/backend.",
                        IsBlockingIssue = false
                    });
                }
                if (handoff == null && (outcome != null || export != null))
                {
                    id++;
                    recommendations.Add(new QuestSessionImprovementRecommendation
                    {
                        RecommendationId = "Rec_" + id,
                        Category = "Handoff",
                        Priority = "Medium",
                        Title = "Gerar relatório de handoff",
                        Summary = "Relatório final para comercial ainda não gerado.",
                        SuggestedAction = "Abrir painel de handoff e usar Gerar relatório.",
                        RelatedArea = "Handoff",
                        ExpectedImpact = "Facilitar continuidade comercial.",
                        IsBlockingIssue = false
                    });
                }

                // Ordenar: bloqueantes primeiro, depois High, Medium, Low
                var ordered = recommendations
                    .OrderBy(r => r.IsBlockingIssue ? 0 : 1)
                    .ThenBy(r => r.Priority == "High" ? 0 : (r.Priority == "Medium" ? 1 : 2))
                    .ToList();

                var top = ordered.FirstOrDefault();
                var summaryLines = new List<string>();
                if (ordered.Count == 0) summaryLines.Add("Nenhuma recomendação gerada; calcule primeiro o diagnóstico de qualidade.");
                else
                {
                    summaryLines.Add(ordered.Count + " recomendação(ões) com base no diagnóstico e dados da sessão.");
                    if (top != null) summaryLines.Add("Prioridade: " + (top.Title ?? top.Summary));
                }

                _session.CurrentImprovementPlan = new QuestSessionImprovementPlan
                {
                    SessionId = sessionId ?? "",
                    Recommendations = ordered,
                    TopPriorityRecommendation = top,
                    ImprovementSummary = string.Join(" ", summaryLines),
                    GeneratedAt = DateTime.UtcNow
                };
                _session.LastImprovementPlanGeneratedAt = _session.CurrentImprovementPlan.GeneratedAt;
                _session.HasImprovementPlan = true;
            }
            catch (Exception)
            {
                // Fallback: não quebrar a apresentação
            }
        }

        private static (string category, string priority, bool blocking) InferCategoryAndPriority(string text, QuestSessionQualityAssessment assessment)
        {
            var t = text.ToLowerInvariant();
            string category = "General";
            if (t.Contains("plano") || t.Contains("apresentação") || t.Contains("conteúdo")) category = "Presentation";
            else if (t.Contains("comercial") || t.Contains("decisão") || t.Contains("clareza")) category = "Commercial";
            else if (t.Contains("hotspot") || t.Contains("interação") || t.Contains("fechamento") || t.Contains("comparação")) category = "Interaction";
            else if (t.Contains("decisão") || t.Contains("próximo passo") || t.Contains("cta")) category = "Decision";
            else if (t.Contains("engajamento") || t.Contains("passos") || t.Contains("cta")) category = "Engagement";
            else if (t.Contains("export") || t.Contains("payload")) category = "Export";
            else if (t.Contains("handoff") || t.Contains("relatório")) category = "Handoff";

            var priority = "Medium";
            if (assessment != null && (assessment.QualityLabel == "Low" || assessment.PresentationQualityScore < 30)) priority = "High";
            var blocking = false;
            return (category, priority, blocking);
        }

        /// <summary>Limpa o plano actual e os metadados na sessão.</summary>
        public void ClearPlan()
        {
            if (_session == null) return;
            _session.CurrentImprovementPlan = null;
            _session.LastImprovementPlanGeneratedAt = null;
            _session.HasImprovementPlan = false;
        }
    }
}
