"""
Сборщик bundle.js из всех .d.ts файлов в этой папке.

Зачем: Webpack/CRA из коробки не умеет импортировать .d.ts напрямую
(нет loader'а), а .d.ts помеченный 'declare' — это чистые типы для TypeScript,
не runtime. Нам же надо отдать их Monaco-редактору как строки через
addExtraLib(content, fileUri).

Решение: этот скрипт читает все *.d.ts, оборачивает в template-strings
и пишет bundle.js — обычный ES-модуль, который webpack без проблем
бандлит и фронт может импортировать как `import { GAME_TYPE_LIBS } from './types/bundle.js'`.

Запуск (Windows): python _build_bundle.py
Запуск (auto при правке): можно навесить chokidar в dev-скрипте.
"""
import os
import re

HERE = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(HERE, 'bundle.js')

# Порядок важен: common первым, чтобы остальные могли на него ссылаться.
ORDER = [
    'common', 'player', 'scene', 'physics', 'ui', 'audio',
    'save', 'economy', 'input', 'tweens', 'multiplayer',
    'tools', 'npcs', 'fx', 'self', 'misc',
]


def escape_for_template(text: str) -> str:
    """Экранируем для template-string: backtick и ${ ."""
    return text.replace('\\', '\\\\').replace('`', '\\`').replace('${', '\\${')


def main():
    parts = [
        '/**',
        ' * АВТОСГЕНЕРИРОВАНО _build_bundle.py — не править вручную.',
        ' *',
        ' * Bundle TypeScript-деклараций game.* API для Monaco-редактора.',
        ' * Каждая запись передаётся в monaco.languages.typescript.javascriptDefaults.addExtraLib(content, uri).',
        ' */',
        '',
        'export const GAME_TYPE_LIBS = [',
    ]

    for name in ORDER:
        path = os.path.join(HERE, f'{name}.d.ts')
        if not os.path.exists(path):
            print(f'[WARN] missing: {name}.d.ts')
            continue
        with open(path, 'r', encoding='utf-8') as f:
            content = f.read()
        content_escaped = escape_for_template(content)
        parts.append(f'    {{')
        parts.append(f'        uri: "ts:rublox/{name}.d.ts",')
        parts.append(f'        content: `{content_escaped}`,')
        parts.append(f'    }},')

    parts.append('];')
    parts.append('')

    with open(OUT, 'w', encoding='utf-8') as f:
        f.write('\n'.join(parts))

    files_count = sum(1 for name in ORDER if os.path.exists(os.path.join(HERE, f'{name}.d.ts')))
    total_size = os.path.getsize(OUT)
    print(f'[OK] bundle.js: {files_count} файлов, {total_size//1024} КБ')


if __name__ == '__main__':
    main()
