# Check generation and public inspection without importing native or transport packages.
import argparse
import importlib.abc
import json
from pathlib import Path
import sys


def run(seed, environment_seed, output):
    denied = ('numpy', 'mcio', 'PIL', 'scipy', 'litemapy')

    class Guard(importlib.abc.MetaPathFinder):

        def find_spec(self, fullname, path=None, target=None):
            if fullname.split('.')[0] in denied:
                raise RuntimeError('Unexpected native or transport dependency: ' + fullname)

    guard = Guard()
    if set(denied).intersection(sys.modules):
        raise RuntimeError('Run this guard in a fresh Python process')
    sys.meta_path.insert(0, guard)
    try:
        from hearth.lodges import lodge_scene
        from hearth.persistence import encode, semantic_digest
        from hearth.quality_assessment import principal_signature
        from examples.lantern_house import lantern_house
        from examples.ridge_inspection import inspect_ridge
        scene = lodge_scene(lantern_house(seed), seed, environment_seed)
        report = {'seed': seed, 'environment_seed': environment_seed, 'native_import_guard': True, 'browser_executed': False, 'denied_imports': denied, 'blocks': len(scene.blocks), 'nodes': len(scene.nodes), 'digest': semantic_digest(scene), 'principal_signature': principal_signature(scene)[0], 'inspection': inspect_ridge(scene)}
        output.parent.mkdir(parents=True, exist_ok=True)
        output.write_text(json.dumps(encode(report), indent=2))
        return {k: report[k] for k in ('seed', 'native_import_guard', 'browser_executed', 'blocks', 'nodes', 'digest')}
    finally:
        sys.meta_path.remove(guard)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--seed', type=int, default=0)
    parser.add_argument('--environment-seed', type=int, default=7107)
    parser.add_argument('--output', type=Path, default=Path('reports/building-lantern/portability.json'))
    args = parser.parse_args()
    print(json.dumps(run(args.seed, args.environment_seed, args.output), indent=2))
