# Arquitetura

## Visão geral
O projeto segue uma estrutura em camadas para facilitar evolução e manutenção, com foco em domínio rico e desacoplamento.

## Estrutura de pastas (Assets)

```
Assets/
├── Core/           # Bootstrap, configuração, registro de serviços, roteamento
├── Domain/         # Entidades, enums e regras de negócio puras
├── Application/    # Contratos (interfaces) e casos de uso
├── Infrastructure/ # Implementações (mocks, futuros repositórios/APIs)
├── Presentation/   # Cenas, UI, entrada do usuário (incl. Quest)
├── Web/            # Camada Web hotel/espaço (CRM, pipeline, sessões) — isolada do Quest
└── ...
Docs/               # Documentação do projeto
Docs/Web/           # Documentação da camada Web (WEB_OVERVIEW, WEB_ARCHITECTURE, etc.)
```

## Camadas

| Camada | Responsabilidade |
|--------|------------------|
| **Core** | Inicialização do app (AppBootstrap), configuração (AppConfig), registro de serviços (ServiceRegistry), roteamento de cenas (SceneRouter). |
| **Domain** | Modelos de domínio (Space, Supplier, EventCategory, etc.), enums. Não depende de outras camadas. |
| **Application** | Contratos (ISpaceService, ISupplierService, ITemplateService) e orquestração; não depende de Unity nem de UI. |
| **Infrastructure** | Implementações concretas (MockSpaceService, etc.) e futuros repositórios/APIs. |
| **Presentation** | Cenas (ex.: Bootstrap.unity), componentes Unity, UI; consome Core e Application. |

## Fluxo de dependência
- **Presentation** → Application, Core  
- **Application** → Domain  
- **Infrastructure** → Domain e Application (implementa interfaces)  
- **Core** → Domain, Application, Infrastructure (registra mocks)  
- **Domain** não depende de nenhuma outra camada.

**Camada Web (Assets/Web/):** isolada do Quest e do Core principal. Destinada ao CRM e operação comercial do hotel/espaço (leads, oportunidades, propostas, sessões Quest associadas, follow-ups). Não altera QuestPresentation, AppSession nem fluxo Quest. Ver **Docs/Web/WEB_ARCHITECTURE.md**.

## Fluxo de bootstrap (inicialização)

1. **Cena Bootstrap** é carregada (primeira cena em Build Settings).
2. O GameObject **Bootstrap** contém o componente **AppBootstrap**, que referencia o asset **AppConfig** (em `Assets/Core/AppConfig.asset`).
3. Em **Awake**, o AppBootstrap:
   - Lê o AppConfig (UseMockServices, MainSceneName).
   - Registra no **ServiceRegistry** os serviços mock (ISpaceService, ISupplierService, ITemplateService) quando UseMockServices é true.
   - Registra o **SceneRouter**.
4. Após o bootstrap, qualquer script pode obter serviços via `ServiceRegistry.Instance.Get<T>()` e trocar de cena via `SceneRouter.LoadScene(nome)` ou `LoadMainScene(config)`.

A configuração inicial está fechada: a cena **Bootstrap.unity** e o asset **AppConfig.asset** existem e estão ligados; ao abrir o projeto e rodar a cena Bootstrap, o fluxo inicial é executado sem passos manuais adicionais (salvo definir Bootstrap em Build Settings).

