#coding=utf8
"""
# Author: Denghui Liu
# Contact: liudenghui@gmail.com
# Created Time : Wed 08 Apr 2015 10:27:18 PM CST
# Last Modified :
# File Name: testFeedBackLoop.py
# Description:

"""
from itertools import permutations
import sys
if len(sys.argv) != 6:
        print ("Usage:python %s inputEdgeAttribution inputNodeAttribution outputNode outputNetwork outputEdgeAttribution"%sys.argv[0])
        raise SystemExit(1)
outNode=open(sys.argv[3],'w')
inNode=open(sys.argv[2])
dictNode={}
outNode.write(inNode.readline())
for line in inNode:
        arr=line.strip().split()
        dictNode[arr[0]]=arr[1]

outNet=open(sys.argv[4],'w')
outNet.write("Gene1"+"\t"+"Gene2"+"\n")
outEdge=open(sys.argv[5],'w')
dictEdge={}
dictNP={}
inEdge=open(sys.argv[1])
outEdge.write(inEdge.readline())
for line in inEdge:
        arr=line.strip().split()
        #print arr
        if arr[0] in dictEdge:
                #print "aa"+arr[0]
                #print dictEdge[arr[0]]
                (dictEdge[arr[0]]).append(arr[2])
                #print dictEdge[arr[0]]
        else:
                dictEdge[arr[0]]=[arr[2]]
        if arr[2] in dictEdge:
                dictEdge[arr[2]].append(arr[0])
        else:
                dictEdge[arr[2]]=[arr[0]]
        dictNP[(arr[0],arr[2])]=arr[3]

keys=sorted(dictEdge.keys())
selectedNode=set()
outEdgeSet=set()
outNetSet=set()
NumOfFeedbackLoop=0
i=0
while i < len(keys)-1:
        key = keys[i]
        firstDegree=dictEdge[key]
        del dictEdge[key]
        for degree1 in firstDegree:
                if degree1 in dictEdge:
                        secondDegree = dictEdge[degree1]
                        for degree2 in secondDegree:
                                if degree2 in dictEdge:
                                        if key in dictEdge[degree2]:
                                                keysPermutations=list(permutations([key,degree1,degree2],2))
                                                NumOfNegative=0
                                                for tempKey in keysPermutations:

                                                        if tempKey in dictNP and dictNP[tempKey]=="-":
                                                                NumOfNegative+=1
                                                if NumOfNegative > 0:
                                                        NumOfFeedbackLoop+=1
                                                        for tempKey in keysPermutations:
                                                                if tempKey in dictNP:
                                                                        for node in tempKey:
                                                                                selectedNode.add(node)
                                                                        outEdgeSet.add(tempKey[0]+" "+"(pp)"+" "+tempKey[1]+"\t"+dictNP[tempKey]+"\n")
                                                                        outNetSet.add(tempKey[0]+"\t"+tempKey[1]+"\n")

        i+=1

for outLine in selectedNode:
        outNode.write(outLine+"\t"+dictNode[outLine]+"\n")
for outLine in outEdgeSet:
        outEdge.write(outLine)
for outLine in outNetSet:
        outNet.write(outLine)
print "Number Of Feedback loops: "+str(NumOfFeedbackLoop)
