#!/usr/bin/env python3
"""Bundle one house into a single self-contained HTML file, for publishing as a claude.ai artifact
or emailing. The engine's stylesheet and scripts and the house's data are inlined; three.js still
loads from the CDN.

Usage:  python tools/bundle.py houses/1351-leighton        ->  dist/1351-leighton.html (+ dist/<slug>-build.html)
        python tools/bundle.py --all                        ->  one file per house
"""
import argparse, pathlib, re

ROOT = pathlib.Path(__file__).resolve().parent.parent

def bundle(house_dir: pathlib.Path, page='index.html') -> pathlib.Path:
    index = house_dir / page
    html = index.read_text()
    def local(ref): return None if re.match(r'https?:', ref) else (index.parent / ref).resolve()
    def css(m):
        f = local(m.group(1)); return m.group(0) if f is None else f'<style>\n{f.read_text()}</style>'
    def js(m):
        f = local(m.group(1)); return m.group(0) if f is None else f'<script>\n{f.read_text()}</script>'
    html = re.sub(r'<link rel="stylesheet" href="([^"]+)">', css, html)
    html = re.sub(r'<script src="([^"]+)"></script>', js, html)
    out = ROOT / 'dist' / (f'{house_dir.name}.html' if page=='index.html' else f'{house_dir.name}-{page[:-5]}.html')
    out.parent.mkdir(exist_ok=True); out.write_text(html)
    return out

if __name__ == '__main__':
    ap = argparse.ArgumentParser(); ap.add_argument('house', nargs='?'); ap.add_argument('--all', action='store_true')
    a = ap.parse_args()
    dirs = sorted(d for d in (ROOT / 'houses').iterdir() if (d / 'index.html').exists()) if a.all else [pathlib.Path(a.house).resolve()]
    for d in dirs:
        for page in ('index.html','build.html'):
            if (d / page).exists():
                out = bundle(d, page); print(f'{out.relative_to(ROOT)}  ({out.stat().st_size // 1024} KB)')
