"""Lote 7: regressoes encontradas nos fluxos de gravacao (A2-A6). Substituicoes exatas, bytes preservados."""
import re
from pathlib import Path

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


def troca(rel, antes, depois, esperado):
    p = RAIZ / rel
    b = p.read_bytes()
    n = b.count(antes.encode())
    assert n == esperado, (rel, antes, n)
    p.write_bytes(b.replace(antes.encode(), depois.encode()))
    print(f"{n} {rel}: {antes[:70]}")


# A2: strtotime(null) na importacao GPP (7.4: strtotime(null) = false, sem aviso)
for campo in ("inicio", "termino_previsto", "termino_realizado"):
    troca("modules/performance/models/GppTemp.php",
          f"strtotime($acaoExiste->{campo})", f"strtotime((string) $acaoExiste->{campo})", 1)
    troca("modules/performance/models/GppTemp.php",
          f"strtotime($gppTarefa->{campo})", f"strtotime((string) $gppTarefa->{campo})", 1)

# A5: chave ausente (7.4: null => andFilterWhere ignora o filtro)
troca("models/UserSearch.php",
      "$params['contexto_ids']] ?? []);", "$params['contexto_ids'] ?? null]);", 1)

# A6: '' == 0 era verdadeiro no 7.4 (string convertida para numero); (float) reproduz a conversao
troca("modules/performance/models/Coleta.php", "if ($e[2] == 0) {", "if ((float) $e[2] == 0) {", 2)

# A3: constante removida no PhpWord 1.x (mesmo valor 'pct')
antiga = BS + "PhpOffice" + BS + "PhpWord" + BS + "Style" + BS + "Table::WIDTH_PERCENT"
nova = BS + "PhpOffice" + BS + "PhpWord" + BS + "SimpleType" + BS + "TblWidth::PERCENT"
troca("modules/performance/controllers/AnexoController.php", antiga, nova, 13)

# A4: PhpWord 1.x liga noWrap por padrao nas celulas (0.18 nao tinha); 'noWrap' => false mantem a quebra de linha
p = RAIZ / "modules/performance/controllers/AnexoController.php"
s = p.read_bytes().decode("latin-1")
saida, pos, n = [], 0, 0
for m in re.finditer(r"->addCell\(", s):
    i, nivel = m.end(), 1
    while nivel:
        nivel += {"(": 1, ")": -1, "[": 0, "]": 0}.get(s[i], 0)
        i += 1
    args = s[m.end():i - 1]
    # separa o 1o argumento (largura) do resto no nivel 0
    prof, corte = 0, None
    for k, ch in enumerate(args):
        if ch in "([":
            prof += 1
        elif ch in ")]":
            prof -= 1
        elif ch == "," and prof == 0:
            corte = k
            break
    if corte is None:
        novos = args + ", ['noWrap' => false]"
    else:
        resto = args[corte + 1:].strip()
        if not resto:  # virgula final: addCell(3500, )
            novos = args[:corte] + ", ['noWrap' => false]"
        elif resto.startswith("["):
            novos = args[:corte] + ", ['noWrap' => false, " + resto[1:].lstrip()
        else:
            novos = args[:corte] + ", ['noWrap' => false] + " + resto
    saida.append(s[pos:m.end()] + novos + ")")
    pos = i
    n += 1
saida.append(s[pos:])
p.write_bytes("".join(saida).encode("latin-1"))
print(f"{n} addCell com 'noWrap' => false")
