import json

nodeIds = []
destIds = []
clusterlabels = []
destclusterlabel = []
cluster = []
labalvlues = []

def classify():

    with open("mult_in_out_large.json", "r") as json_file:
        df_nodes = json.load(json_file)



    for row in df_nodes:

        for j in range(len(row['TransactionFrom'])):
            print("   Input Ids:  ", row['TransactionFrom'][j])
        nodeIds.append(row['TransactionFrom'])
        print("This is nodes:  ", nodeIds)


    for row in df_nodes:
       destIds.append(row['TransactionTo'])


    for row in range(len(nodeIds)):
        print(nodeIds[row])

    print("Finish InputIDs")
    i = 0
    for row in range(len(nodeIds)):

        clusterlabels.append(row)
        i += 1
    print(i)

    """" classifying Inputs"""
    """" Labaling inputs"""
    for row in range(len(nodeIds)):

        for rown in range(len(nodeIds[row])):

            for row1 in range(len(nodeIds)):
                for rown1 in range(len(nodeIds[row1])):
                   if(nodeIds[row][rown]==nodeIds[row1][rown1]):
                      # print("row:  ",row,"row1:  ",row1)
                      if(row < row1):
                          for row2 in clusterlabels:
                              if( clusterlabels[row1]== clusterlabels[row2]):
                                  clusterlabels[row2]=clusterlabels[row]
                          clusterlabels[row1] = clusterlabels[row]

                      else:
                          for row2 in clusterlabels:
                              if (clusterlabels[row] == clusterlabels[row2]):
                                  clusterlabels[row2] = clusterlabels[row1]
                          clusterlabels[row] = clusterlabels[row1]


    print(clusterlabels)
    print("cluster labels:", len(clusterlabels))
    print("NodeIDs:   ", len(nodeIds))



    """" Calculating the number of clusters"""
    clusternum = 1
    labalvlues.append(clusterlabels[0])
    for row in range(len(clusterlabels)):
        flag = True
        for row1 in range(len(labalvlues)):
          if(clusterlabels[row]== labalvlues[row1]):
             flag = False

        if (flag):
            clusternum = + 1
            labalvlues.append(clusterlabels[row])

    print("label values (source Ids in the network):  ", labalvlues, " and the number of clusters is: ", len(labalvlues))




    """" clustering Ids according to their labels"""

    for row in range(len(labalvlues)):
        cluster.append([])
        for row3 in range(len(nodeIds)):
            if (labalvlues[row] == clusterlabels[row3]):
                cluster[row].extend(nodeIds[row3])
    print("clusters:   ", cluster)



    """ Removing duplicating items in cluster"""

    flag = True
    while(flag):
      for row in range(len(cluster)):

        flag= False
        for row1 in range(len(cluster[row])):
            flag= False
            for row2 in range (len(cluster[row])):
                 if(row1 != row2):
                        if(cluster[row][row1] == cluster[row][row2]):
                           del cluster[row][row2]
                           flag=True
                           break
            if(flag):
                break
        if(flag):
            break

    print("cluster:", cluster)




    """" Clustering  Destination Ids """
    for row in range(len(destIds)):
        destclusterlabel.append([])
        for row2 in range(len(destIds[row])):
            flag = True
            for rownum in range(len(labalvlues)):
                for row1 in range(len(cluster[rownum])):

                   if(destIds[row][row2]== cluster[rownum][row1]):
                        destclusterlabel[row].append(labalvlues[rownum])
                        flag = False
            if(flag):
                destclusterlabel.append(destIds[row][row2])

    print("destination labels (destination Ids):  ", destclusterlabel)