## Preparação para evolução
- Catálogo de espaços e fornecedores: serviços e repositórios na Infrastructure.  
- Projetos de eventos e propostas: domínio já contempla EventProject e Proposal.  
- **Plano lógico do espaço:** o domínio inclui **SpaceLayoutSlot** (slots/áreas lógicas do layout: entrada, palco, área de mesas, lounge, etc.) e **ItemSlotAssignment** (associação item do showroom → slot). O **EventProject** mantém `ItemSlotAssignments`, permitindo saber “onde” cada item pertence no ambiente. Ao iniciar um projeto, os itens padrão são mapeados automaticamente para slots compatíveis usando **regras de compatibilidade** (ver abaixo). Essa base lógica prepara a futura visualização em MR sem usar geometria 3D real ainda.  
- **Capacidade do espaço e adequação operacional:** o domínio inclui **SpaceCapacityEvaluationResult** (EstimatedCapacityMin/Max, RecommendedRangeText, Status Comfortable/AtLimit/OverCapacity, OperationalRisks, GuestCountFromBrief). **Space** inclui MaxRecommendedGuests, MaxGuestsStanding, MaxGuestsSeated; **SpaceLayoutSlot** inclui CapacityContribution, IsSeatingArea; **ShowroomItem** inclui SeatingProvided, StandingAreaImpact. O **ISpaceCapacityEvaluationService** (MockSpaceCapacityEvaluationService) avalia a capacidade da proposta (espaço + slots com itens + itens), comparando com convidados do briefing. **CapacityFitScore** deixa de ser neutro (confortável 100, no limite 65, acima 0). **ProposalReviewSummary** inclui **CapacitySummary**. A view **SpaceCapacityView** exibe convidados, capacidade estimada, faixa, status e riscos; a comparação entre propostas inclui capacidade e "melhor acomodação". O diagnóstico é recalculado quando mudam briefing, itens, preset, proposta ativa ou layout. Isso prepara experiências mais críveis em MR.
- **Fluxo do evento e logística operacional:** o domínio inclui **SpaceLayoutSlot** com metadados de circulação (IsCirculationCritical, AccessPriority, CongestionRiskWeight, AdjacentZoneHints), **ShowroomItem** com impacto logístico (BlocksCirculation, RequiresServiceAccess, ServiceAccessPriority, FootprintWeight) e **EventFlowEvaluationResult** (OverallFlowStatus Good/Warning/Critical, CongestionRiskScore, ServiceAccessScore, CirculationWarnings, ZoneRiskSummaries, Recommendations). O **IEventFlowEvaluationService** (MockEventFlowEvaluationService) avalia circulação, gargalos e acesso de serviço a partir do layout e dos itens da proposta. O **fit score** e o **review** incorporam fluxo (RiskScore, Gaps, Recommendations, Highlights; **ProposalReviewSummary.FlowSummary**). A view **EventFlowView** (área "Fluxo do Evento / Logística Operacional") exibe status geral, scores de risco de gargalo e acesso de serviço, avisos e recomendações; a comparação entre propostas inclui fluxo e "melhor fluxo". O diagnóstico de fluxo é recalculado quando mudam briefing, itens, slots, preset ou proposta ativa. Isso prepara avaliação mais realista e futuras experiências visuais e imersivas mais críveis no Quest 3.
- **Cronograma operacional e sequência de montagem:** o domínio inclui **ShowroomItem** com metadados de montagem (SetupDurationMinutes, RequiresEarlySetup, SetupDependencyTypes, RequiresSupplierOnSite, ExecutionPriority) e **EventSetupTimelineEvaluationResult** (EstimatedTotalSetupMinutes, CriticalSteps, SetupWarnings, DependencyIssues, ExecutionReadinessStatus Ready/Warning/NotReady, Recommendations). O **IEventSetupTimelineService** (MockEventSetupTimelineService) avalia tempo total de montagem, passos críticos, dependências (ex.: Stage, Power, Structure) e prontidão para execução. O **fit score** e o **review** incorporam cronograma (RiskScore, Gaps, Recommendations, Highlights; **ProposalReviewSummary.SetupTimelineSummary**). A view **EventSetupTimelineView** (área "Cronograma / Montagem do Evento") exibe tempo estimado, status de prontidão, passos críticos, dependências, avisos e recomendações; a comparação entre propostas inclui tempo de montagem e "mais pronta para execução". O diagnóstico é recalculado quando mudam itens, slots, proposta ativa ou preset. Isso prepara experiências futuras mais realistas e confiáveis no Quest 3.
- **Cobertura operacional por fornecedores e lacunas de execução:** o domínio inclui **Supplier** com metadados de cobertura (SupportedItemTypes, SupportsEarlySetup, SupportsOnSiteExecution, SupplierPriorityLevel, CapacityTier) e **SupplierCoverageEvaluationResult** (CoverageScore, MissingSupplierCapabilities, WeakCoverageAreas, CoveredZones, CoverageWarnings, Recommendations). O **ISupplierCoverageEvaluationService** (MockSupplierCoverageEvaluationService) avalia se os itens da proposta estão suportados pelos fornecedores (tipo de item, montagem antecipada, execução no local) e detecta excesso de dependência em poucos fornecedores. O **fit score** e o **review** incorporam cobertura (RiskScore, Gaps, Recommendations, Highlights; **ProposalReviewSummary.SupplierCoverageSummary**). A view **SupplierCoverageView** (área "Cobertura de Fornecedores / Lacunas Operacionais") exibe score de cobertura, lacunas, áreas fracas, zonas cobertas, avisos e recomendações; a comparação entre propostas inclui cobertura e "melhor cobertura". O diagnóstico é recalculado quando mudam itens, proposta ativa ou preset. Isso prepara experiências futuras mais confiáveis e realistas no Quest 3.
- **Momentos/fases do evento e jornada da experiência:** o domínio inclui **EventMomentPhase** (Id, Name, Description, PhaseType, DisplayOrder, IsCoreMoment), **EventMomentPhaseType** (Reception, Ceremony, Dining, Presentation, Party, Networking, Closing), **ProposalMomentPlan** (PhaseId, RelatedShowroomItemIds, RelatedZoneTypes, KeySupplierIds, EstimatedDurationMinutes, HighlightText) e **EventProjectProposal.MomentPlans**. O **IEventMomentPlanningService** (MockEventMomentPlanningService) gera o plano de momentos a partir da proposta (categoria/template, showroom items, zonas, narrativa, fornecedores). A view **EventMomentPlanView** (área "Momentos do Evento / Jornada da Experiência") exibe fases em ordem, descrição, duração estimada, itens principais e fornecedores-chave por fase e destaque. O plano é recalculado quando mudam proposta ativa, showroom items, preset, tema ou narrativa. O **ProposalReviewSummary** inclui **JourneySummary** e **MomentPlanCount**; a comparação entre propostas indica "jornada mais completa" e exibe resumo de fases por proposta. Isso prepara apresentações mais imersivas e temporalmente coerentes no Quest 3 (jornada do evento ao longo do tempo).
- **Primeira base executável e de navegação para Quest (cena de apresentação):** existe uma cena dedicada **QuestPresentation** (Assets/Presentation/Scenes/QuestPresentation.unity) e um **QuestPresentationController** que monta a sessão a partir do projeto ativo (AppSession, proposta ativa, MRPresentationPlan, GuidedTourSteps, VisualHotspots, SceneStates, DecisionSummary). **QuestPresentationCameraRig** configura câmera/orientação para headset (altura dos olhos); se ausente, o controlador cria o rig em runtime. O estado da apresentação é **QuestPresentationSession** (Core), com **NavigationMode**, **CurrentGuidedStepIndex**, CurrentHotspotIndex, CurrentSceneStateIndex, **IsPresentationReady**, **RuntimeReadiness**, **FocusedTargetType** e **IsInteractionModeActive**. O **IQuestRuntimeReadinessService** avalia a prontidão; o resultado é exibido na HUD e no painel de fallback. **QuestPresentationNavigationController**, **QuestPresentationFocusController** e **QuestSelectionController** (alvos **QuestSelectableTarget** — passo, hotspot, estado, ação, modo; Next/PreviousSelectable, ConfirmSelection, CancelSelection; **QuestInteractionCommand** para comandos abstractos) tratam navegação, foco e seleção; **QuestPointerPreparationController** (alvos **QuestPointableTarget**; SetPointedFromSimulatedHit), **QuestSimulatedPointerController** (raycast/gaze simulado: **QuestSimulatedPointerHit**, **QuestPointerSourceMode** FocusDriven/CenterScreenSimulated/ManualCycleAssisted; PerformSimulatedHit com critério espacial/situacional; P = alternar modo) e **QuestWorldCursorController** (retículo e label no mundo) formam a camada de cursor/alvo e apontamento simulado; **QuestPresentationInputAdapter** mapeia teclado (e futuramente input do headset) para navegação, foco, seleção (F, G, Enter, Backspace), modo de apontamento (P) e ConfirmPointedTarget (Enter). A UI inclui **QuestPresentationHUD** (overlay, indicadores de foco, seleção e alvo apontado) e **QuestWorldUIPanelLayout** (World Space com destaque de foco (azul), seleção (verde) e alvo apontado (âmbar); indicadores Foco|Modo interação|Ação, Selecionado|Ação|Enter e Alvo apontado|Interagível|Ação; GetCursorParent para cursor). Botões Próx. foco, Ativar, Sair foco, Próx. alvo, Ativar sel., Cancelar sel., UI: HUD/Espacial; se a camada de cursor/alvo falhar, foco e seleção continuam. Esta etapa é a **base para futura UI imersiva e apresentação em MR** (ainda sem MR real, passthrough ou scene understanding). A base de plataforma Quest está em **Docs/QUEST_PLATFORM.md**.
- **Plano de apresentação para Quest 3 / realidade mista:** o domínio inclui **ProposalMRPresentationPlan** (ProposalId, PresentationTitle, TargetExperienceMode, GuidedSequenceStepIds, HotspotIds, SceneStateIds, PriorityZones, KeySellingMoments, RecommendedSessionDurationMinutes, ExecutivePresentationGoal, ReadyForMRMapping) e **MRPresentationTargetMode** (GuidedSalesTour, FreeExploration, SideBySideComparison, ExecutiveClosingMode). **EventProjectProposal** armazena **MRPresentationPlan**. O **IMRPresentationPlanningService** (MockMRPresentationPlanningService) gera o plano a partir do roteiro guiado, hotspots, estados de cena, recomendação, resumo executivo, momentos e transições; define modo recomendado, duração, objetivo executivo e prontidão para mapeamento MR. A view **MRPresentationPlanView** (área "Plano Quest / Apresentação em Realidade Mista") exibe modo, título, sequência guiada, hotspots, estados de cena, zonas prioritárias, momentos-chave, duração, objetivo e status de prontidão MR. O resumo do projeto exibe se a proposta possui plano Quest/MR, modo de apresentação e se está pronta para mapeamento MR. A revisão inclui **ReadyForMRMapping** e **MRPresentationModeSuggested**; a comparação entre propostas indica "mais pronta p/ Quest", "melhor potencial de tour guiado" e "melhor fechamento imersivo". O plano é recalculado quando mudam proposta ativa, roteiro guiado, hotspots, estados de cena, recomendação ou resumo executivo. Isso constitui a **ponte entre a camada web/comercial e a futura experiência imersiva no Quest 3** (sem implementar MR/3D/Meta SDK ainda).
- **Resumo executivo de decisão e fechamento:** o domínio inclui **ProposalDecisionSummary** (RecommendedProposalId, ExecutiveHeadline, ExecutiveShortSummary, MainDecisionReasons, KeyRisks, BudgetConclusion, ExperienceConclusion, OperationalConclusion, FinalSalesMessage, SuggestedNextAction, DecisionReadinessLevel) e **ProposalDecisionReadinessLevel** (NotReady, UnderReview, ReadyToPresent, ReadyToClose). O **EventProject** armazena **LastDecisionSummary**. O **IProposalDecisionSummaryService** (MockProposalDecisionSummaryService) gera o resumo executivo a partir da recomendação final, fit score, review, comparação geral, comparação temporal, briefing e prontidão; produz manchete, resumo curto, razões da decisão, riscos-chave, conclusões (orçamento, experiência, operacional), mensagem final de venda, próxima ação sugerida e nível de prontidão (NotReady → ReadyToClose). A view **ProposalDecisionSummaryView** (área "Resumo Executivo / Fechamento") exibe todos os campos de forma legível. O resumo é recalculado na view e no resumo do projeto quando mudam recomendação, fit score, review, comparação temporal, briefing ou proposta ativa. O **resumo do projeto** (SelectionSummaryView) exibe se existe resumo executivo, nível de prontidão para fechamento e próxima ação sugerida. Isso prepara **diretamente** a futura experiência de fechamento no Quest 3 (síntese clara e comercial para apoio à decisão).
- **Recomendação executiva da melhor proposta:** o domínio inclui **ProposalRecommendationSummary** (RecommendedProposalId, RecommendationConfidenceScore, ExecutiveSummary, WhyItWins, Tradeoffs, BudgetPositioning, ExperiencePositioning, OperationalPositioning, SuggestedSalesAngle, SecondaryOptionId, SecondaryOptionReason) e **EventProject.LastRecommendationSummary**. O **IProposalRecommendationService** (MockProposalRecommendationService) recomenda a melhor proposta com base em fit score, review (prontidão, orçamento, mood, evolução visual), comparação temporal (BetterVisualContinuity, BetterOperationalContinuity, BetterSalesImpact) e viabilidade operacional; gera resumo executivo, motivos de vitória, tradeoffs, posicionamentos e segunda opção. A view **ProposalRecommendationView** (área "Recomendação Final / Melhor Proposta") exibe proposta recomendada, confiança, resumo executivo, por que vence, tradeoffs, posicionamento orçamento/experiência/operacional, ângulo de venda e segunda opção. A recomendação é recalculada na view e no resumo quando mudam propostas, fit score, review, comparação temporal, briefing ou proposta ativa. O **resumo do projeto** (SelectionSummaryView) exibe se existe recomendação final, qual proposta está recomendada e o nível de confiança. Isso prepara **diretamente** a futura apresentação decisiva no Quest 3 (indicação clara da opção mais adequada ao cliente).
- **Comparação temporal entre propostas:** o domínio inclui **ProposalTemporalComparison** (BaseProposalId, ComparedProposalId, PhaseComparisons, OverallExperienceDifferenceSummary, StrongerMoments, WeakerMoments, BetterVisualContinuity, BetterOperationalContinuity, BetterSalesImpact) e **ProposalPhaseComparison** (PhaseId, BaseSceneStateSummary, ComparedSceneStateSummary, KeyDifferences, BetterOption, Notes). O **EventProject** armazena **LastTemporalComparison** (última comparação em memória). O **IProposalTemporalComparisonService** (MockProposalTemporalComparisonService) compara duas propostas ao longo da jornada com base em scene states, transições, hotspots, fit score e review; gera comparações por fase e indicadores de melhor jornada visual, continuidade operacional e impacto comercial. A view **ProposalTemporalComparisonView** (área "Comparação Temporal / Evolução das Propostas") exibe propostas comparadas, resumo geral, momentos mais fortes de cada uma, continuidade visual/operacional, impacto comercial e comparações por fase. A comparação é recalculada na própria view quando mudam propostas, scene states, transições, hotspots ou review. A **comparação geral** (ProjectProposalComparisonView) e o **resumo do projeto** (SelectionSummaryView) passam a refletir melhor evolução da experiência, melhor jornada visual, melhor continuidade operacional, melhor impacto comercial, e se existe comparação temporal e quantas fases estão cobertas. Isso prepara **diretamente** apresentações comparativas muito mais fortes no Quest 3 (antes vs depois ao longo do evento).
- **Estados visuais da cena por fase:** o domínio inclui **ProposalSceneState** (Id, RelatedPhaseId, Name, Description, ActiveShowroomItemIds, ActiveZoneTypes, PrimaryHotspotIds, VisualMood, TransitionFromPreviousSummary, DisplayOrder) e **EventProjectProposal.SceneStates**. O **IProposalSceneStateService** (MockProposalSceneStateService) gera estados visuais a partir de moment plans, transições, hotspots, tema e showroom (uma fase = um estado; transição preenche TransitionFromPreviousSummary; hotspots principais por fase; mood do tema). A view **ProposalSceneStateView** (área "Estados da Cena / Evolução Visual do Evento") exibe ordem, fase, nome, descrição, itens ativos, zonas ativas, hotspots principais e resumo da transição. Os estados são recalculados quando mudam proposta ativa, moment plans, transições, hotspots, tema ou showroom. O **ProposalReviewSummary** inclui **SceneStateSummary**, **SceneStateCount** e **HasStructuredVisualEvolution**; a comparação indica "evolução visual mais rica" e "estados mais coerentes / melhor continuidade visual"; o resumo do projeto exibe quantidade de estados da cena e se há evolução visual estruturada. Isso prepara **diretamente** a futura visualização dinâmica no Quest 3 (como o espaço muda ao longo do evento).
- **Hotspots/pontos de destaque visuais:** o domínio inclui **ProposalVisualHotspot** (Id, Title, Description, RelatedZoneTypes, RelatedShowroomItemIds, RelatedGuidedTourStepId, HotspotType, HighlightPriority, SalesValueScore, SuggestedFocusDurationMinutes, IsPremiumUpsell, Notes) e **ProposalVisualHotspotType** (EntranceImpact, ThemeHighlight, PremiumDecor, DiningExperience, StageMoment, LoungeExperience, SupplierShowcase, OperationalConfidence, ClosingVisual). **EventProjectProposal** armazena **VisualHotspots**. O **IProposalVisualHotspotService** (MockProposalVisualHotspotService) gera hotspots com base em roteiro guiado, tema, pacote, momentos e itens. A view **ProposalVisualHotspotView** (área "Hotspots Visuais / Pontos de Destaque") exibe prioridade, título, descrição, tipo, zonas/itens, valor comercial, duração de foco e upsell premium. Os hotspots são recalculados quando mudam proposta ativa, roteiro, tema, pacote, showroom ou review. O **ProposalReviewSummary** inclui **VisualHotspotSummary**, **VisualHotspotCount**, **PrimaryHotspotTitle** e **HasPremiumHotspots**; a comparação indica "maior impacto visual" e "melhor upsell visual"; o resumo do projeto exibe quantidade de hotspots, principal e destaques premium. Isso prepara diretamente a futura camada de foco e apresentação no Quest 3.
- **Roteiro guiado e apresentação ao cliente:** o domínio inclui **ProposalGuidedTourStep** (Id, Title, Description, RelatedPhaseId, RelatedZoneTypes, RelatedShowroomItemIds, FocusType, SuggestedDurationMinutes, SalesMessage, DisplayOrder, IsKeyMoment) e **ProposalGuidedTourFocusType** (Welcome, SpaceOverview, ThemeHighlight, MomentHighlight, SupplierHighlight, PremiumUpsell, OperationalConfidence, Closing). **EventProjectProposal** armazena **GuidedTourSteps**. O **IProposalGuidedTourService** (MockProposalGuidedTourService) gera o roteiro com base em narrativa, moment plans, transições, tema, pacote comercial e review. A view **ProposalGuidedTourView** (área "Roteiro Guiado / Apresentação ao Cliente") exibe ordem, título, descrição, foco, duração sugerida, mensagem comercial e momento-chave. O roteiro é recalculado quando mudam proposta ativa, narrativa, moment plans, transições, pacote ou tema. O **ProposalReviewSummary** inclui **GuidedTourSummary**, **GuidedTourStepCount** e **ReadyForGuidedPresentation**; a comparação indica "apresentação mais forte" e "roteiro mais claro"; o resumo do projeto exibe quantidade de passos e prontidão para apresentação guiada. Isso prepara diretamente a futura experiência de visita guiada no Quest 3.
- **Transições entre momentos/fases e continuidade da experiência:** o domínio inclui **EventMomentTransition** (FromPhaseId, ToPhaseId, TransitionType, EstimatedTransitionMinutes, RequiresSpaceReset, RequiresSupplierCoordination, SmoothnessScore, Notes) e **EventMomentTransitionType** (DirectFlow, Reconfiguration, GuestRelocation, ServiceTurnover, ClosingTransition). **EventProjectProposal** armazena **MomentTransitions**. O **IEventMomentTransitionService** (MockEventMomentTransitionService) gera transições entre os MomentPlans (sequência, zonas, fornecedores, necessidade de reconfiguração e impacto operacional). A view **EventMomentTransitionView** (área "Transições da Jornada / Continuidade da Experiência") exibe fase origem → destino, tipo, tempo, reconfiguração, coordenação de fornecedor, score de fluidez e observações. As transições são recalculadas quando mudam proposta ativa, moment plans, showroom items, layout ou narrativa. O **ProposalReviewSummary** inclui **TransitionSummary**, **TransitionCount** e **AverageSmoothnessScore**; a comparação indica "jornada mais fluida", "menos reconfigurações críticas" e "menor atrito operacional"; o resumo do projeto exibe quantidade de transições e fluidez média. Isso prepara apresentações imersivas e coerentes no Quest 3 com passagens entre fases bem definidas.
- **Pacotes comerciais e tiers de proposta:** o domínio inclui **ProposalCommercialPackage** (Id, Name, Tier Essential/Standard/Premium/Luxury, Description, IncludedShowroomItemIds, SuggestedThemeIds, TargetBudgetRangeMin/Max, UpsellNotes, DownsellNotes, DisplayOrder, EventTemplateId) e **CommercialPackageTier**. **EventProjectProposal** armazena **SelectedCommercialPackageId**. O **ICommercialPackageService** (MockCommercialPackageService) expõe pacotes por template (casamento, aniversário, business). **AppSession.ApplyCommercialPackage(packageId)** aplica o pacote à proposta ativa (itens e tema sugerido) e recarrega o estado no projeto. A view **CommercialPackageView** (área "Pacotes Comerciais / Upgrade de Proposta") exibe pacotes disponíveis, tier, faixa orçamento-alvo, notas de upsell/downsell e ação Aplicar. O **review** inclui **CommercialReadingSummary** (proposta abaixo do potencial, bem enquadrada, acima do orçamento-alvo, possibilidade de upsell/downsell). A comparação entre propostas inclui tier comercial e "melhor encaixe comercial". Isso prepara melhor a apresentação comparativa e de escolha no Quest 3.
- **Regras de compatibilidade e validação da composição:** o domínio inclui **ShowroomPlacementRule** (por tipo de item: zonas e ancoragens permitidas, slots preferidos, máximo por slot) e **CompositionValidationResult** (status, avisos, inconsistências). O serviço **IPlacementCompatibilityService** avalia se um item pode ir em um slot e valida a proposta (itens sem slot, slot incompatível, excesso em slot). O auto-mapeamento usa essas regras para ordenar slots preferidos; o **EventProject** pode armazenar o último resultado de validação em memória (`LastCompositionValidation`) para exibição. Isso prepara a futura montagem visual coerente em realidade mista.  
- **Presets de layout:** o domínio inclui **EventLayoutPreset** e **EventLayoutPresetItem**. O **ILayoutPresetService** expõe presets por template/categoria. Ao **aplicar preset**, o projeto recebe a lista de itens e o mapeamento item → slot preferido; orçamento, layout lógico e validação atualizam; a **revalidação da composição** é disparada automaticamente. É possível **restaurar composição padrão**.  
- **Temas visuais / direção estética:** o domínio inclui **EventVisualTheme**. O **EventProject** armazena **SelectedThemeId**. O **IVisualThemeService** expõe temas por template/categoria. Ao **aplicar tema**, o projeto atualiza a direção estética; resumo e detalhes exibem tema e mood.  
- **Narrativa de apresentação comercial:** o domínio inclui **ProposalPresentationStep** e **ProposalPresentationStepType**. O **EventProject** armazena **GeneratedPresentationSteps**. O **IProposalPresentationService** gera a sequência de etapas. Ação **Gerar narrativa** / **Regenerar narrativa** preenche a narrativa; resumo e detalhes exibem etapas e se a narrativa foi gerada.  
- **Revisão comercial e comparação de versões:** o domínio inclui **ProposalReviewSummary** (IsReadyForPresentation, Strengths, Warnings, MissingElements, ValidationStatus, BudgetLevel, ThemeName, PresetName, PresentationStepCount) e **ProposalVersionSnapshot** (Id, Name, CreatedAt, ThemeId, PresetId, TotalEstimatedPrice, SupplierCount, ShowroomItemCount, ValidationStatus, Notes). O **EventProject** armazena **LastProposalReviewSummary**. O **AppSession** mantém **SavedSnapshots** (lista de snapshots em memória). O **IProposalReviewService** gera a revisão e cria snapshots; o **PresetId** do snapshot é preenchido a partir de **EventProject.AppliedPresetId** quando um preset foi aplicado. Ações **Revisar proposta** e **Salvar versão atual**; a view exibe prontidão, pontos fortes, alertas, elementos ausentes e **comparação** (atual vs versões salvas: orçamento, itens, fornecedores, validação). Resumo e detalhes exibem se a proposta está pronta para apresentação e a quantidade de versões salvas. Isso prepara melhor a escolha e a apresentação no Quest 3.  
- **Score de aderência da proposta:** o domínio inclui **ProposalFitScore** (OverallScore, BudgetFitScore, MoodFitScore, CapacityFitScore, MustHaveFitScore, RiskScore, Highlights, Gaps, Recommendations). **EventProjectProposal** armazena **FitScore**. O **IProposalFitScoringService** (MockProposalFitScoringService) calcula o score a partir do projeto (briefing), da proposta (itens, tema, orçamento, revisão, validação) e de regras simples (aderência orçamento, mood, elementos obrigatórios, riscos). O **AppSession** recalcula o FitScore ao sincronizar a proposta ativa (**SyncActiveProposalFromProject**), ao alterar o briefing (**SetClientBrief**) e ao carregar uma proposta (**LoadProposalIntoProject**). A view **ProposalFitScoreView** (área “Score de Aderência / Qualidade da Proposta”) exibe score geral, sub-scores, destaques, lacunas e recomendações; o **resumo do projeto** exibe score e status (Alta/Média/Baixa aderência); a **comparação entre propostas** inclui score por proposta, melhor orçamento e melhor mood. Isso prepara futura recomendação inteligente e apresentação em MR.  
- **Briefing comercial do cliente:** o domínio inclui **ClientEventBrief** (ClientName, EventName, GuestCount, EstimatedBudgetTarget, PreferredMood, PreferredColors, MustHaveElements, AvoidElements, Notes). O **EventProject** armazena **ClientBrief**. O **AppSession** expõe **SetClientBrief** para definir ou atualizar o briefing. A view **ClientBriefView** (área “Briefing do Cliente / Parâmetros do Evento”) permite editar todos os campos; o resumo do projeto exibe nome do evento, cliente, convidados e orçamento alvo quando o briefing está preenchido. A **revisão comercial** (ProposalReviewSummary) considera aderência básica ao orçamento alvo (BudgetWithinTarget) e ao mood desejado (MoodMatchesBrief); a **comparação entre propostas** exibe diferença em relação ao orçamento alvo e tema atual vs mood desejado. Isso prepara melhor a personalização e a apresentação em MR.  
- **Múltiplas propostas por projeto:** o domínio inclui **EventProjectProposal** (Id, Name, PresetId, ThemeId, ShowroomItemIds, ItemSlotAssignments, ValidationSummary, PresentationSteps, ReviewSummary, TotalEstimatedPrice, SupplierCount, CreatedAt, **FitScore**, **SelectedCommercialPackageId**). O **EventProject** possui **Proposals** (lista de propostas internas), **ActiveProposalId** (proposta cujo estado é o “atual”) e **AppliedPresetId** (preset aplicado ao estado atual, refletido na proposta ativa e nos snapshots). O **AppSession** cria a proposta inicial ao iniciar o projeto (**EnsureInitialProposal**), **duplica** a proposta ativa, **ativa** outra proposta (**ActivateProposal**) e **renomeia** proposta (**RenameProposal**). O estado exibido (showroom, slots, orçamento, validação, narrativa, revisão) é sempre o da proposta ativa; ao trocar a proposta ativa, o estado é carregado da proposta selecionada. Os snapshots continuam funcionando e usam a proposta ativa como origem; **PresetId** nos snapshots fica coerente com **AppliedPresetId**. A view **ProjectProposalComparisonView** (área “Propostas do Projeto / Comparação”) exibe a lista de propostas, qual está ativa, ações Duplicar e Ativar, e um resumo comparativo (tema, preset, valor estimado, itens, fornecedores, prontidão). Isso prepara a comparação e a apresentação de múltiplas variantes no Quest 3.  
- **Visualização espacial e realidade mista (MR / Meta Quest 3):** a base já está sendo preparada. O suporte a **momentos/fases do evento**, **transições entre fases**, **roteiro guiado**, **hotspots/pontos de destaque visuais**, **estados visuais da cena por fase** e **comparação temporal entre propostas** (antes vs depois ao longo da jornada) permite que a proposta reflita a jornada temporal, as passagens, a visita guiada, os pontos de foco visual, **como o espaço muda ao longo do evento** e **como cada proposta evolui em relação à outra**, preparando diretamente a futura visualização dinâmica, a camada de foco e apresentações comparativas muito mais fortes no Quest 3. A proposta pode ser visualizada por tipo, zona, plano lógico, temas, narrativa, **briefing do cliente**, **múltiplas propostas comparáveis** e **revisão comercial/comparação de versões**. O **score de aderência**, a **avaliação de capacidade operacional**, a **avaliação de fluxo/logística**, a **avaliação de cronograma/sequência de montagem** e a **avaliação de cobertura por fornecedores** permitem avaliar objetivamente a adequação da proposta ao briefing e ao evento (circulação, gargalos, acesso de serviço, viabilidade de execução, suporte dos fornecedores). Na futura etapa de MR, o briefing, o score, a capacidade, o fluxo e as preferências do cliente servirão para personalizar a experiência e para cenários mais críveis; a camada atual permanece 2D/estrutural.  
