import random
class levelgen:
    def __init__(self, size: int):
        self.r_coord = random.randint(1, size)
        self.c_coord = random.randint(1, size)
        self.maze_size = size + 2
        self.size = size * 2
        self.dir = ""
        self.dir_dic = {"u": "d", "d": "u", "r": "l", "l": "r"}
        self.node_stack = []
        self.DIRS = ["l", "r", "d", "u"]
        self.maze = [[" " for x in range(self.maze_size)] for y in range(self.maze_size)]
        self.rooms_made = 0
        self.add_borders()

        print("start row",self.r_coord)
        print("start column",self.c_coord)


        print(self.node_stack)


        while not self.is_filled():
            self.generate_room()

        print("T")

        for row in self.maze:
            print(row)

    def generate_room(self):
        self.available_dirs = ["l", "r", "d", "u"]
        print("constant",["l", "r", "d", "u"])

        self.check_dirs()
        print("checked dirs")
        self.dir = random.choice(self.available_dirs)
        self.maze[self.r_coord][self.c_coord] = self.dir
        self.move(self.dir)

        print(f"rooms made : {self.rooms_made}")

        for row in self.maze:
            print(row)

    def check_dirs(self):
        #print("available:", self.available_dirs)


        if self.maze[self.r_coord - 1][self.c_coord] != " " and "u" in self.available_dirs:
            self.available_dirs.remove("u")
            if len(self.available_dirs) <= 0:
                self.backtrack()
        if self.maze[self.r_coord + 1][self.c_coord] != " " and "d" in self.available_dirs:
            self.available_dirs.remove("d")
            if len(self.available_dirs) <= 0:
                self.backtrack()
        if self.maze[self.r_coord][self.c_coord + 1] != " " and "r" in self.available_dirs:
            self.available_dirs.remove("r")
            if len(self.available_dirs) <= 0:
                self.backtrack()
        if self.maze[self.r_coord][self.c_coord - 1] != " " and "l" in self.available_dirs:
            self.available_dirs.remove("l")
            if len(self.available_dirs) <= 0:
                self.backtrack()
        print("available:", self.available_dirs)
        self.dir = random.choice(self.available_dirs)

    def move(self, direction):
        if direction == "r":
            self.c_coord += 1
        elif direction == "l":
            self.c_coord -= 1
        elif direction == "u":
            self.r_coord -= 1
        elif direction == "d":
            self.r_coord += 1

    def add_borders(self):
        for j in range(1, self.maze_size):
            self.maze[j - 1][0] = "x"
        for j in range(1, self.maze_size):
            self.maze[j - 1][-1] = "x"
        for j in range(1, self.maze_size):
            self.maze[0][j - 1] = "x"
        for j in range(1, self.maze_size):
            self.maze[-1][j - 1] = "x"
        self.maze[-1][self.maze_size - 1] = "x"

    def backtrack(self):
        if len(self.node_stack) > 0:
            self.node_stack.pop(-1)
        else:
            breakpoint()
        print("backtracked")
        print("visited:",self.node_stack)

        self.r_coord = self.node_stack[-1][0]
        self.c_coord = self.node_stack[-1][1]
        self.available_dirs = ["l", "r", "d", "u"]
        self.check_dirs()

    def is_filled(self):
        for r in self.maze:
            for c in r:
                if c == " ":
                    return False
        return True
    def check_rooms(self):
        self.rooms_made = 0
        for r in self.maze:
            for c in r:
                if c != "x" and c != " ":
                    self.rooms_made += 1
        return self.rooms_made



levelgen(3)