using System;
using System.Collections.Generic;
using EventsAppQuest.Web.Core;
using EventsAppQuest.Web.Domain;

namespace EventsAppQuest.Web.Application
{
    /// <summary>
    /// Mapeia o resultado de uma sessão Quest (snapshot) para atualizações úteis no CRM Web.
    /// Não referencia tipos Quest; recebe apenas QuestSessionSnapshot (DTO).
    /// </summary>
    public static class QuestSessionToCRMMapper
    {
        /// <summary>Converte o snapshot numa atualização para SessionRecord e sugestão de estágio para oportunidade.</summary>
        public static void MapToSessionAndOpportunity(
            QuestSessionSnapshot snapshot,
            string opportunityId,
            string proposalRecordId,
            out SessionRecord sessionRecord,
            out OpportunityStage? suggestedStage,
            out List<string> indicators)
        {
            sessionRecord = new SessionRecord
            {
                Id = "sess-" + Guid.NewGuid().ToString("N").Substring(0, 8),
                SessionId = snapshot.SessionId,
                OpportunityId = opportunityId,
                ProposalRecordId = proposalRecordId,
                RecommendedProposalId = snapshot.RecommendedProposalId,
                SelectedProposalId = snapshot.SelectedProposalId,
                FinalDecisionState = snapshot.FinalDecisionState,
                ConfirmedCTA = snapshot.ConfirmedCTA,
                SuggestedNextAction = snapshot.SuggestedNextAction,
                FollowUpPriority = snapshot.FollowUpPriority,
                HasExportPayload = snapshot.HasExportPayload,
                HasHandoffReport = snapshot.HasHandoffReport,
                HasShareableSummary = snapshot.HasShareableSummary,
                HasQualityAssessment = snapshot.HasQualityAssessment,
                HasImprovementPlan = snapshot.HasImprovementPlan,
                OutcomeSummary = snapshot.OutcomeSummary,
                EngagementLabel = snapshot.EngagementLabel,
                QualityLabel = snapshot.QualityLabel,
                ConfidenceLevel = snapshot.ConfidenceLevel,
                LastSessionTimestamp = snapshot.Timestamp,
                HeldAt = snapshot.Timestamp,
                CreatedAt = snapshot.Timestamp
            };

            suggestedStage = SuggestOpportunityStage(snapshot);
            indicators = GetIndicatorsFromSnapshot(snapshot);
        }

        /// <summary>Lógica simples: sessão com CTA forte e decisão ReadyToClose -> ReadyToClose; exploratória -> FollowUp; baixa qualidade/engajamento -> mantém FollowUp ou "Needs Review".</summary>
        public static OpportunityStage? SuggestOpportunityStage(QuestSessionSnapshot snapshot)
        {
            if (snapshot.FinalDecisionState == WebSessionDecisionState.ReadyToClose)
                return OpportunityStage.ReadyToClose;

            if (snapshot.FinalDecisionState == WebSessionDecisionState.ExplorationOnly)
                return OpportunityStage.FollowUp;

            if (snapshot.FinalDecisionState == WebSessionDecisionState.Interested || snapshot.FinalDecisionState == WebSessionDecisionState.NeedsFollowUp)
                return OpportunityStage.QuestSessionDone;

            if (snapshot.FinalDecisionState == WebSessionDecisionState.ReadyToAdvance)
                return OpportunityStage.ReadyToClose;

            return OpportunityStage.QuestSessionDone;
        }

        /// <summary>Indicadores comerciais derivados da sessão Quest.</summary>
        public static List<string> GetIndicatorsFromSnapshot(QuestSessionSnapshot snapshot)
        {
            var list = new List<string>();

            if (snapshot.FinalDecisionState == WebSessionDecisionState.ReadyToClose || snapshot.FinalDecisionState == WebSessionDecisionState.ReadyToAdvance)
                list.Add("Alta intenção");
            if (snapshot.FinalDecisionState == WebSessionDecisionState.Interested || snapshot.FinalDecisionState == WebSessionDecisionState.NeedsFollowUp)
                list.Add("Precisa follow-up");
            if (snapshot.FinalDecisionState == WebSessionDecisionState.ReadyToClose)
                list.Add("Pronta para fechamento");
            if (snapshot.FinalDecisionState == WebSessionDecisionState.ExplorationOnly)
                list.Add("Sessão pouco conclusiva");
            if (!string.IsNullOrEmpty(snapshot.QualityLabel) && (snapshot.QualityLabel.IndexOf("Low", StringComparison.OrdinalIgnoreCase) >= 0 || snapshot.QualityLabel.IndexOf("Baixa", StringComparison.OrdinalIgnoreCase) >= 0))
                list.Add("Precisa revisar proposta");
            if (!string.IsNullOrEmpty(snapshot.EngagementLabel) && (snapshot.EngagementLabel.IndexOf("Low", StringComparison.OrdinalIgnoreCase) >= 0 || snapshot.EngagementLabel.IndexOf("Baixo", StringComparison.OrdinalIgnoreCase) >= 0))
                list.Add("Sessão pouco conclusiva");

            return list;
        }
    }
}
