from abc import ABC, abstractmethod
from model import Maze, Cell

class MazeBuilder(ABC):
    @abstractmethod
    def buildFromFile(self, filename):
        pass

class TextFileMazeBuilder(MazeBuilder):
    def buildFromFile(self, filename):
        with open(filename, "r", encoding="utf-8") as file:
            lines = [line.rstrip("\n")
                for line in file
            ]
        height = len(lines)
        width = len(lines[0])
        maze = Maze(width, height)
        start_count = 0
        exit_count = 0
        for x, line in enumerate(lines):
            row = []
            for y, symbol in enumerate(line):
                if symbol == "#":
                    cell = Cell(x, y, is_wall=True)
                elif symbol == "S":
                    cell = Cell(x, y, is_start=True)
                    start_count += 1
                elif symbol == "E":
                    cell = Cell(x, y, is_exit=True)
                    exit_count += 1
                elif symbol == " ":
                    cell = Cell(x, y)
                else:
                    raise ValueError(f"Неизвестный символ: {symbol}")
                row.append(cell)
            maze.add_row(row)
        if start_count != 1:
            raise ValueError("Должен быть ровно один старт S")
        if exit_count != 1:
            raise ValueError("Должен быть ровно один выход E")
        return maze