import re
import excel_parser
from math import floor

testlist2 = ['Практика Информатика доц. Саитов А.В.',
'Практика Информатика доц. Саитов А.В.',
'Лекция Математический анализ доц. Авдушева Н.Е.',
'Лекция Линейная алгебра доц. Игнатова С.Е.',
'Лекция Архитектура ИС доц. Саитов А.В.'
]

def fname(s):
    name = re.findall(r'[А-Яа-я]+\s[A-ZА-Я]\.?[A-ZА-Я]\.?', s)
    return name

def jaro_distance(s1,s2):
    #  Алгоритм сравнения двух строк.
    #  https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
    
    ls1, ls2 = len(s1), len(s2)
    max_distance = floor(max(ls1,ls2)/2)-1
    
    m = [[0 for i in range(ls1)] for k in range(ls2)]
    for i in range(ls2):
        for k in range(ls1):
            if s2[i]==s1[k] and abs(i-k)<=max_distance:
                m[i][k]=1
    #  matching characters
    mc = sum(sum(_) for _ in m)
    if mc==0: return 0
    
    #  main diagonal sum
    ds = 0
    for i in range(min(ls1,ls2)):
        ds += m[i][i]
    
    #  transpositions        
    t = (mc - ds)/2

    jaro = ((mc/ls1)+(mc/ls2)+((mc-t)/mc))/3
    return jaro
    
lessons=[
    [4, 'знаменатель', '10.50-12.25', 'Г-3035', 'Лекция\nРеинжиниринг бизнес-процессов\nдоц. Аминв Х.И.', 'Э-1604'],
    [4, 'числитель', '12.40-14.15', 'Г-2015', 'Практика\nНейронные сети\nдоц. Омельен А.В.', 'Э-1604'],
    [4, 'знаменатель', '12.40-14.15', 'Г-2015', 'Практика\nИнфокоммуникации\nдоц. Колыванев М.О.', 'Э-1604'],
    [4, 'знаменатель', '10.50-12.25', 'Г-3035', 'Лекция\nРеинжиниринг бизнес-процессов\nдоц. Пуха Г.Р.', 'Э-1604'],
    [4, 'знаменатель', '10.50-12.25', 'Г-3035', 'Лекция\nРеинжиниринг бизнес-процессов\nдоц. Колнабев М.О.', 'Э-1604'],
    [4, 'знаменатель', '10.50-12.25', 'Г-3035', 'Лекция\nРеинжиниринг бизнес-процессов\nдоц. Леевкин И.И.', 'Э-1604'],
    [4, 'знаменатель', '10.50-12.25', 'Г-3035', 'Лекция\nРеинжиниринг бизнес-процессов\nдоц. Амельйан А.В.', 'Э-1604'],
    [4, 'числитель', '12.40-14.15', 'Г-2015', 'Практика\nАрхитектура ИС\nдоц. льянов А.А.', 'Э-1604'],
    ]
t_dict = {
    'Аминов Х.И.':[],
    'Андреевский':[],
    'Богатырев В.А.':[],
    'Верзун Н.А.':[],
    'Головкин Ю.Б.':[],
    'Егорова И.В.':[],
    'Емельянов А.А.':[],
    'Карташов П.Н.':[],
    'Колбанев М.О.':[],
    'Коршунов И.Л.':[],
    'Левкин И.М.':[],
    'Омельян А.В.':[],
    'Пуха Г.П.':[],
    'Соколов Р.В.':[],
    'Татарникова Т.М.':[],
    'Суворова О.В.':[],
    'Бритаева О.Х.':[],
    'Никитин С.И.':[],
    'Кондрашков А.В.':[],
    'Федоров Д.Ю.':[],
    'Барабанова М.И.':[],
    'Черток Е.В.':[],
    'Петрас С.В.':[],
    'Васильева И.Н.':[],
    'Михальчук С.А.':[],
    'Чернокнижный Г.М.':[],
    'Морозов С.К.':[],
    'Якимов Ю.М.':[],
    'Стельмашонок Е.В.':[],
    'Андреев А.В.':[],
    'Путькина Е.А.':[],
    'Минаков В.Ф.':[],
    'Карпова В.С.':[],
    'Княев В.И.':[],
    'Глушкова Р.В.':[],
    'Михайлов Б.А.':[],
    'Шишин И.О.':[],
    }

def find_best_match(lesson, t_dict):
    best_jaro = 0
    best_match = None
    name = fname(lesson[4])
    for prep in t_dict.keys():
        for n in name:
            j = jaro_distance(n, prep)
            #  print('Jaro score for {0}: {1}'.format(prep,j))
            if j>best_jaro:
                best_jaro = j
                best_match = prep

    #  В случае, если коэффициент менее 0.75, считаем, что совпадений нет.
    #  Такое значение допускает до 4-5 ошибок в слове
    #  и все равно обеспечивает уверенное распознавание.
    if best_jaro >= 0.75:
        #  замена опечатки в исходном наборе
        #lesson[4] = re.sub(r'[А-Яа-я]+\s[A-ZА-Я]\.[A-ZА-Я]\.',best_match,lesson[4])
        t_dict[best_match].append(lesson)
    else:
        print('Match not found for: \n'+str(l))
'''
# пример использования
for l in lessons:
    find_best_match(l, t_dict)

for t in t_dict.keys(): print('{0}\n{1}\n\n'.format(t,t_dict[t]))
'''
for l in excel_parser.parse_xlsx('3_kurs_0_NEW.xlsx'):
    find_best_match(l, t_dict)
for t in t_dict.keys(): print('{0}\n{1}\n\n'.format(t,t_dict[t]))
