import networks.geometry.curve_tools as curve_tools
import networks.geometry.Strip as Strip
import networks.geometry.segment_tools as segment_tools
import random


class Lane:
    def __init__(self, coordinates, lane_materials,  width):
        self.coordinates = coordinates
        self.width = width
        self.lane_materials = lane_materials
        self.surface = []

    def get_surface(self):
        resolution, distance = curve_tools.resolution_distance(
            self.coordinates, 6)

        curve_points = curve_tools.curve(self.coordinates, resolution)
        curve_surface = Strip.Strip(self.coordinates)
        curve_surface.compute_curvature()

        # Set the road to be flat
        normals = []
        for i in range(len(curve_surface.curvature)):
            normals.append((0, 1, 0))

        # # Compute each line
        # for distance in range(self.width):
        #     offset = curve_tools.offset(curve_surface.curve, distance, normals)
        #     for i in range(len(offset)-1):
        #         line = segment_tools.discrete_segment(offset[i], offset[i+1])
        #         for coordinate in line:
        #             self.surface.append((coordinate, random.choices(
        #                 list(self.lane_materials.keys()),
        #                 weights=self.lane_materials.values(),
        #                 k=1,)[0]))

        curve_surface.compute_surface_perpendicular(self.width, normals)
        for i in range(len(curve_surface.surface)):
            for j in range(len(curve_surface.surface[i])):
                for k in range(len(curve_surface.surface[i][j])):
                    for l in range(len(curve_surface.surface[i][j][k])):
                        self.surface.append((curve_surface.surface[i][j][k][l], random.choices(
                            list(self.lane_materials.keys()),
                            weights=self.lane_materials.values(),
                            k=1,)[0]))

        return self.surface
