"""Leitura de planilha do GppTemp::upload(): PhpSpreadsheet (8.3) == PHPExcel (7.4, codigo original)."""
import json
import subprocess
import unittest
from pathlib import Path

SCRIPT = "/var/www/html/accia-php83/tools/migracao-php83/php/le_planilha.php"
FIX = "/var/www/html/accia-php83/tools/migracao-php83/fixtures/"
GPP = Path(__file__).resolve().parents[3] / "modules/performance/models/GppTemp.php"


def _ler(container: str, raiz: str, arquivo: str):
    r = subprocess.run(["docker", "exec", container, "php", "-d", "display_errors=stderr", SCRIPT, raiz, FIX + arquivo],
                       capture_output=True, text=True, encoding="utf8")
    return r.stderr.strip().splitlines()[-1], json.loads(r.stdout) if r.stdout.strip() else None


def _como_texto(dados):
    # PHPExcel devolve 10/2.5 (numero) e PhpSpreadsheet '10'/'2.5' para celulas numericas de formato Geral.
    # GppTemp::upload() so consome os valores via trim/preg_replace/explode/==/atributo de ActiveRecord,
    # que tratam os dois igual; o efeito no banco e comparado no fluxo de ponta a ponta (Task 12).
    return {lin: {col: (None if v is None else (str(int(v)) if isinstance(v, float) and v.is_integer() else str(v)))
                  for col, v in cols.items()} for lin, cols in dados.items()}


class PlanilhaTest(unittest.TestCase):
    def test_gpptemp_nao_usa_phpexcel(self):
        self.assertNotIn("PHPExcel", GPP.read_text(encoding="utf8"))

    def test_xlsx_igual(self):
        lib_b, base = _ler("php74_val", "/var/www/html/accia", "gpp.xlsx")
        lib_a, alvo = _ler("php83_apache", "/var/www/html/accia-php83", "gpp.xlsx")
        self.assertEqual((lib_b, lib_a), ("PHPExcel", "PhpSpreadsheet"))
        self.assertEqual(_como_texto(alvo), _como_texto(base))

    def test_xls_igual(self):
        _, base = _ler("php74_val", "/var/www/html/accia", "gpp.xls")
        _, alvo = _ler("php83_apache", "/var/www/html/accia-php83", "gpp.xls")
        self.assertEqual(_como_texto(alvo), _como_texto(base))

    def test_codigo_migrado_no_74(self):
        _, base = _ler("php74_val", "/var/www/html/accia", "gpp.xlsx")
        lib, migr = _ler("php74_val", "/var/www/html/accia-php83", "gpp.xlsx")
        self.assertEqual(lib, "PhpSpreadsheet")
        self.assertEqual(_como_texto(migr), _como_texto(base))


if __name__ == "__main__":
    unittest.main()
