import time
import sys
from neopixel import *
import argparse
from random import randint,choice
import socket
# LED strip configuration:
LED_COUNT      = 100      # Number of LED pixels.
LED_PIN        = 18      # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN        = 10      # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 10      # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255     # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL    = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53

strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()

NetPath ={
'A': ['C'],
'B': ['B','C'],
'C': ['A','B','D'],
'D': ['E','G','C'],
'E': ['D','M','N','F'],
'F': ['E','O','P'],
'G': ['D','L','K','H'],
'H': ['G','I','J'],
'I': ['H'],
'J': ['H'],
'K': ['G'],
'L': ['G'],
'M': ['E'],
'N': ['E'],
'O': ['F'],
'P': ['F']
}

NodePath = {"head": 'A',
        "file": 'B',
        "worker1": 'O',
        "worker2": 'P',
        "worker3": 'M',
        "worker4": 'N',
        "worker5": 'L',
        "worker6": 'K',
        "worker7": 'I',
        "worker8": 'J'
	
        }

NetLights ={
'AC' :[0,1,2,3,4,5,6,7,8,9,10,11,12],
'CA' :[12,11,10,9,8,7,6,5,4,3,2,1,0],
'BC' :[19,18,17,16,15,14,13,12],
'CB' :[12,13,14,15,16,17,18,19],
'CD' :[22,23,24,25,26,27,28,29,30],
'DC' :[30,29,28,27,26,25,24,23,22],
'DE' :[31,50,51,52],
'ED' :[52,51,50,31],
'DG' :[31,32,33,34],
'GD' :[34,33,32,31],
'EM' :[52,53,54],
'ME' :[54,53,52],
'EN' :[52,55,56],
'NE' :[56,55,52],
'EF' :[57,58,59,60],
'FE' :[60,59,58,57],
'FO' :[61,62,63],
'OF' :[63,62,61],
'PF' :[65,64,61],
'FP' :[61,64,65],
'GH' :[39,40,41,42],
'HG' :[42,41,40,39],
'LG' :[36,35,34],
'GL' :[34,35,36],
'GK' :[34,37,38],
'KG' :[38,37,34],
'HI' :[43,44,45],
'IH' :[45,44,43],
'HJ' :[45,46,47],
'JH' :[47,46,45]
}



def find_path(graph, start, end, path=[]):
            if '81' in start or '81' in end:
                print("TEMPEST DETECTED")
                return None
            path = path + [start]
            if end == "192.168.1.1":
                    end = "HeadRev"
            if end == "192.168.1.5":
                    end = "FileRev"
            if start == end:
                return path
            if not graph.has_key(start):
                return None
            for node in graph[start]:
                if node not in path:
                    newpath = find_path(graph, node, end, path)
                    if newpath: return newpath
            return None
#print("starting")

iter = 0
while iter < int(sys.argv[3]):
    
    start = NodePath[sys.argv[1]]
    end = NodePath[sys.argv[2]]


    ### To do random
    start_path = find_path(NetPath,start,end)
    path = []
    try:
        for i in range(0,len(start_path)-1):
            path.append(start_path[i]+start_path[i+1])
    except:
            print("empty path")
    try:
        r,g,b = choice([0,255]),choice([0,255]),choice([0,255])
        for a in path:
            data = 128
            for i in NetLights.get(a):
                
                strip.setPixelColor(i,Color(r,g,b))
                strip.show()
                time.sleep(0.001)
            
        for i in range(0,100):
            strip.setPixelColor(i, Color(0,0,0))
        strip.show()
        time.sleep(0.02)
        iter += 1 

    except Exception as e:
        print(str(e))
        x=0
        print("ERROR")