# Migração: motor de Alertas → motor de Regras

O motor de **Alertas** (`/alerts`) só sabia **mandar mensagem**. O motor de **Regras**
(`/regras`) faz tudo o que ele fazia **e mais**: "notificar" virou apenas *uma* das ações
— a regra também liga dispositivo, roda cena, **abre porta**, publica MQTT, chama webhook
e **abre ordem de serviço**.

Este guia migra as regras existentes e aposenta o motor antigo — **com rollback de 1 comando**.

---

## O que foi garantido (paridade)

Tudo o que o motor antigo fazia tem equivalente no novo:

| Motor de Alertas | Vira, no motor de Regras |
|---|---|
| `passage` (passagem/acesso) | gatilho **Acesso / passagem** (mesmos filtros — a lógica de casamento é *a mesma função*) |
| `device_offline` **com escalonamento** | gatilho **Dispositivo offline há X min** + **degraus** (cada degrau com ações próprias) |
| `water_level` **com limiares** | gatilho **Valor cruzou limiares** (fonte `agua.nivel`) + **degraus** |
| `device_online` | gatilho **Dispositivo mudou** → "voltou a ficar online" |
| `denials_anomaly` | gatilho **Muitos acessos negados** (N em M min) |
| `weather` | gatilho **Clima** (mesmas chaves — reusa a mesma função pura) |
| `mqtt_topic` | gatilho **MQTT** (`topic` → `topico`; o resto é idêntico) |
| canais + **destinos por canal** | ação **Notificar** → destino **"Destinatário POR CANAL"** |
| `modo` once/always | campo **Repetição**: "Uma vez só" / "Sempre que acontecer" |
| `cooldown_min` | **Cooldown (segundos)** — a migração multiplica por 60 |
| varredura de segurança | o worker `auto_regras` relê passagens acima do watermark |

---

## Passo a passo

### Passo 1 — Atualizar o banco

No servidor, no phpMyAdmin (banco `controle_veiculos`), rode **nesta ordem**:

```
api/database/migration_regra.sql       (se ainda não rodou)
api/database/migration_regra_v2.sql    (escalonamento + modo + origem_alert_id)
```

✅ **Deu certo se…** a tabela `regra` tiver as colunas `escalonamento`, `modo` e
`origem_alert_id`.

### Passo 2 — Ver a PRÉVIA da migração (não grava nada)

Abra o **Prompt de Comando** e rode:

```
cd C:\wamp64\www
C:\wamp64\bin\php\php8.3.28\php.exe api\scripts\migrar_alertas.php
```

Ele lista cada regra de alerta e o que ela vai virar. **Nada é gravado.**

✅ **Deu certo se…** aparecer uma linha `[OK]` para cada regra, e nenhuma `[PULADA]`.

> Se alguma aparecer como `[PULADA]`, é um tipo que o script não conhece — me avise
> antes de seguir; não migre "no escuro".

### Passo 3 — Migrar de verdade (ainda SEM desligar o antigo)

```
C:\wamp64\bin\php\php8.3.28\php.exe api\scripts\migrar_alertas.php --aplicar
```

✅ **Deu certo se…** as regras aparecerem em **Automação → Regras**, com o mesmo
estado (ativa/pausada) que tinham nos Alertas.

**Agora CONFIRA cada uma** na tela `/regras`: abra, veja o gatilho, os degraus e a ação
de notificar. É o momento de corrigir o que não ficou como você queria.

> ⚠️ Neste ponto os **dois motores estão ligados** — um alerta pode chegar **duplicado**.
> É esperado, e é por isso que o passo 4 vem logo em seguida. Não fique dias assim.

### Passo 4 — Aposentar o motor antigo

```
C:\wamp64\bin\php\php8.3.28\php.exe api\scripts\migrar_alertas.php --aplicar --desligar-antigo
```

Isso grava `alerts_engine_enabled = 0`. A partir daí:

- o motor de alertas **não avalia mais nada** (nem no tempo real, nem no worker);
- a tela `/alerts` mostra um aviso de **"aposentado"** e vira **consulta/histórico**;
- quem dispara é o **motor de regras** (`/regras` + worker `auto_regras`).

✅ **Deu certo se…** em `/alerts` aparecer o selo **"aposentado"** e o banner apontando
para `/regras`.

### Passo 5 — Conferir que o novo motor está de pé

Em **Sistema → Diagnóstico**, procure o serviço **"Motor de regras (SE → ENTÃO)"**
(`auto_regras`). Ele deve estar *Em dia*. Se não aparecer, rode o
`install_workers.bat` como administrador.

---

## Rollback (voltar atrás)

Um comando no banco religa o motor antigo **na hora**:

```sql
UPDATE configuracao SET valor = '1' WHERE chave = 'alerts_engine_enabled';
```

Nada foi apagado: o código do `AlertEngine`, as tabelas `alert_rule`, `alert_rule_state`
e `alert_log` continuam intactos. Se religar, **pause as regras migradas** em `/regras`
para não receber alerta em dobro.

---

## Deu problema?

**"Migrei e o alerta chega duplicado."**
Os dois motores estão ligados. Rode o passo 4 (`--desligar-antigo`).

**"Migrei e não chega mais nada."**
Confira, nesta ordem: (1) o worker `auto_regras` está no Agendador? (2) o módulo
**Motor de regras** está ligado em *Configurações → Módulos*? (3) o motor está pausado
(botão no topo de `/regras`)? (4) o **Histórico** em `/regras/logs` mostra
`Condição não bateu` ou `Em cooldown`?

**"Rodei o script duas vezes."**
Sem problema: ele é **idempotente** (usa `origem_alert_id`). Ele atualiza a regra já
criada em vez de duplicar.

**"Quero mexer numa regra antiga em /alerts."**
Não dá mais — o motor está aposentado. Edite a equivalente em `/regras`.
