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

namespace EventsAppQuest.Domain.Models
{
    /// <summary>
    /// Projeto de evento criado por um cliente (visualizacao antes de contratar).
    /// Base para proposta/showroom em memoria.
    /// </summary>
    [Serializable]
    public class EventProject
    {
        /// <summary>Identificador unico.</summary>
        public string Id { get; set; }

        /// <summary>Identificador do cliente.</summary>
        public string ClientId { get; set; }

        /// <summary>Nome ou titulo do projeto.</summary>
        public string Name { get; set; }

        /// <summary>Id do espaco associado.</summary>
        public string SpaceId { get; set; }

        /// <summary>Id da categoria de evento.</summary>
        public string EventCategoryId { get; set; }

        /// <summary>Id do template de evento associado (se selecionado).</summary>
        public string EventTemplateId { get; set; }

        /// <summary>Ids dos fornecedores selecionados na proposta.</summary>
        public List<string> SupplierIds { get; set; } = new List<string>();

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

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

        /// <summary>Status do projeto (rascunho, pronta).</summary>
        public EventProjectStatus Status { get; set; }

        /// <summary>Data prevista do evento (se definida).</summary>
        public string PlannedDate { get; set; }

        /// <summary>Último resultado de validação da composição (em memória, para exibição na UI).</summary>
        public CompositionValidationResult LastCompositionValidation { get; set; }

        /// <summary>Id do tema visual selecionado (direção estética da proposta).</summary>
        public string SelectedThemeId { get; set; }

        /// <summary>Narrativa de apresentação comercial gerada (etapas em ordem).</summary>
        public List<ProposalPresentationStep> GeneratedPresentationSteps { get; set; }

        /// <summary>Última revisão comercial da proposta (em memória).</summary>
        public ProposalReviewSummary LastProposalReviewSummary { get; set; }

        /// <summary>Id do preset de layout aplicado ao estado atual (para snapshot e proposta ativa).</summary>
        public string AppliedPresetId { get; set; }

        /// <summary>Id do pacote comercial aplicado ao estado atual (reflete a proposta ativa).</summary>
        public string AppliedCommercialPackageId { get; set; }

        /// <summary>Dados derivados atuais (espelho da proposta ativa): plano de momentos.</summary>
        public List<ProposalMomentPlan> CurrentMomentPlans { get; set; } = new List<ProposalMomentPlan>();

        /// <summary>Transições entre fases (espelho da proposta ativa).</summary>
        public List<EventMomentTransition> CurrentMomentTransitions { get; set; } = new List<EventMomentTransition>();

        /// <summary>Roteiro guiado atual (espelho da proposta ativa).</summary>
        public List<ProposalGuidedTourStep> CurrentGuidedTourSteps { get; set; } = new List<ProposalGuidedTourStep>();

        /// <summary>Hotspots visuais atuais (espelho da proposta ativa).</summary>
        public List<ProposalVisualHotspot> CurrentVisualHotspots { get; set; } = new List<ProposalVisualHotspot>();

        /// <summary>Estados de cena atuais (espelho da proposta ativa).</summary>
        public List<ProposalSceneState> CurrentSceneStates { get; set; } = new List<ProposalSceneState>();

        /// <summary>Plano MR atual (espelho da proposta ativa).</summary>
        public ProposalMRPresentationPlan CurrentMRPresentationPlan { get; set; }

        /// <summary>Propostas internas do projeto (variantes para comparar).</summary>
        public List<EventProjectProposal> Proposals { get; set; } = new List<EventProjectProposal>();

        /// <summary>Id da proposta ativa; o estado atual (showroom, slots, tema, etc.) reflete esta proposta.</summary>
        public string ActiveProposalId { get; set; }

        /// <summary>Briefing comercial do cliente e parâmetros do evento (perfil e preferências).</summary>
        public ClientEventBrief ClientBrief { get; set; }

        /// <summary>Última comparação temporal entre propostas (em memória, para exibição).</summary>
        public ProposalTemporalComparison LastTemporalComparison { get; set; }

        /// <summary>Última recomendação executiva da melhor proposta (em memória).</summary>
        public ProposalRecommendationSummary LastRecommendationSummary { get; set; }

        /// <summary>Último resumo executivo de decisão para fechamento (em memória).</summary>
        public ProposalDecisionSummary LastDecisionSummary { get; set; }

        /// <summary>Retorna a proposta ativa ou null.</summary>
        public EventProjectProposal GetActiveProposal()
        {
            if (string.IsNullOrEmpty(ActiveProposalId) || Proposals == null) return null;
            return Proposals.Find(p => p.Id == ActiveProposalId);
        }
    }
}
