import shared
from pprint import pprint as pp
from matrix import matrix_of_size


class Vents:
    def __init__(self, name):
        self.width = 0
        self.height = 0
        self.parse(name)
        self.matrix = matrix_of_size(self.width + 1, self.height + 1)

    def parse(self, name):
        def _split_line(line):
            one, two = line.split(" -> ")
            coords = list(map(int, one.split(","))), list(map(int, two.split(",")))
            (x1, y1), (x2, y2) = coords
            # set grid size
            if max(x1, x2) > self.width:
                self.width = max(x1, x2)
            if max(y1, y2) > self.height:
                self.height = max(y1, y2)
            return coords

        with open(name, "r") as f:
            self.coords = [_split_line(x.rstrip()) for x in f.readlines() if x.rstrip()]

    def draw_lines(self):
        for coords in self.coords:
            self.draw_line(*coords)

    def draw_line(self, pos1, pos2):
        x1, y1 = pos1
        x2, y2 = pos2

        if x1 == x2:  # Straight
            self.draw_horizontal_x(x1, (y1, y2))
        elif y1 == y2:  # Straight
            self.draw_horizontal_y((x1, x2), y1)
        else:  # diagonal
            self.draw_diagonal((x1, x2), (y1, y2))

    def draw_horizontal_x(self, x, y_coords):
        coords = sorted(y_coords)
        for y in range(coords[0], coords[1] + 1):
            self.matrix[y][x] += 1

    def draw_horizontal_y(self, x_coords, y):
        coords = sorted(x_coords)
        for x in range(coords[0], coords[1] + 1):
            self.matrix[y][x] += 1

    def draw_diagonal(self, x_coords, y_coords):
        coords = self.generate_diagonal(*x_coords, *y_coords)
        for x, y in coords:
            self.matrix[y][x] += 1

    def generate_diagonal(self, x1, x2, y1, y2):
        x_dir, y_dir = 1, 1
        if x2 < x1:
            x_dir = -1
        if y2 < y1:
            y_dir = -1
        new_y = range(y1 + y_dir, y2, y_dir)
        new_x = range(x1 + x_dir, x2, x_dir)
        return [(x1, y1), *list(zip(new_x, new_y)), (x2, y2)]

    def count(self):
        return len([item for sublist in self.matrix for item in sublist if item > 1])


def main():
    v = Vents(shared.get_fname(5))
    v.draw_lines()
    pp(v.count())


if __name__ == "__main__":
    main()
