#!/usr/bin/python3
import os
import subprocess
import sys

#Colores
class c:
                COLOR1 = '\033[33m'
                ENDC = '\033[0m'

class Usb():
    def __init__(self):
        self.modelo = self.getRaspberryPiModel()
        self.equipos=["","","",""]
        self.puertos=["","","",""]

    def app(self, args='', port=0):
        num=int(port)
        if args=='-a':
            if num>=2 and num<=5:
                return self.getPort(num)
            else:
                 print('Ingrese valores entre 2 y 5')
        else:
            print(c.COLOR1+"Modelo "+self.modelo)
            print(c.COLOR1+"\nBuscador de Puertos USB\n"+c.ENDC)
            print(c.COLOR1+ "XXXXXXXXXXXXXXXXXXXX\nXX   2   XX   4   XX\nXXXXXXXXXXXXXXXXXXXX\nXX   3   XX   5   XX\nXXXXXXXXXXXXXXXXXXXX\n"+c.ENDC)
            self.mostrarUSBPorModelo()

    def getRaspberryPiModel(self):
                    model = "UNKNOWN"  # too old, newer OS versions do have this procfile
                    with open("/proc/device-tree/model") as myfile:
                            model = myfile.read().strip()
                    return model

    def equipo(self, path):
            path_e=path+"/uevent"
            archivo=open(path_e,"r")
            out1=archivo.read()
            #print(out1)
            if "1a86/7523" in out1:
                    return "Arduino Nano"
            elif "403/6001" in out1:
                    return "Arduino Nano"
            elif "1546/1a7" in out1:
                    return "GPS"
            elif "1546/1a8" in out1:
                    return "GPS"
            elif "10c4/ea60" in out1:
                    return "ESP-32"
            elif "484/5750" in out1:
                    return "Display 11"
            else:
                    return ""

    def autodetectHardwareVersion(self):
            hardwareVersion = self.getRaspberryPiModel()
            if "Raspberry Pi 3 Model B Plus" in hardwareVersion:
                    print("3B+")

            elif "Raspberry Pi 4 Model B Rev 1.5" in hardwareVersion:
                    print("Raspberry Pi 4")

            elif "Raspberry Pi 3 Model B" in hardwareVersion:
                    print("3B")
            else:
                    print("No es 3B, 3B+ o 4")

    def mostrarUSBPorModelo(self):
            hardwareVersion = self.getRaspberryPiModel()
            if "Raspberry Pi 3 Model B Plus" in hardwareVersion or "Raspberry Pi 3 Model B" in hardwareVersion:
                for port in range(2,6):
                    if port==2 or port==3:
                        path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.%d/1-1.1.%d:1.0" % (port, port)
                    elif port==4:
                        path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0"
                    else:
                        path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0"

                    try:
                        self.equipos[port-2]=self.equipo(path)
                    except:
                        self.equipos[port-2]="Libre"
                    try:
                        condition=0
                        while condition==0:
                            files = os.listdir(path)
                            dig_port="Libre"
                            for file in files:
                                if file.strip() == "tty":
                                    files2 = os.listdir("%s/tty" % path)
                                    for file2 in files2:
                                        if file2[:3] == "tty":
                                            dig_port="/dev/%s" % file2
                                if file[:3] == "tty":
                                    fullpath = "%s%s" % (path, file[:3])
                                    dig_port= "/dev/%s" % file
                            if dig_port=="/dev/tty":
                                path=path+"/tty"
                            else:
                                condition=1
                    except:
                        dig_port="Libre"
                    self.puertos[port-2]=dig_port
                    print("- Puerto Fisico %d:" % port)
                    print("---> Equipo: %s" % self.equipos[port-2])
                    print("---> Puerto: %s\n" % self.puertos[port-2])
            elif "Raspberry Pi 4 Model B" in hardwareVersion:
                for port in range(2,6):
                    if port==2:
                        path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.0"
                    elif port==3:
                        path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4:1.0"
                    elif port==4:
                        path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0"
                    elif port==5:
                        path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0"

                    try:
                        self.equipos[port-2]=self.equipo(path)
                    except:
                        self.equipos[port-2]="Libre"
                    try:
                        condition=0
                        while condition==0:
                            files = os.listdir(path)
                            dig_port="Libre"
                            for file in files:
                                if file.strip() == "tty":
                                    files2 = os.listdir("%s/tty" % path)
                                    for file2 in files2:
                                        if file2[:3] == "tty":
                                            dig_port="/dev/%s" % file2
                                if file[:3] == "tty":
                                    fullpath = "%s%s" % (path, file[:3])
                                    dig_port= "/dev/%s" % file
                            if dig_port=="/dev/tty":
                                path=path+"/tty"
                            else:
                                condition=1
                    except:
                        dig_port="Libre"
                    self.puertos[port-2]=dig_port
                    print("- Puerto Fisico %d:" % port)
                    print("---> Equipo: %s" % self.equipos[port-2])
                    print("---> Puerto: %s\n" % self.puertos[port-2])

    def getPort(self, port):
            hardwareVersion = self.getRaspberryPiModel()
            if "Raspberry Pi 3 Model B Plus" in hardwareVersion or "Raspberry Pi 3 Model B" in hardwareVersion:
                if port==2 or port==3:
                    path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.%d/1-1.1.%d:1.0" % (port, port)
                elif port==4:
                    path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0"
                else:
                    path = "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0"
                try:
                    condition=0
                    while condition==0:
                        files = os.listdir(path)
                        dig_port="Libre"
                        for file in files:
                            if file.strip() == "tty":
                                files2 = os.listdir("%s/tty" % path)
                                for file2 in files2:
                                    if file2[:3] == "tty":
                                        dig_port="/dev/%s" % file2
                            if file[:3] == "tty":
                                fullpath = "%s%s" % (path, file[:3])
                                dig_port= "/dev/%s" % file
                        if dig_port=="/dev/tty":
                            path=path+"/tty"
                        else:
                            condition=1
                except:
                    dig_port="Libre"
                return dig_port
            
            elif "Raspberry Pi 4 Model B" in hardwareVersion:
                if port==2:
                    path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.0"
                elif port==3:
                    path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4:1.0"
                elif port==4:
                    path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0"
                elif port==5:
                    path = "/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0"

                try:
                    condition=0
                    while condition==0:
                        files = os.listdir(path)
                        dig_port="Libre"
                        for file in files:
                            if file.strip() == "tty":
                                files2 = os.listdir("%s/tty" % path)
                                for file2 in files2:
                                    if file2[:3] == "tty":
                                        dig_port="/dev/%s" % file2
                            if file[:3] == "tty":
                                fullpath = "%s%s" % (path, file[:3])
                                dig_port= "/dev/%s" % file
                        if dig_port=="/dev/tty":
                            path=path+"/tty"
                        else:
                            condition=1
                except:
                    dig_port="Libre"
                return dig_port
            
puerto = Usb()
try:
    args = sys.argv[1]
    num = int(sys.argv[2])
    digital_port = puerto.app(args,num)
    print(digital_port)
except:
    digital_port = puerto.app()