from Bio import AlignIO
from Bio import Seq
import re
import subprocess


with open("myfile.fasta") as f:
    lines = f.readlines()

sequences = {}
current_seq_name = ""
for line in lines:
    if line.startswith(">"): 
        current_seq_name = line.strip()[1:] 
        sequences[current_seq_name] = ""
    else: 
        sequences[current_seq_name] += line.strip()


with open("sequences_temp.fasta", "w") as f:
    for seq_name, seq in sequences.items():
        f.write(">{}\n{}\n".format(seq_name, seq))


subprocess.run(["c:\\clustal_omega\\clustalo.exe", "-i", "myfile.fasta", "-o", "alignement.clustalo", "--force", "--outfmt=clu"])




filename = "myfile.fasta"

filename_enzyme = "fichier_Enzymes.txt"
keys = ["key1", "key2", "key3", "key4"]
separator = ";"
my_dict_list = []   

with open(filename_enzyme, "r") as file:
   
  for line in file:
        parts = line.strip().split(separator)
        my_dict = {keys[i]: parts[i].strip() for i in range(len(keys))}
        my_dict_list.append(my_dict)


alignment = AlignIO.read(filename, "fasta")
my_dict_seq_id = {}
sequence =""
i = 1
k = 0


for record in alignment:
    
    seq_id = record.id
    seq_obj = record.seq.upper()
    
    k=k+1
    sequence += seq_obj
    if not seq_id in  my_dict_seq_id:
       my_dict_seq_id[seq_id] = seq_obj
    else:
       pass
       

out_file_final_forward = open('out_file_final_forward.txt', 'w')


for cle, value in my_dict_seq_id.items():
        
    print(f" Pour la sequence {cle} de sequence : \n{value} ", file=out_file_final_forward)

    
    for my_dict in my_dict_list:
         enzyme_name = str(my_dict[keys[0]].strip())
        
         enzyme_sequence_forward = str(my_dict[keys[2]].strip())
        
         enzyme_forward =  re.compile(enzyme_sequence_forward)
         
         
         cutsite_forward = []
         # Trouver les sites de coupure pour les enzymes de restrictions
         cutsites_forward = [match.start() + 1 for match in  enzyme_forward.finditer(str(value))]
         cutsites_reverse = [match.end() + 1 for match in  enzyme_reverse.finditer(str(value))]
         
         if cutsites_forward != []:
            print(f"l'enzyme {enzyme_name} de sequence {enzyme_sequence_forward} coupe à la position : {cutsites_forward}", file=out_file_final_forward)
         if cutsites_reverse != []:
            print(f"l'enzyme {enzyme_name} de sequence {enzyme_sequence_forward} coupe à la position : {cutsites_reverse}", file=out_file_final_reverse) 

    print ("**********************************************************************", file=out_file_final_forward)
   
    
    
print ("**fin**", file=out_file_final_forward)
out_file_final_forward.close()



def summury_info(file_out,file_sum):
    
    sequence_name = ""
    sequences_enzymes = {}

    with open(file_out) as f1:
            
       
        lines = f1.readlines()
        i = 0
        
        while i < len(lines):
            
            if lines[i].startswith("**fin**"):
                break
            if lines[i].startswith("**"):
                i+=1
            
            sequence_name = lines[i].strip()
            sequence_name = sequence_name[5:]
            sequence_name = sequence_name[:-14]
            i += 1
           
           
            sequence_nucleotide = lines[i].strip()
            i += 1
            enzyme_name=[]
            
            while i < len(lines) and not lines[i].startswith("*"):
                  match = re.search(r"l'enzyme (\w+)", lines[i].strip())
                  if match:
                  
                     enzyme_name.append(match .group(1))
                     i += 1
            sequences_enzymes[sequence_name]= enzyme_name
            i+= 1
            
    file_summury = open (file_sum, "w")   
    valeurs_uniques = {}


    for cle, valeurs in sequences_enzymes.items():
       
       for valeur in valeurs:
          
            if valeur in valeurs_uniques:
                
               valeurs_uniques[valeur].append(cle)
            else:
               
               valeurs_uniques[valeur] = [cle]
     
   
    for valeur, cles in valeurs_uniques.items():
        if len(cles) == 1:
           print(f"enzyme {valeur} cut only :\n{cles[0]}\n", file=file_summury)
           print("------------------------------------------------------------------------------------", file=file_summury)
        elif len(cles) == 4:
             pass
        else:
          cles_str = "\n".join(cles)
          print(f"enzyme {valeur} cut sequence :\n{cles_str}", file=file_summury)   
          print("------------------------------------------------------------------------------------", file=file_summury)

    

file_forward = "out_file_final_forward.txt"
file_summury_forward = "Summury_Results_forward.txt" 
summury_info(file_forward, file_summury_forward)
