import sys, os, json
from random import shuffle, randrange
from operator import iadd
from functools import reduce

#================================================================

def gen_maze(w = 8, h = 8):
    visited = [[0] * w + [1] for _ in range(h)] + [[1] * (w + 1)]
    walls = [[1,(i+1)%2]*w+[1] for i in range(2*h+1)]
 
    def walk(x, y):
        visited[y][x] = 1
        d = [(x-1,y), (x,y+1), (x+1,y), (x,y-1)]
        shuffle(d)
        for (xx, yy) in d:
            if visited[yy][xx]: continue
            if xx == x: walls[2*max(y, yy)][2*x+1] = 0
            if yy == y: walls[1+2*y][2*max(x, xx)] = 0
            walk(xx, yy)
 
    walk(randrange(w), randrange(h))
    return walls

#================================================================

outfile = 'gmaze.json'
if len(sys.argv) > 1:
    outfile = sys.argv[1]
outfile = os.path.basename(outfile)  # !!! Prohibit path traversal !!!
if not outfile.endswith('.json'):
    outfile += '.json'

#================================================================

with open('gmaze__template.json') as f:
    map = json.load(f)

w,h = map['width'], map['height']

walls = None
collides = None

for layer in map['layers']:
    if layer['name'] == 'walls':
        walls = layer['data']
    elif layer['name'] == 'collides':
        collides = layer['data']
    
maze = gen_maze(w//2, h//2)
maze = reduce(iadd, maze)  # flatten list

for i in range(len(maze)):  # clear maze walls
    if maze[i] == 0:
        walls[i] = 0
        collides[i] = 0

with open(outfile,'w') as f:
    map = json.dump(map, f, sort_keys=1)

#================================================================

