"""Monta testar_fotos.py reaproveitando o DOM falso do teste do protótipo da Fer, para a estação de fotos (entrega 2)."""
from pathlib import Path

AQUI = Path(__file__).resolve().parent
base = (AQUI / 'testar_prototipo.py').read_text(encoding='utf-8')
shim = base[base.index("SHIM = r'''"):base.index("TESTES = r'''")]
shim = shim.replace(
    "var CONHECIDOS = ['tela', 'horaTopo', 'horaIphone', 'painel', 'veu', 'toast', 'botaoTema', 'telaApp'];",
    "var CONHECIDOS = ['tela', 'horaTopo', 'horaAparelho', 'horaMenu', 'painel', 'veu', 'toast', 'botaoTema', 'telaApp', 'textoPrevia'];")
shim = shim.replace('var window = globalThis;', 'var window = globalThis;\nwindow.innerWidth = 1440;\nwindow.innerHeight = 900;')
# Blob e atob mínimos: o caminho do salvar pelo visualizador transforma o dataURL em Blob sem rede (revisão de 14/10/2026).
shim = shim.replace(
    "var navigator = { clipboard: { writeText: function () { return Promise.resolve(); } } };",
    "var navigator = { clipboard: { writeText: function () { return Promise.resolve(); } } };\n"
    "function Blob(partes, opcoes) { this.partes = partes || []; this.type = (opcoes && opcoes.type) || ''; "
    "this.size = this.partes.reduce(function (n, p) { return n + (p.byteLength || p.length || 0); }, 0); }\n"
    "function atob(s) { var T = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var out = ''; var i = 0; "
    "function v(ch) { return ch ? T.indexOf(ch) : -1; } "
    "s = String(s).replace(/[^A-Za-z0-9+\\/]/g, ''); while (i < s.length) { var a = v(s.charAt(i++)); var b = v(s.charAt(i++)); "
    "var c = v(s.charAt(i++)); var d = v(s.charAt(i++)); var n = (a << 18) | (b << 12) | ((c < 0 ? 0 : c) << 6) | (d < 0 ? 0 : d); "
    "out += String.fromCharCode((n >> 16) & 255); if (c >= 0) out += String.fromCharCode((n >> 8) & 255); if (d >= 0) out += String.fromCharCode(n & 255); } return out; }")
assert 'textoPrevia' in shim and 'innerWidth' in shim and 'function atob' in shim

CABECA = '''"""Roda o JavaScript da estação de fotos num DOM falso (sem canvas, IndexedDB, câmera nem Image) e exercita telas e ações."""
import json
import re
import sys

import quickjs

html = open(sys.argv[1], encoding='utf-8').read()
script = re.findall(r'<script>(.*?)</script>', html, re.S)[0]
fim = script.rfind('})();')
exporta = ('\\nglobalThis.__t = { get estado() { return estado; }, ACOES, render, rota, REGISTROS, PONTOS, PACIENTES, PAC, SESSOES_FOTO, '
           'INTERVALOS, ACUMULADO, HOJE, avaliarLuz, avaliarFoco, alinhamento, semPromessa, PALAVRAS_PROIBIDAS, feitosDe, pulouTrico, fotosDe, fotoDe, '
           'sessoesComFoto, dataSessao, urlVoltaAna, URL_VOLTA_SUELLEN, URL_VOLTA_FER, textoMensagemFer, MENSAGEM_FER, copiarTexto, '
           'dadosExportacao, etiqueta, compararDe, capturaDe, filtrarPacientes, definirModo, get modo() { return modo; }, Armazem, ITENS, '
           'exportacaoDe, envioDe, pedidoDe, autorizacaoDe, podeCanvas, temaEfetivo, densidadeDe, registroAnterior, diasEntre, '
           'prepararDownloads, salvarPeloVisualizador, compartilhar, dataURLParaBlob, get DOWNLOADS() { return DOWNLOADS; }, '
           'get DOWNLOADS_ESTADO() { return DOWNLOADS_ESTADO; }, EM_IFRAME, politicaDaCamera, ligarCamera, desligarCamera, Camera, '
           'MSG_CAMERA_VISUALIZADOR, MSG_CAMERA_NEGADA, BLOBS, listaSessoes, ddmmaaaa, montagemDe };\\n')
script = script[:fim] + exporta + script[fim:]

'''

TESTES = (AQUI / 'testes_fotos.js').read_text(encoding='utf-8')

RODAPE = '''
ctx = quickjs.Context()
ctx.eval(SHIM)
ctx.eval(script)
ctx.eval('globalThis.__FONTE = ' + json.dumps(html) + ';')
ctx.eval(TESTES)
while ctx.execute_pending_job():
    pass
saida = ctx.eval('__out.join("\\\\n")')
print(saida)
falhas = saida.count('FALHA')
print(f'{saida.count("ok    ")} ok, {falhas} falha(s)')
sys.exit(1 if falhas else 0)
'''

with open(AQUI / 'testar_fotos.py', 'w', encoding='utf-8', newline='') as f:
    f.write(CABECA + shim + "TESTES = r'''\n" + TESTES + "\n'''\n" + RODAPE)
print('escrito')
