from core.cell import Cell
from core.maze import Maze
from builders.maze_builder import MazeBuilder


class TextFileMazeBuilder(MazeBuilder):
    def buildFromFile(self, filename):
        with open(filename, "r", encoding="utf-8") as f:
            lines = [line.rstrip("\n") for line in f]

        if not lines:
            raise ValueError("Maze file is empty")

        width = max(len(line) for line in lines)
        height = len(lines)

        cells = []
        startCell = None
        exitCell = None

        for y, line in enumerate(lines):
            row = []
            for x in range(width):
                ch = line[x] if x < len(line) else "#"

                if ch == "#":
                    cell = Cell(x, y, isWall=True)
                elif ch == "S":
                    if startCell is not None:
                        raise ValueError("Multiple start cells found")
                    cell = Cell(x, y, isWall=False, isStart=True)
                    startCell = cell
                elif ch == "E":
                    if exitCell is not None:
                        raise ValueError("Multiple exit cells found")
                    cell = Cell(x, y, isWall=False, isExit=True)
                    exitCell = cell
                elif ch in (" ", "."):
                    cell = Cell(x, y, isWall=False)
                elif ch.isdigit():
                    cell = Cell(x, y, isWall=False, weight=max(1, int(ch)))
                else:
                    raise ValueError(f"Unsupported symbol '{ch}' at ({x}, {y})")
                row.append(cell)
            cells.append(row)

        if startCell is None:
            raise ValueError("Start cell 'S' not found")
        if exitCell is None:
            raise ValueError("Exit cell 'E' not found")

        return Maze(cells, width, height, startCell, exitCell)
