# Task 010 — `OtpSatelite` (porta de entrada para consumidores)

**Depende de:** 006, 007, 009
**Bloqueia:** 011, 013

## Objetivo

Fornecer uma classe estável que outros sinais/satélites importem para usar OTP. Espelha o padrão de `MissoesAprovacao` / `EdicoesRotaAprovacao` — switch por `$opcao` que delega para Laboratórios.

## Deliverable

`Satelites/OtpSatelite.php`:

```php
namespace GalaxiaMissoes\Mensageria\sinais\Otp\Satelites;

use Base_config\Helpers\Message;
use GalaxiaMissoes\Mensageria\sinais\Otp\Laboratorios\CriarEEnviarOtpLaboratorio;
use GalaxiaMissoes\Mensageria\sinais\Otp\Laboratorios\EnviarOtpLaboratorio;
use GalaxiaMissoes\Mensageria\sinais\Otp\Laboratorios\ValidarOtpLaboratorio;
use GalaxiaMissoes\Mensageria\sinais\Otp\Laboratorios\CancelarOtpLaboratorio;
use GalaxiaMissoes\Mensageria\sinais\Otp\Laboratorios\ConsultarOtpLaboratorio;

class OtpSatelite {
    public $response = null;
    private $galaxia;

    public function __construct($galaxia, string $opcao, ?array $data = []) {
        $this->galaxia = $galaxia;
        $this->response = match ($opcao) {
            'criar', 'criar_e_enviar' => (new CriarEEnviarOtpLaboratorio($data ?? []))->response,
            'reenviar', 'enviar'      => (new EnviarOtpLaboratorio($data ?? []))->response,
            'validar'                 => (new ValidarOtpLaboratorio($data ?? []))->response,
            'cancelar'                => (new CancelarOtpLaboratorio($data ?? []))->response,
            'consultar'               => (new ConsultarOtpLaboratorio($data ?? []))->response,
            default                   => (new Message())->error("Opção OTP inválida: {$opcao}")->render(),
        };
    }
}
```

## Semântica

- Esta é a **única** API pública estável. Laboratórios podem mudar de assinatura entre PRs; o satélite garante compatibilidade.
- Cada chamada é independente (sem estado compartilhado entre `criar` e `validar`).

## Critério de aceite

- Lint OK.
- Os 5 caminhos do `match` cobertos por teste E2E (012).
