# Run the small terrain, planting and attached-window composition before full buildings.
import argparse
from pathlib import Path
from hearth import Scene, Box, Frame, Binding
from hearth.environment import Terrain, gradient, wave
from hearth.components.primitives import Wall, Window, Grass, Tree
from hearth.adapters.site import Foundation
from hearth.composition import encapsulate
from hearth.kernel import Plan, Child
from hearth.persistence import export_scene


def build(seed=0):
    scene = Scene(seed, domain=Box((-8, -3, -8), (20, 24, 20)))
    scene.place('land', Terrain(scene.domain, gradient(base=2) + wave(0.6, 0.2, 0.2)))

    def facade(ctx):
        return Plan(children=[Child('wall', Wall(thickness=2)), Child('window', Window(), frame=Frame((3, 1, 0)), bindings=(Binding(ctx.path + '/wall', 'infill'),))])

    scene.place('footing', Foundation.rectangular(9, 2, 4), bindings=(Binding('/land', 'construction', 'fill'),))
    scene.place('facade', encapsulate('facade', Box((-1, 0, -2), (10, 6, 3)), facade), frame=Frame((0, 4, 0)))
    y = scene.view.elevation(13, 9) + 1
    scene.place('grass', Grass(True), frame=Frame((13, y, 9)), bindings=(Binding('/land', 'planting', 'plant'),))
    scene.place('tree', Tree(), frame=Frame((13, y, 9)), bindings=(Binding('/land', 'planting', 'plant'), Binding('/grass', 'replacement', 'plant')))
    return scene.finalize()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--seed', type=int, default=0)
    parser.add_argument('--output', type=Path, default=Path('samples/prototype.litematic'))
    args = parser.parse_args()
    export_scene(build(args.seed), args.output)
