"""Lote 5 de correcoes de runtime (substituicoes exatas, bytes preservados). Cada item: arquivo, antes, depois, ocorrencias."""
import re
import subprocess
from pathlib import Path

RAIZ = Path(__file__).resolve().parents[2]

TROCAS = [
    ("modules/risk/views/risco-cenario/view.php",
     "strtotime($model->updated_at)", "strtotime((string) $model->updated_at)", None),
    ("modules/performance/views/parecer-tecnico-coleta/view.php",
     "strtotime($model->updated_at)", "strtotime((string) $model->updated_at)", None),
    ("models/Wildcard.php", '$lista = explode(",", $this->usuarios);', '$lista = explode(",", (string) $this->usuarios);', 1),
    ("views/wildcard/_form.php", "explode(',', $model->usuarios);", "explode(',', (string) $model->usuarios);", 1),
    ("modules/risk/controllers/RiscoCenarioController.php",
     "'parent_id' => $vertice->parent,", "'parent_id' => $vertice->parent ?? null,", None),
    ("modules/risk/controllers/RiscoCenarioController.php", "$chave = $_POST['chave'];", "$chave = $_POST['chave'] ?? null;", None),
    ("modules/risk/controllers/RiscoModeloController.php", "$risco = $_POST['risco'];", "$risco = $_POST['risco'] ?? null;", None),
    ("modules/performance/controllers/PlanoAcaoController.php",
     "'pa_plano_acao.contexto_id' => $model->paAcaoProposta->paPlanoAcao->contexto->id,",
     "'pa_plano_acao.contexto_id' => $model->paAcaoProposta->paPlanoAcao->contexto->id ?? null,", None),
    ("modules/performance/views/plano-acao/tarefa.php",
     "<?= $model->paAcaoProposta->paPlanoAcao->contexto_id ?>", "<?= $model->paAcaoProposta->paPlanoAcao->contexto_id ?? null ?>", None),
    ("modules/performance/views/projeto/_form.php",
     "$modelContextos = substr($model->contextos, 0, -1);", "$modelContextos = substr((string) $model->contextos, 0, -1);", 1),
    ("modules/performance/controllers/VerticalController.php",
     "$destinoEstrutura->nome = $base->nome . ' (duplicado)';", "$destinoEstrutura->nome = ($base->nome ?? null) . ' (duplicado)';", None),
    ("modules/task/controllers/TaskController.php",
     "return strpos($panelSelected, '*') !== false", "return strpos((string) $panelSelected, '*') !== false", 1),
    ("modules/task/controllers/TaskController.php", "$id = $post['Scope']['id'];", "$id = $post['Scope']['id'] ?? null;", None),
    ("views/inventario-categoria/_grid_unit.php",
     "<?= $inventarioCategoria->inventarioDados->nome ?>", "<?= $inventarioCategoria->inventarioDados->nome ?? null ?>", None),
]

for rel, antes, depois, esperado in TROCAS:
    p = RAIZ / rel
    b = p.read_bytes()
    n = b.count(antes.encode())
    if esperado is not None:
        assert n == esperado, (rel, antes, n)
    assert n >= 1, (rel, antes)
    p.write_bytes(b.replace(antes.encode(), depois.encode()))
    print(f"{n} {rel}: {antes[:60]}")

# Html::decode(<propriedade>) -> Html::decode(<propriedade> ?? '') no codigo ativo
arquivos = subprocess.run(["grep", "-rlF", "Html::decode($", "--include=*.php", "views", "modules", "controllers", "models"],
                          cwd=RAIZ, capture_output=True, text=True).stdout.split()
pad = re.compile(rb"Html::decode\((\$[A-Za-z_][\w]*(?:->[A-Za-z_]\w*)+)\)")
for rel in arquivos:
    if rel.startswith("modules/operational-old"):
        continue
    p = RAIZ / rel
    novo, n = pad.subn(rb"Html::decode(\1 ?? '')", p.read_bytes())
    if n:
        p.write_bytes(novo)
        print(f"{n} {rel}: Html::decode(... ?? '')")
