import yaml
import numpy
import pandas as pd

def parse_wireviz_yml(file_path):
    # Load the WireViz YML file
    with open(file_path, 'r') as file:
        data = yaml.safe_load(file)
    idcount = 0
    wires = data['cables']
    connectors = data['connectors']
    connections = data['connections']
    connectorlist = []
    for connector in data['connectors']:
        connectorlist.append(connector)
    #print(connectors['ECU']['pins'])
    wire_info = []
    for connection in connections:
        connectorwpin = str(connection[0])
        connector = connectorwpin[2:connectorwpin.find("':")]
        connectorwires = str(connection[1])
        if (len(connection)==2)and(connectorlist.count(connector) < 1):
            connectorwpin = str(connection[1])
            connector = connectorwpin[2:connectorwpin.find("':")]
            connectorwires = str(connection[0])
        elif(len(connection)==4):
            connectorwpin = str(connection[3])
            connector = connectorwpin[2:connectorwpin.find("':")].strip("'")
            connectorwires = str(connection[2])

        #currently skipping all abnormal conditions
        if connectorlist.count(connector) < 1:
            continue
        connectorpins = connectorwpin[connectorwpin.find(" [")+2:connectorwpin.rfind("]}")].strip(" ").split(",")
        connectorpinsadjusted = []
        for pins in connectorpins:
            if str(pins).count("-") > 0:
                pinrange = pins.strip("' ").split("-")
                for x in range(int(pinrange[0]),int(pinrange[1])+1):
                    connectorpinsadjusted.append(x)
            else:
                connectorpinsadjusted.append(pins)
        #connectorpinsadjusted= list(map(int,connectorpinsadjusted))
        bundle = connectorwires[2:connectorwires.find("':")]
        bundlewires = connectorwires[connectorwires.find(" [")+2:connectorwires.rfind("]}")].split(",")
        # print(bundlewires)
        # bundlewiresadjusted = []
        # for wire in bundlewires:
        #     if str(wire).count("-") > 0:
        #         wirerange = wire.strip("' ").split("-")
        #         for x in range(int(wirerange[0]),int(wirerange[1])+1):
        #             bundlewiresadjusted.append(x)
        #     else:
        #         bundlewiresadjusted.append(wire)
        # print(bundlewiresadjusted)

        connector2pinsadjusted = []
        if len(connection) == 3:
            connector2wpin = str(connection[2])
            connector2 = connector2wpin[2:connector2wpin.find("':")]
            print(connector2)
            connector2pins = connector2wpin[connector2wpin.find(" [")+2:connector2wpin.rfind("]}")].split(",")
            for pins in connector2pins:
                idcount=idcount+1
                if pins.count("-") > 0:
                    pinrange = pins.strip("' ").split("-")
                    negativesign=0
                    for pin in pinrange:
                        if str(connectors[connector]['pins']).count(pin) < 1:
                            negativesign=1
                    if not negativesign:
                        for x in range(int(pinrange[0]),int(pinrange[1])+1):
                            connector2pinsadjusted.append(x)
                    else:
                        connector2pinsadjusted = connector2pins
                else:
                    connector2pinsadjusted = connector2pins
            for x in range(0,len(connectorpinsadjusted)):
                pin1 = connectorpinsadjusted[x]
                con1type = "Unspecified"
                pin2 = connector2pinsadjusted[x]
                con2type = "Unspecified"
                notes = ""
                if str(connectors[connector.strip("'")]).count("'pinlabels':"):
                    stringarray = list(map(str,connectors[connector]['pinlabels']))
                    if stringarray.count(str(connectorpinsadjusted[x])[1:-1]):
                        pin1= connectors[connector]['pins'][stringarray.index(connectorpinsadjusted[x][1:-1])]
                if str(connectors[connector]).count("'type':"):
                    con1type = connectors[connector]['type']
                if not connectorlist.count(connector2) < 1:
                    if str(connectors[connector2.strip("'")]).count("'pinlabels':")and not(str(connector2pinsadjusted[x]).isnumeric()):
                        stringarray = list(map(str,connectors[connector2]['pinlabels']))
                        if stringarray.count(connector2pinsadjusted[x].strip(" ")[1:-1]):
                            pin2= connectors[connector2]['pins'][stringarray.index(connector2pinsadjusted[x].strip(" ")[1:-1])]
                    if str(connectors[connector2.strip("'")]).count("'type':"):
                        con2type = connectors[connector2.strip("'")]['type']
                if str(wires[bundle]).find("'notes':") > 0:
                    notes = wires[bundle]['notes']
                ident = str(ord(connector[0]))[0]+str(ord(str(pin1)[-1]))[-1]+str(ord(str(pin2)[-1]))[-1]+str(ord(wires[bundle]['colors'][x][0]))+str(idcount)[-1]
                ident = ident.strip(" ")
                wire_info.append({
                    'Identifier': ident,
                    'End 1': connector,
                    'Type 1': con1type,
                    'Pin 1': pin1,
                    'Length': wires[bundle]['length'],
                    'Color': wires[bundle]['colors'][x],
                    'Gauge': wires[bundle]['gauge'],
                    'End 2': connector2,
                    'Type 2': con2type,
                    'Pin 2': pin2,
                    'Notes': notes,
                })
        elif len(connection) == 2:
            idcount=idcount+1                
            for x in range(0,len(connectorpinsadjusted)):
                pin1 = connectorpinsadjusted[x]
                con1type = "Unspecified"
                notes = ""
                if str(connectors[connector]).count("'pinlabels':") and not str(connectors[connector]['pins']).count(str(pin1)):
                    stringarray = list(map(str,connectors[connector]['pinlabels']))
                    if stringarray.count(connectorpinsadjusted[x][1:-1]):
                        pin1= connectors[connector]['pins'][stringarray.index(connectorpinsadjusted[x][1:-1])]
                if str(connectors[connector]).count("'type':"):
                    con1type = connectors[connector]['type']
                if str(wires[bundle]).find("'notes':") > 0:
                    notes = wires[bundle]['notes']
                ident = str(ord(connector[0]))[0]+str(ord(str(pin1)[-1]))[-1]+"0"+str(ord(wires[bundle]['colors'][x][0]))+str(idcount)[-1]
                ident = ident.strip(" ")
                wire_info.append({
                    'Identifier': ident,
                    'End 1': connector,
                    'Type 1': con1type,
                    'Pin 1': connectorpinsadjusted[x],
                    'Length': wires[bundle]['length'],
                    'Color': wires[bundle]['colors'][x],
                    'Gauge': wires[bundle]['gauge'],
                    'End 2': "----",
                    'Type 2': "----",
                    'Pin 2': "----",
                    'Notes': notes,
                })
        elif len(connection) == 4:
            idcount=idcount+1                
            for x in range(0,len(connectorpinsadjusted)):
                pin1 = connectorpinsadjusted[x]
                con1type = "Unspecified"
                notes = ""
                if str(connectors[connector]).count("'pinlabels':"):
                    stringarray = list(map(str,connectors[connector]['pinlabels']))
                    if stringarray.count(str(connectorpinsadjusted[x])[1:-1]):
                        pin1= connectors[connector]['pins'][stringarray.index(connectorpinsadjusted[x][1:-1])]
                if str(connectors[connector]).count("'type':"):
                    con1type = connectors[connector]['type']
                if str(wires[bundle]).find("'notes':") > 0:
                    notes = wires[bundle]['notes']
                ident = str(ord(connector[0]))[0]+str(ord(str(pin1)[-1]))[-1]+"S"+str(ord(wires[bundle]['colors'][x][0]))+str(idcount)[-1]
                ident = ident.strip(" ")
                wire_info.append({
                    'Identifier': ident,
                    'End 1': "Splice",
                    'Type 1': "Crimp Splice",
                    'Pin 1': "-",
                    'Length': wires[bundle]['length'],
                    'Color': wires[bundle]['colors'][x],
                    'Gauge': wires[bundle]['gauge'],
                    'End 2': connector,
                    'Type 2': con1type,
                    'Pin 2': pin1,
                    'Notes': notes,
                })



    # Create a DataFrame to display the data as a table
    wire_df = pd.DataFrame(wire_info, columns=['Identifier','End 1','Type 1', 'Pin 1', 'Length', 'Color', 'Gauge', 'End 2','Type 2', 'Pin 2', 'Notes'])
    return wire_df

# Path to your WireViz YML file
file_path = 'wireviz/Choppy_ECU_12FB.yml'
wire_table = parse_wireviz_yml(file_path)

# Display the table
print(wire_table)
outputfile = file_path[:-4]+".csv"
wire_table.to_csv(outputfile)
