#!/usr/bin/env python3
"""Генератор тестовых файлов mdview2 для проверки лимита 256 КБ и путей обрыва.

Результат кладётся рядом со скриптом (examples/mdview2/testfiles/):
  BIG.MD    — ~216 КБ обычной прозы (CP866): успешный рендер большого файла.
  TABLES.MD — таблично-тяжёлый (ASCII): пробивает кап контент-кэша (40 стр./набор),
              т.к. неровные таблицы (короткие ячейки + один широкий столбец)
              раздувают число (символ,атрибут)-ячеек кратно относительно источника.
  LINES.MD  — ~22000 коротких строк (ASCII): пробивает лимит строк (18432).

Запуск:  python3 gen_testfiles.py
"""
import os

HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(HERE)


def write(name, data):
    path = os.path.join(HERE, name)
    mode = 'wb' if isinstance(data, (bytes, bytearray)) else 'w'
    with open(path, mode) as f:
        f.write(data)
    print(f"{name}: {os.path.getsize(path)} bytes")


# --- BIG.MD / HUGE.MD: склейка README + READMEBG, перекодировано в CP866 -----
# BIG  (×2 ≈170 КБ) — успешный рендер большого файла (<256 КБ).
# HUGE (×4 ≈340 КБ) — БОЛЬШЕ 256 КБ: проверка клампа (читаются первые 256 КБ +
#   строка-предупреждение TRUNC_FILE).
prose = bytearray()
for fn in ('README.MD', 'READMEBG.MD'):
    with open(os.path.join(ROOT, fn), encoding='utf-8') as f:
        prose += f.read().encode('cp866', errors='replace')
write('BIG.MD', bytes(prose * 2))
write('HUGE.MD', bytes(prose * 4))

# --- TABLES.MD: неровные таблицы -> исчерпание контент-кэша ------------------
# Один широкий столбец (72 симв.) на таблицу задаёт ширину; остальные ячейки
# короткие, но при рендере добиваются до этой ширины -> ~80 ячеек/строка из
# ~8 байт источника. ~300 таблиц × 30 строк дают ~840K ячеек (1.68 МБ контента)
# при ~108 КБ источника -> кап 640 КБ/набор пробивается, строк (~11K) < 18432,
# значит первой срабатывает причина TRUNC_CONTENT.
NT, ROWS = 300, 30
wide = 'x' * 72
out = ['# Tables test - content cache exhaustion trigger', '']
for t in range(NT):
    out.append(f'## Table {t + 1}')
    out.append('| Column A | B |')
    out.append('|---|---|')
    out.append(f'| {wide} | y |')
    for r in range(ROWS):
        out.append(f'| a{r} | b |')
    out.append('')
write('TABLES.MD', '\n'.join(out) + '\n')

# --- LINES.MD: масса коротких строк -> исчерпание лимита строк ---------------
# ВАЖНО: вьювер склеивает подряд идущие непустые строки в один параграф
# (markdown soft-wrap), поэтому простые строки потекли бы в абзац. Нужен
# контент БЕЗ склейки -> кладём всё в fenced code block (verbatim, 1:1
# строка-источник = экранная строка). 22000 строк > 18432 -> TRUNC_LINES;
# контент мал (~9 ячеек/строка), кап контента не задевается.
N = 25000   # ~250 КБ -> 16 страниц -> max_lines = 18432; строк больше -> обрыв на 18432
out = ['# Short lines test - line limit trigger', '', '```']
out += [f'row {i:05d}' for i in range(1, N + 1)]
out.append('```')
write('LINES.MD', '\n'.join(out) + '\n')
