#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 23 16:02:49 2021

@author: GIRAUD Delphine


"""
import sys
# Automatic classification RLC RLG RLX

# Input files:
#     argv[1] : *_chr_allTEs_nr_noSSR_join_path.annotStatsPerTE.tab Standard Output REPET TEannot Step 7
#     argv[2] : *_Profiles.gff3 Standard Output REPET CreateGFF3sForClassifFeatures.py (script included in  REPET package)


# Output file:
#     results_autoClassRLX.txt corresponded to argv[1] file with additionnal informations for manual curation



listOtherKnown = ["Dl_Skipper", "ATGP", "TONT", "GYPOT", "TY3-", "TIRANT", "POPCOP", "M2_VM", "LTR-", "GYVIT", "CASTOR", "SZ", "SHACOP", "RLG", "RETROFIT", "POPGY", "GYRAV", "GYPSHAN", "COP", "ATHILA", "ATCOPIA", "TermRepeats", "GmCOPIA", "non-termLTR", "Gypsy", "Copia", "other", "termLTR", "termTIR", "SSR", "TElength", "TE_BLRx", "<", ">", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]

dicoFull = {}

file1 = open(sys.argv[1], "r")

for line in file1:
    if not line.startswith("Seq_name"):
        name = line.split("\t")[0]
        length = int(line.split("\t")[1])
        Wcode = line.split("\t")[11]
        
        if Wcode == "RLG" or Wcode == "RLC" or Wcode == "RLG|RLC" or Wcode == "RLC|RLG" or Wcode == "RLX":
            dicoAN = {}
            listOther = []
            coding = line.split("\t")[13]
            if "profiles" in coding:
                coding = coding.split("profiles: ")[1]
                coding = coding.split(" ")
                for ele in coding :
                    if ele.startswith("GyDB"):
                        ele = ele.split("_")[2]
                        if ele not in dicoAN.keys():
                            dicoAN[ele] = []
                    elif ele.startswith("PF"):
                        ele = ele.split("_")[0] + "_" + ele.split("_")[1]
                        listOther.append(ele)
    
            
            other = line.split("\t")[15]

            if other != "other=(NA)":
                other = other.split(" ")
                for ele in other:
                    if ele.startswith("PF"):
                        listOther.append(ele.split("_")[0] + "_" + ele.split("_")[1])
                    
                    else:
                        dec = False
                        for ele2 in listOtherKnown:
                            if ele.startswith(ele2):
                                dec = True
                                break
                        if dec == False:
                            listOther.append(ele)
            dicoFull[name] = [length, Wcode, dicoAN, listOther]



file1.close()

listECV = ["PF00077.20_RVP", "PF01623.17_Carla", "PF08284.11_RVP", "PF06618.11_DUF1148", "PF01693.16_Cauli", "PF06143.11_Baculo"]
MP = "PF01107.18_MP"
Vsp51 = "PF08700.11_Vps51"
RVP1 = "PF00077.20_RVP"
RVP2 = "PF08284.11_RVP"
listDomKnownET = listECV + ["PF15288.6_zf-CCHC", "PF13975.6_gag-asp","PF13966.6_zf-RVT","PF13917.6_zf-CCHC","PF13696.6_zf-CCHC","PF13683.6_rve","PF09668.10_Asp","PF00078.27_RVT", "PF00385.24_Chromo", "PF14244.6_Retrotran", "PF13961.6_DUF4219", "PF03078.15_ATHILA", "PF02892.15_zf-BED" ,"PF14223.6_Retrotran", "PF00665.26_rve", "PF07727.14_RVT", "PF17919.1_RT", "PF17921.1_Integrase", "PF16588.5_zf-C2H2", "PF00098.23_zf-CCHC", "PF16588.5_zf-C2H2", "PF13976.6_gag_pre-integrs", "PF13650.6_Asp", "PF13976.6_gag", "PPF03732.17_Retrotrans", "PF13456.6_RVT", "PF00075.24_RNase", "PF13456.6_RVT", "PF03732.17_Retrotrans", "PF04195.12_Transposase", "PF17917.1_RT"]

dico_clean = {}

for FLF in dicoFull.keys():
    dicoAN_cur = dicoFull[FLF][2]
    for annot in dicoAN_cur.keys():
        for i in range(0, dicoFull[FLF][0]+1):
            dicoAN_cur[annot].append(0)
    
    
    listDomPF = dicoFull[FLF][3]
    confu = []

    file2 = open(sys.argv[2], "r")

    for line in file2:
        if not line.startswith("#"):
            cons = line.split("\t")[0]
            if cons == FLF:
                line = line.replace("\n", "")
                types = line.split("\t")[2]
                if types == "exon":
                    evalue = line.split("\t")[5]
                    evalue = evalue.replace(',', '.')
                    evalue = float(evalue)
                    
                    if evalue < 0.01:
                        start = int(line.split("\t")[3])
                        end = int(line.split("\t")[4])
                        des = line.split("\t")[8]
                        des = des.split(";")
                        for ele in des:
                            if ele.startswith("Target="):
                                des = ele
                                break
                        des = des.split(" ")[0]
                        des = des.replace("Target=", "")
                        
                        if des.startswith("GyDB"):
                            ET = des.split("_")[2]
                            Dom = des.split("_")[1]
                            
                            if ET in dicoAN_cur.keys():
                                for i in range(start, end+1):
                                    dicoAN_cur[ET][i] = Dom
                            
                        elif des.startswith("PF"):
                            PF = des.split("_")[0] + "_" + des.split("_")[1]  
                            if PF == MP or PF == Vsp51 or PF == RVP1 or PF == RVP2:
                                for i in range(start, end+1):
                                    if "caulimovirus" in dicoAN_cur.keys():
                                        dicoAN_cur["caulimovirus"][i] = PF.split("_")[1]
                                    elif "badnavirus" in dicoAN_cur.keys():
                                        dicoAN_cur["badnavirus"][i] = PF.split("_")[1]
                                    elif "cavemovirus" in dicoAN_cur.keys():
                                        dicoAN_cur["cavemovirus"][i] = PF.split("_")[1]

                            else:
                                if PF not in listDomPF:
                                    listDomPF.append(PF)                                
                            
                        else:
                            print("ERROR Target name\t")
                            print(line)   
                            

    file2.close()

    dico_pattern = {}
    
    for fam in dicoAN_cur.keys():
        pattern = ""
        start = 0
        end = 0
        for i in range(0, dicoFull[FLF][0]+1):
            curDom = dicoAN_cur[fam][i]
            if curDom != 0:
                curDom = curDom.upper()
                if not pattern.endswith(curDom):
                    if pattern == "":
                        start = i
                        pattern = curDom
                    else:
                        pattern = pattern + "-" + curDom
                else:
                    end = i
        dico_pattern[fam] = str(start) + "-" + pattern + "-" + str(end)

    new = False
    listKnown = []
    listNew = []
    for domPF in listDomPF:
        if domPF != MP and domPF != Vsp51 and domPF != RVP1 and domPF != RVP2:
            if domPF not in listDomKnownET :
                new = True
                listNew.append(domPF)
            else:
                listKnown.append(domPF)
    
    outString = "\t"
    
    if len(dico_pattern) == 1:
        for cle in dico_pattern.keys():
            fam = cle        

        cptTiret = dico_pattern[fam].count("-")
        Wcode = dicoFull[FLF][1]
        
        
        if fam == "caulimovirus" or fam == "badnavirus" or fam == "cavemovirus":
            outString = outString + "ERV_"+fam + "\t"
            if "MP-RVP-RT-RNASEH" in dico_pattern[fam] and cptTiret == 5:
            
                outString = outString + "AUTO\tkeep\t"
                if new == False:
                    outString = outString + "OK: " + dico_pattern[fam]
                else:
                    outString = outString + dico_pattern[fam]
            
            elif "MP-Vsp51-RVP-RT-RNASEH" in dico_pattern[fam] and cptTiret == 6:
                outString = outString + "AUTO\tkeep\t"
                if new == False:
                    outString = outString + "OK: " + dico_pattern[fam]
                else:
                    outString = outString + dico_pattern[fam]
                
            else:
                outString = outString + "AUTO\t\t" + dico_pattern[fam]
            
            
        else:
        
            outString = outString + Wcode + "_"+fam + "\t"
            if Wcode == "RLC":
                if  "GAG-AP-INT-RT-RNASEH" in dico_pattern[fam] and cptTiret == 6:
                    outString = outString + "AUTO\tkeep\t"
                    if new == False:
                        outString = outString + "OK: " + dico_pattern[fam]
                    else:
                        outString = outString + dico_pattern[fam]
                else:
                    outString = outString + "AUTO\t\t" + dico_pattern[fam]
    
            elif Wcode == "RLG":           
                if "GAG-AP-RT-RNASEH-INT" in dico_pattern[fam] and cptTiret == 6:
                    outString = outString + "AUTO\tkeep\t"
                    if new == False:
                        outString = outString + "OK: " + dico_pattern[fam]
                    else:
                        outString = outString + dico_pattern[fam]
                else:
                    outString = outString + "AUTO\t\t" + dico_pattern[fam]
    
            elif Wcode == "RLG|RLC" or Wcode == "RLC|RLG" or Wcode == "RLX":
                if  "GAG-AP-INT-RT-RNASEH" in dico_pattern[fam] and cptTiret == 6: #donc RLC
                    outString = outString + "AUTO\tkeep\t"
                    if new == False:
                        outString = outString + "OK: " + dico_pattern[fam]
                    else:
                        outString = outString + dico_pattern[fam]
                elif "GAG-AP-RT-RNASEH-INT" in dico_pattern[fam] and cptTiret == 6: #donc RLG
                    outString = outString + "AUTO\tkeep\t"
                    if new == False:
                        outString = outString + "OK: " + dico_pattern[fam]
                    else:
                        outString = outString + dico_pattern[fam]
    
                else:
                    outString = outString + "AUTO\t\t" + dico_pattern[fam]

    
    elif len(dico_pattern) == 0:
        outString = outString + "\tAUTO\t\t"

 
    else:

        outString = outString + "\tAUTO\t\tchimera "+str(len(dico_pattern))+" element"
        for fam in dico_pattern.keys():
            outString = outString + " " + fam + ":" + dico_pattern[fam] 
     

    if listDomPF != []:
        if listKnown != [] and listNew != []:
            outString = outString + ";" + "NewDomaine:"+ str(listNew) + ";" + "KnownDomaine:"+ str(listKnown)
        elif listKnown == [] and listNew != []:
            outString = outString + ";" + "NewDomaine:"+ str(listNew)
        elif listKnown != [] and listNew == []:
            outString = outString + ";" + "KnownDomaine:"+ str(listKnown)
            
        
    dico_clean[FLF] = outString
    
             
    
    
file1 = open(sys.argv[1], "r")

file1_clean = open("results_autoClassRLX.txt", "w")
file1_clean.write("Seq_name\tlength\tcovg\tclusMCL\tfrags\tfullLgthFrags\tcopies\tfullLgthCopies\tmeanId\tconfused\tWcode_old\tWcode\tnew-classif\tqui\tdecision\tcommentaire\tcovSSR%\tcoding\tstruc\tother\tresB_LTRStruc(nbMatch;bestHit;%id,len;eval)\tresB_SINE_Finder(nbMatch;bestHit;%id,len;eval)\n")
for line in file1:
    if not line.startswith("Seq_name"):
        cons = line.split("\t")[0]
        list_start = line.split("\t")[0:12]
        list_end = line.split("\t")[12:]
        outString2 = ""
        for ele in list_start:
            if outString2 == "":
                outString2 = ele
            else:
                outString2 = outString2 + "\t" + ele
        
        if cons in dico_clean.keys():
            outString2 = outString2 + dico_clean[cons]
        else:
            outString2 = outString2 + "\t\t\t\t"

        for ele in list_end:
            outString2 = outString2 + "\t" + ele

        file1_clean.write(outString2)
    
file1.close()   
file1_clean.close()
