lines = [
    ['A','B'],
    ['A','C'],
    ['B', 'C'],
    ['D', 'C'],
    ['E','C'],
    ['E','F'],
    ['C', 'F'],
    ['F','G'],
    ['F','H'],
    ['G', 'H'],
]

'''the verteices of {'POINT', (ADAJACENT POINTS)}'''
vertex_and_adjs = dict()

class Vertex:
    def __init__(self, name, adjacent):
        self.color = None
        self.name = name
        self.adjacents = set(adjacent)
    
    def add_adjacent(self, adj):
        self.adjacents.add(adj)
    def __repr__(self):
        return '{' + f'{self.name} -  color: {self.color}, adjs: {self.adjacents}' + '}'


def add_to_graph(vertexes, lines):
    for line in lines:
        point_a = line[0]
        point_b = line[1]
        
        if not point_a in vertexes:
            vertexes[point_a] = Vertex(point_a, point_b)
        else:
            vertexes[point_a].add_adjacent(point_b)
        
        if not point_b in vertexes.keys():
            vertexes[point_b]  = Vertex(point_b, point_a)
        else:
            vertexes[point_b].add_adjacent(point_a)
    return vertexes

graph = add_to_graph(vertex_and_adjs, lines)

def is_available(graph, vertex, color):
    adjacents_of_vertex = graph[vertex].adjacents
    unavailable_colors = list(map(lambda x : graph[x].color, adjacents_of_vertex))
    print("vertex", vertex)
    print("color", color)
    print("UN_COLORS", unavailable_colors)
    print("==")

    if color in unavailable_colors:
        return False
    else:
        return True

colors = ['1','2','3','4']

def graph_add_color(graph, vertex_id, colors):
    graph_len = len(graph)
    graph_list = list(graph)
    for color in colors:
        if is_available(graph, graph_list[vertex_id], color):
            graph[graph_list[vertex_id]].color = color
            if vertex_id < graph_len-1 \
             and graph_add_color(graph, vertex_id+1, colors):
                return True
            else:
                continue
    return False

res = graph_add_color(graph, 0, colors)
print(res)
