#!/usr/bin/python
# -*- coding: utf-8 -*-

import argparse
parser = argparse.ArgumentParser(description='Программа, сравнивающая результаты двух программ, осуществляющих выравнивание. Последовательно принимает на вход пути к двум файлам с выравниваниями в формате FASTA  и название файла для записи результатов (опционально). Выдает файл с колонками одинаково выравненных позиций, блоками совпадающих позиций, длинами выравниваний и процентами совпадающих позиций для каждого выравнивания. Печатает в поток вывода длину выравниваний, долю одинаково выравненных позиций в каждом из выравниваний и блоки совпадающих позиций. Пример вызова команды:  "python pr12code.py -a1 first_alignment.fasta -a2 second_alignment.fasta -o result_table.csv"')

parser.add_argument("--file1", "-a1", help="Принимает на вход название файла с первым выравниванием.")
parser.add_argument("--file2",  "-a2", help="Принимает на вход название файла со вторым выравниванием.")
parser.add_argument("--output_file",  "-o", help="Принимает на вход название файла для записи результатов. По умолчанию записывает в compared_align.txt.", default="compared_align.txt")

args = parser.parse_args()

alignment1 = args.file1
alignment2 = args.file2
out = args.output_file


def opener(file_name):
  row = ''
  rows = []
  with open(file_name, 'r') as file:
    for line in file:
      if line.startswith('>'):
        if row != '':
          rows.append(row)
          row = ''
      else:
        row += line.strip()
    rows.append(row)
    return rows

rows1 = opener(alignment1)
rows2 = opener(alignment2)

col_size = len(rows1)

cols1 = list()
cols2 = list()
for i in range (len(rows1[0])):
    col = ""
    for j in range (col_size):
        col += rows1[j][i]
    cols1.append(col)

for i in range (len(rows2[0])):
    col = ""
    for j in range (col_size):
        col += rows2[j][i]
    cols2.append(col)

result = {}
for i in range (len(cols1)):
    min_distance = float('inf')
    for k in range (len(cols2)):
      if cols1[i].find('-') == -1:
        if cols1[i] == cols2[k]:
            #print(i, "=", k , "  ", cols1[i], "  ", cols2[k])
            distance = abs(i - k)
            if distance < min_distance:
                min_distance = distance 
                result[i] = k
lst = []
for key, value in result.items():
    lst.append((key + 1, value + 1))
#print("Выравнивание1", "Выравнивание2")
#for elem in lst:  
 #   print(elem[0], elem[1], end = '\n')
block = []
current_block = [lst[0][0]]
for i in range(1, len(lst)):
    if lst[i][0] == lst[i-1][0] + 1:
        current_block.append(lst[i][0])
    else:
        if len(current_block) > 1:
            block.append(f"{current_block[0]} - {current_block[-1]}")
        current_block = [lst[i][0]]

if len(current_block) > 1:
    block.append(f"{current_block[0]} - {current_block[-1]}")

print("Блоки")
for elem in block:
    print(elem)



print("Длинна первого выравнивания: ")
print(len(rows1[0]))
print("Длинна второго выравнивания:")
print(len(rows2[0]))

print("Процент выровненных коллонок 1:")
print((len(lst)/len(rows1[0]))*100, '%')
print("Процент выровненных коллонок 2:")
print((len(lst)/len(rows2[0]))*100, '%')
pr1 = (len(lst)/len(rows1[0]))*100
pr2 = (len(lst)/len(rows2[0]))*100

with open(out, 'w') as output:
    output.write("Длинна первого выравнивания:" +'\n')
    output.write(str(len(rows1[0]))+'\n')
    output.write("Длинна второго выравнивания:"+'\n')
    output.write(str(len(rows2[0]))+'\n')
    output.write("Процент выровненных коллонок 1:"+'\n')
    output.write(str(pr1)+'\n')
    output.write("Процент выровненных коллонок 2:"+'\n')
    output.write(str(pr2)+'\n')
    output.write("Блоки"+'\n')
    for elem in block:
        output.write(elem+'\n')
    output.write("Выравнивание1 Выравнивание2"+'\n')
    output.write('\n'.join(map(str, lst))+'\n')
    output.close()
