import random
import os

def generate_complex_maze(width, height, filename):
    # 1. Делаем размеры нечётными, чтобы сетка carving'а работала корректно
    if width % 2 == 0: width -= 1
    if height % 2 == 0: height -= 1

    # 2. Заполняем стенами
    maze = [['#' for _ in range(width)] for _ in range(height)]
    
    # 3. Recursive Backtracking (вырезание коридоров)
    start_x, start_y = 1, 1
    maze[start_y][start_x] = ' '
    stack = [(start_x, start_y)]
    directions = [(0, -2), (0, 2), (-2, 0), (2, 0)] 

    while stack:
        x, y = stack[-1]
        neighbors = []
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            # Проверяем границы и чтобы клетка была ещё стеной
            if 0 < nx < width - 1 and 0 < ny < height - 1 and maze[ny][nx] == '#':
                neighbors.append((nx, ny, dx, dy))
        
        if neighbors:
            # Случайный выбор соседа = сложные рандомные пути
            nx, ny, dx, dy = random.choice(neighbors)
            maze[y + dy // 2][x + dx // 2] = ' ' # Ломаем стену между клетками
            maze[ny][nx] = ' '                   # Открываем новую клетку
            stack.append((nx, ny))
        else:
            stack.pop() # Тупик -> назад
    
    # 4. Ставим S и E на гарантированно проходимые (нечётные) координаты
    maze[1][1] = 'S'
    maze[height - 2][width - 2] = 'E' 

    # 5. Сохранение
    script_dir = os.path.dirname(os.path.abspath(__file__))
    data_dir = os.path.join(script_dir, 'data')
    os.makedirs(data_dir, exist_ok=True)
    
    filepath = os.path.join(data_dir, filename)
    with open(filepath, 'w', encoding='utf-8') as f:
        f.write('\n'.join(''.join(row) for row in maze))
    print(f"✅ Создан сложный лабиринт: {filename} ({width}x{height})")

if __name__ == "__main__":
    generate_complex_maze(100, 100, 'large.txt')