##################################
#                                #
# Last modified 2017/01/22       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math

def run():

    if len(sys.argv) < 4:
        print 'usage: python %s original_file config fields(comma-separated) outputfilename' % sys.argv[0]
        print '\tconfig file format: label <tab> liftOver-unmapped.bed'
        sys.exit(1)
    
    input = sys.argv[1]
    config = sys.argv[2]
    fields = sys.argv[3].split(',')
    IDfields = []
    for ID in fields:
        IDfields.append(int(ID))
    outfilename = sys.argv[4]

    liftOverFiles = []

    lineslist = open(config)
    for line in lineslist:
        if line.startswith('#'):
            continue
        fields = line.strip().split('\t')
        label = fields[0]
        file = fields[1]
        liftOverFiles.append((label,file))

    liftOverFiles.sort()

    RegionsDict = {}

    for (label,file) in liftOverFiles:
        lineslist = open(file)
        for line in lineslist:
            if line.startswith('#'):
                CurrentStatus = line.strip()[1:]
            else:
                fields = line.strip().split('\t')
                regionID = []
                for ID in IDfields:
                    regionID.append(fields[ID])
                regionID = tuple(regionID)
                if RegionsDict.has_key(regionID):
                    pass
                else:
                    RegionsDict[regionID] = {}
                if CurrentStatus == 'Duplicated in new':
                    RegionsDict[regionID][label] = 'Dup'
                elif CurrentStatus == 'Deleted in new':
                    RegionsDict[regionID][label] = 'Del'
                elif CurrentStatus == 'Partially deleted in new':
                    RegionsDict[regionID][label] = 'ParDel'
                elif CurrentStatus == 'Split in new':
                    RegionsDict[regionID][label] = 'Split'
                else:
                    print 'unexpected liftOver score encountered, exiting'
                    print label, file
                    print CurrentStatus
                    sys.exit(1)

    outfile = open(outfilename, 'w')

    outfile.write('#Key to scores:\n')
    outfile.write('#  1 -> successfully lifted over\n')
    outfile.write('#  Del -> Deleted in new\n')
    outfile.write('#  Dup -> Duplicated in new\n')
    outfile.write('#  ParDel -> Partiallly deleted in new\n')
    outfile.write('#  Split -> Split in new\n')

    lineslist = open(input)
    for line in lineslist:
        if line.startswith('#'):
            outline = line.strip()
            for (label,file) in liftOverFiles:
                outline = outline + '\t' + label
            outfile.write(outline + '\n')
            continue
        fields = line.strip().split('\t')
        regionID = []
        for ID in IDfields:
            regionID.append(fields[ID])
        regionID = tuple(regionID)
        outline = line.strip()
        for (label,file) in liftOverFiles:
            if RegionsDict.has_key(regionID) and RegionsDict[regionID].has_key(label):
                outline = outline + '\t' + RegionsDict[regionID][label]
            else:
                outline = outline + '\t' + '1'
        outfile.write(outline + '\n')

    outfile.close()
   
run()
