# Instalador web (ambiente de teste/staging) — Etapa 97

## O que o instalador faz

O **instalador web** é uma base simples para configurar o sistema em **ambiente de teste ou staging**, de forma **visual**, sem alterar a camada Quest nem as camadas web já existentes (CRM do hotel, painel do produtor, dashboard consolidado). Permite:

- **Wizard em passos**: Bem-vindo → Pré-requisitos → Base de dados → Aplicação → Dados demo → Concluir.
- **Gravar configuração local**: App Name, App URL, dados de base de dados (host, port, name, user, password), opção de popular dados mock/demo e nome de admin de teste.
- **Detectar se já foi instalado**: evita reinstalação acidental; após concluir, o arranque seguinte abre directamente o dashboard.
- **Validar pré-requisitos**: diretório gravável para o ficheiro de config; em staging não é obrigatório ter base de dados real.
- **Validar configuração de banco**: quando preenchida, validação mínima (campos presentes); em staging não há teste de conexão real.
- **Redirecionar para o dashboard**: após concluir, carrega a cena do CRM (HotelCRM) para visualizar e testar o sistema.

Tudo é **adicionado por cima** da base actual; nenhum módulo existente é removido ou refactorado.

## Como usar

1. **Cena de entrada (staging)**  
   - Abrir a cena **WebInstall** (Assets/Web/Scenes/WebInstall.unity).  
   - No Build Settings, colocar **WebInstall** como primeira cena se quiser que o instalador seja o ponto de entrada da build.

2. **Executar**  
   - Se o sistema **ainda não foi instalado**, o instalador mostra o wizard.  
   - Preencher os passos (pode deixar a base de dados em branco para usar apenas dados mock).  
   - Em **Dados demo**, activar "Popular dados mock/demo" para ter leads, oportunidades, propostas e sessões de exemplo.  
   - Em **Concluir**, clicar em "Concluir"; a configuração é gravada e a cena **HotelCRM** é carregada (dashboard inicial, CRM do hotel, visão consolidada).

3. **Execuções seguintes**  
   - Se já foi instalado, ao abrir a cena WebInstall o bootstrap detecta e **redireciona logo** para a cena HotelCRM, sem mostrar o wizard.

4. **Reset (apenas para teste)**  
   - Em código: `WebInstallBootstrap.ResetAndReload()` ou `WebInstallService.ResetInstallation()` (ou `WebInstallController.ResetInstallation()`) para limpar o estado de instalação e permitir voltar a passar pelo wizard (por exemplo, a partir de um botão de debug ou menu de desenvolvimento).

## O que é só para staging/teste

- **Persistência**: a configuração é gravada em ficheiro local (ex.: `Application.persistentDataPath/web_install_config.json`) e em PlayerPrefs; não há servidor de config nem secrets de produção.
- **Base de dados**: os campos são guardados para uso futuro; em staging **não há driver real** nem teste de conexão; o sistema continua a usar dados em memória (MockWebDataService).
- **Admin de teste**: o campo "admin de teste" é apenas guardado na config; não existe fluxo de login nem criação de utilizadores real.
- **Segurança**: sem autenticação robusta, multi-tenant nem integrações externas; adequado apenas para ambiente local/staging.

## O que ainda falta para produção real

- **Backend e base de dados reais**: uso efectivo dos parâmetros de BD (migrações, conexão, persistência).
- **Autenticação e autorização**: login, roles, sessões seguras.
- **Secrets e configuração**: variáveis de ambiente ou servidor de config; nunca senhas em ficheiro de config em texto claro em produção.
- **Deploy e multi-tenant**: pipeline de deploy, isolamento por tenant, domínios.
- **Integrações**: ERP/CRM externo, notificações, etc.

## Onde a config é usada

- **HotelCRMDashboardController** e **WebDashboardController**: ao iniciar, leem `WebInstallService.GetConfig()` (ou `WebInstallController.GetConfig()`); se `SeedDemoData` for true, usam `MockWebDataService(seedDemo: true)`; caso contrário, dados vazios (ou conforme config).
- **Instalador**: grava e marca instalação; não altera Quest, CRM, painel do produtor nem dashboard além do que já existia.

## Checklist para export/zip (evitar omissões)

Se o pacote exportado/zip “não mostra” o instalador ou a camada web, normalmente é porque foram omitidas pastas no export. Para validar rapidamente, o zip final deve conter claramente:

- `Assets/Web/` (inclui CRM do hotel, painel do produtor, dashboards e módulos gerenciais)
- `Assets/Web/Scenes/WebInstall.unity` (cena do instalador)
- `Assets/Web/Presentation/WebInstallBootstrap.cs` (UI/fluxo do wizard)
- `Assets/Web/Application/WebInstallController.cs` e `Assets/Web/Application/WebInstallService.cs`
- `Assets/Web/Domain/WebInstallState.cs` e `Assets/Web/Domain/WebInstallConfig.cs`
- `Docs/Web/WEB_INSTALLER.md`

## Garantias

- **Quest intacto**: nenhuma alteração em QuestPresentation, QuestPresentationSession ou runtime XR.  
- **CRM do hotel, painel do produtor e dashboard consolidado**: preservados; apenas se adiciona o fluxo de instalação e a leitura da config no arranque.  
- **Reinstalação**: só através de reset explícito (código/ferramentas de teste).
