#!/usr/bin/env python3

"""Generate line-wrapped default text headers from paragraph files."""

import sys, os

SRCDIR = os.path.dirname(os.path.abspath(__file__))
PERFDIR = os.path.join(SRCDIR, '..', '..', 'perf', 'texts')

texts = [
    ('en-paragraph.txt', 'default_text_en', 150),
    ('fa-paragraph.txt', 'default_text_fa', 165),
]

def wrap_at_width(text, width):
    """Word-wrap a paragraph at approximately `width` characters."""
    lines = []
    for para in text.split('\n'):
        words = para.split(' ')
        line = ''
        for word in words:
            if line and len(line) + 1 + len(word) > width:
                lines.append(line)
                line = word
            else:
                line = line + ' ' + word if line else word
        if line:
            lines.append(line)
    return '\n'.join(lines)

def stringize(varname, text):
    """Convert text to a C string literal."""
    lines = text.split('\n')
    parts = ['static const char *{} =\n'.format(varname)]
    for line in lines:
        line = line.replace('\\', '\\\\').replace('"', '\\"')
        parts.append('"{}\\n"\n'.format(line))
    parts.append(';\n')
    return ''.join(parts)

MAX_TOTAL_LINES = 60

all_wrapped = []
for filename, varname, width in texts:
    path = os.path.join(PERFDIR, filename)
    with open(path, 'r') as f:
        text = f.read().strip()
    wrapped = wrap_at_width(text, width)
    all_wrapped.append((varname, wrapped))
    hh = stringize(varname, wrapped)
    outpath = os.path.join(SRCDIR, varname.replace('default_text_', 'default-text-') + '.hh')
    with open(outpath, 'w') as f:
        f.write(hh)
    print('Generated: {}'.format(outpath))

# Generate combined text cropped to MAX_TOTAL_LINES / num_texts per text.
lines_per = MAX_TOTAL_LINES // len(all_wrapped)
combined_lines = []
for varname, wrapped in all_wrapped:
    lines = wrapped.split('\n')[:lines_per]
    combined_lines.extend(lines)
combined = '\n'.join(combined_lines)
hh = stringize('default_text_combined', combined)
outpath = os.path.join(SRCDIR, 'default-text-combined.hh')
with open(outpath, 'w') as f:
    f.write(hh)
print('Generated: {}'.format(outpath))
