# Inspect a public daylight mount and preserve its real window chain across export.
import argparse
import json
from pathlib import Path
from hearth.blocks import name_of
from hearth.lodges import lodge_scene
from hearth.persistence import encode, export_scene, load_scene
from examples.lantern_house import lantern_house


def inspect_ridge(scene):
    mounted = next(n for n in scene.nodes.values() if scene.view.offers(n.path, 'daylight'))
    cells = scene.cells(mounted.path, descendants=True)
    glass = min(p for p in cells if name_of(scene.view.state(p)) == 'glass')
    query = scene.inspect(glass)
    return {'coordinate': glass, 'query': query, 'window_cells': sorted(scene.cells(query['instance'])), 'mount': mounted.path, 'mount_cells': len(cells), 'ports': scene.view.offers(mounted.path, 'daylight')}


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--seed', type=int, default=0)
    parser.add_argument('--environment-seed', type=int, default=0)
    parser.add_argument('--output', type=Path, default=Path('ridge-inspection.litematic'))
    args = parser.parse_args()
    scene = lodge_scene(lantern_house(args.seed), args.seed, args.environment_seed)
    before = inspect_ridge(scene)
    export_scene(scene, args.output)
    restored = load_scene(args.output)
    after = inspect_ridge(restored)
    assert encode(before) == encode(after)
    assert scene.cells(before['mount'], True) == restored.cells(before['mount'], True)
    print(json.dumps(encode({'seed': args.seed, 'environment_seed': args.environment_seed, 'matches_reload': True, **before}), indent=2))
