using System;
using System.Collections.Generic;
using EventsAppQuest.Domain.Enums;

namespace EventsAppQuest.Domain.Models
{
    /// <summary>
    /// Proposta interna de um projeto de evento: uma variante utilizável (itens, tema, preset, orçamento, validação, narrativa, revisão).
    /// Permite múltiplas propostas no mesmo projeto para duplicar, selecionar e comparar.
    /// </summary>
    [Serializable]
    public class EventProjectProposal
    {
        /// <summary>Identificador único da proposta.</summary>
        public string Id { get; set; }

        /// <summary>Nome da proposta (ex.: Proposta inicial, Cópia de ...).</summary>
        public string Name { get; set; }

        /// <summary>Id do preset de layout aplicado (se houver).</summary>
        public string PresetId { get; set; }

        /// <summary>Id do tema visual selecionado.</summary>
        public string ThemeId { get; set; }

        /// <summary>Ids dos itens do showroom nesta proposta.</summary>
        public List<string> ShowroomItemIds { get; set; } = new List<string>();

        /// <summary>Associações item → slot do layout.</summary>
        public List<ItemSlotAssignment> ItemSlotAssignments { get; set; } = new List<ItemSlotAssignment>();

        /// <summary>Último resultado de validação da composição (cópia para comparação).</summary>
        public CompositionValidationResult ValidationSummary { get; set; }

        /// <summary>Etapas da narrativa de apresentação comercial.</summary>
        public List<ProposalPresentationStep> PresentationSteps { get; set; }

        /// <summary>Resumo da revisão comercial (prontidão, pontos fortes, alertas).</summary>
        public ProposalReviewSummary ReviewSummary { get; set; }

        /// <summary>Valor total estimado no momento da captura.</summary>
        public float TotalEstimatedPrice { get; set; }

        /// <summary>Quantidade de fornecedores envolvidos (para comparação).</summary>
        public int SupplierCount { get; set; }

        /// <summary>Data/hora de criação (texto para exibição).</summary>
        public string CreatedAt { get; set; }

        /// <summary>Score de aderência da proposta ao briefing do cliente (calculado a partir de orçamento, mood, capacidade, elementos obrigatórios e riscos).</summary>
        public ProposalFitScore FitScore { get; set; }

        /// <summary>Id do pacote comercial associado (tier da proposta).</summary>
        public string SelectedCommercialPackageId { get; set; }

        /// <summary>Plano por momentos/fases do evento (jornada da experiência).</summary>
        public List<ProposalMomentPlan> MomentPlans { get; set; } = new List<ProposalMomentPlan>();

        /// <summary>Transições entre fases da jornada (continuidade da experiência).</summary>
        public List<EventMomentTransition> MomentTransitions { get; set; } = new List<EventMomentTransition>();

        /// <summary>Passos do roteiro guiado para apresentação ao cliente.</summary>
        public List<ProposalGuidedTourStep> GuidedTourSteps { get; set; } = new List<ProposalGuidedTourStep>();

        /// <summary>Hotspots/pontos de destaque visuais da proposta.</summary>
        public List<ProposalVisualHotspot> VisualHotspots { get; set; } = new List<ProposalVisualHotspot>();

        /// <summary>Estados visuais da cena por fase (evolução ao longo do evento).</summary>
        public List<ProposalSceneState> SceneStates { get; set; } = new List<ProposalSceneState>();

        /// <summary>Plano de apresentação para Quest 3 / realidade mista (gerado a partir de roteiro, hotspots, estados de cena, recomendação e resumo executivo).</summary>
        public ProposalMRPresentationPlan MRPresentationPlan { get; set; }
    }
}
