# WorldSkills Flutter Bootstrap

Bootstrap auditavel para reproduzir um ambiente Flutter/Dart no Windows, aquecer
os caches necessarios para uso offline e validar a geracao de APK Android.

Repositorio oficial:

`https://github.com/Morgado0s/worldskills-flutter-bootstrap`

## Antes De Usar

Use este material somente se scripts, configuracoes e extensoes estiverem
autorizados pela organizacao da competicao. O fato de os programas serem
baixados de fontes oficiais nao substitui a autorizacao para executar este
script.

O bootstrap:

- baixa binarios somente de Microsoft, Google, Flutter e VS Code Marketplace;
- confere SHA-256 antes de instalar;
- nao executa conteudo baixado em memoria;
- nao instala IA, Flutter Tree ou snippets pessoais;
- nao contem codigo das provas;
- nao abre acesso remoto e nao recebe comandos da VPS.

## Versoes

- VS Code `1.127.0`
- Flutter `3.44.0`
- Dart `3.12.0`
- DevTools `2.57.0`
- Android Platform `36.1`
- Android compileSdk Platform `36`
- Android Build Tools `36.1.0`
- Java `21`

Extensoes:

- Dart `3.139.20260702`
- Flutter `3.138.0`
- Flutter Snippets `3.0.0`
- Error Lens `3.28.0`
- Theme `3.1.0`
- VSCode Icons `1.1.12`

Pacotes aquecidos no cache:

- `http 1.6.0`
- `shared_preferences 2.5.5`
- `sensors_plus 7.0.0`

## Requisitos

- Windows x64;
- PowerShell executado como administrador;
- pelo menos 20 GB livres na unidade `C:`;
- internet durante a ambientacao;
- permissao para aceitar a licenca do Android SDK.

## Instalacao Pela Release

Abra o PowerShell como administrador e execute:

```powershell
cd $HOME\Desktop

$base = "https://github.com/Morgado0s/worldskills-flutter-bootstrap/releases/download/v1.0.0"
$files = @(
  "setup.ps1",
  "manifest.json",
  "vscode-settings.json",
  "verify.ps1",
  "SHA256SUMS.txt"
)

foreach ($file in $files) {
  Invoke-WebRequest "$base/$file" -OutFile $file
}
```

Confira o hash do instalador:

```powershell
$expected = "29f55a77f712ef7e6a46f6a5239b058e1050dad2f795830418ef5798c6bb927d"
$actual = (Get-FileHash .\setup.ps1 -Algorithm SHA256).Hash.ToLowerInvariant()

if ($actual -ne $expected) {
  throw "Hash invalido. Nao execute o arquivo."
}
```

Primeiro valide os arquivos sem alterar a maquina:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1 -ValidateOnly
```

Depois execute a instalacao:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
```

O processo registra logs em:

```text
C:\develop\worldskills-setup\logs
```

Se houver interrupcao, execute o mesmo comando novamente. Downloads validos e
componentes com a versao correta sao reutilizados.

## Verificacao

Verificacao apenas dos arquivos:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .\verify.ps1 -StaticOnly
```

Verificacao completa do ambiente, dos caches e do APK:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .\verify.ps1
```

Para pular somente a recompilacao durante uma verificacao rapida:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .\verify.ps1 -SkipBuild
```

## Uso Offline Em Um Projeto Novo

Declare no `pubspec.yaml` apenas os pacotes necessarios:

```yaml
dependencies:
  flutter:
    sdk: flutter
  http: 1.6.0
  shared_preferences: 2.5.5
  sensors_plus: 7.0.0
```

Depois execute:

```powershell
flutter pub get --offline
```

Os pacotes ficam no cache compartilhado do `pub`. O projeto neutro
`C:\develop\worldskills-cache-anchor` mantem as dependencias referenciadas e
tambem aquece o cache do Gradle.

## Espelho VPS

O espelho planejado e:

`https://setup.51-75-121-186.nip.io`

Ele so deve ser usado quando:

1. a VPS estiver novamente acessivel;
2. o HTTPS estiver valido;
3. os arquivos forem identicos aos da release GitHub;
4. os hashes coincidirem com `SHA256SUMS.txt`.

Nao use o endpoint antigo em `http://51.75.121.186`.

## Conferencia Manual Do Autocomplete

Depois da instalacao:

1. desligue a rede;
2. abra um projeto Flutter no VS Code;
3. crie um arquivo `.dart`;
4. confirme sugestoes de widgets e parametros;
5. confirme chamadas completas de funcoes;
6. confirme snippets no topo;
7. confirme diagnosticos do Dart Analyzer.

O tempo de 30 minutos deve ser comprovado em uma VM Windows limpa. Ele depende
da velocidade da internet e do desempenho de disco da maquina.
