import re
from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
from random import randint
import pickle
import time

class Dict():
    def __init__(self):
        self.mydict = {}
        self.currentdict = []
        self.current_word = ''
        self.current_answer = []
        self.life = 0
        self.start_time = 0
        self.finish_time = 0
        self.my_time = 0
        
    def add_item(self,event, enword,ruwords,entry1,entry2):
        en = enword.strip()
        if re.match(r'\b[a-z]+\b', enword) and re.match(r'^([А-Яа-я]+\s*,{1}\s*)+([А-Яа-яё]+){1}$|^[А-Яа-яё]+$',ruwords):
            ru = [i.strip() for i in ruwords.split(',')]
            it = {en : ru}
            self.mydict.update(it)
            entry1.delete(0,END)
            entry2.delete(0,END)

    def save_dict(self):
        name = asksaveasfilename()
        f = open(name, 'wb')
        pickle.dump(self.mydict,f)
        self.mydict = {}
        f.close()

    def open_dict(self):
        try:
            name = askopenfilename()
            f = open(name,'rb')
            self.mydict = pickle.load(f)
            self.currentdict = [i for i in self.mydict]
            self.life = round(len(self.mydict) * 0.25)+1
            if mtime.get() == 0:
                self.my_time = len(self.mydict) * 9000
            else:
                self.my_time = len(self.mydict) * mtime.get()
            f.close()
        except: pass

    def get_answer(self,event):
        self.current_answer = ruword.get()
        if len(self.current_answer) == 0:
            pass
        else:
            try:
                right_answer = self.mydict.get(self.current_word)
                if self.current_answer in right_answer:
                    showrighta.configure(text='')
                    showrightb.configure(text='')
                    ruword.delete(0,END)
                    result.configure(text= 'Верно',fg='green')
                    word = self.currentdict.pop(randint(0,len(self.currentdict)-1))
                    self.current_word = word
                    enword.delete(0,END)
                    enword.insert(END,word)
                else:
                    self.life-=1
                    ruword.delete(0,END)
                    result.configure(text= 'Неправильно.',fg='red')
                    showrighta.configure(text='Возможные варианты: ')
                    showrightb.configure(text= ', '.join(self.mydict.get(self.current_word)).strip(', '))
                    word = self.currentdict.pop(randint(0,len(self.currentdict)-1))
                    self.current_word = word
                    enword.delete(0,END)
                    enword.insert(END,word)
            except ValueError:
                self.finish_time = round(time.time())
                ruword.delete(0,END)
                ruword.insert(END, 'Конец словаря')
                if self.life > 0 and self.my_time - (self.finish_time - self.start_time) > 0:
                    finaltext.configure(text= 'Отлично! Словарь успешно закреплён.',fg='gold',bg='gray')
                else:
                    finaltext.configure(text= 'Вы недостаточно хорошо знаете эти слова.\n Попробуйте снова в другой раз.',fg='blue',bg='red')
                bstudy.configure(state='normal')
                result.configure(text='')
                showrighta.configure(text='')
                showrightb.configure(text='')
                        
    def start(self):
        finaltext.configure(text= '')
        if len(self.currentdict) < 1:
            self.currentdict = [i for i in self.mydict]
        word = self.currentdict.pop(randint(0,len(self.currentdict)-1))
        self.current_word = word
        ruword.delete(0,END)
        enword.delete(0,END)
        enword.insert(END,word)
        bstudy.configure(state='disabled')
        self.start_time = round(time.time())

    def restart(self):
        self.start_time = 0
        self.finish_time = 0
        self.currentdict = [i for i in self.mydict]
        self.life = round(len(self.mydict) * 0.25)+1
        self.start()
        
    def create_new(self):
        self.mydict = {}
        newin = Toplevel(mywin)
        newin.title('Создание словаря')
        newin.geometry('600x240')
        newin.resizable(0,0)
        enterenword = Entry(newin,width=36)
        enterruswords = Entry(newin,width=36)
        en = Label(newin,text = 'English word:\n (for example: "script")',font=12)
        ru = Label(newin, text = 'Русский(е) эквивалент(ы):\n (например: "сценарий, почерк,\nподлинник")', font = 12)
        enterruswords.bind('<Return>', lambda event='<Return>' : self.add_item('<Return>', enterenword.get(), enterruswords.get(),enterenword,enterruswords))
        en.place(x=5,y=10)
        enterenword.place(x=255,y=10)
        ru.place(x=5,y=60)
        enterruswords.place(x=255,y=60)
        saveme = Button(newin,text='Сохранить',bg='#9ACEEB',height=4,width=25,command=d.save_dict)
        add_it = Button(newin,text='Добавить',bg='#9ACEEB',height=2,width=8, command= lambda event='<Button-1>' : self.add_item('<Button-1>', enterenword.get(), enterruswords.get(),enterenword,enterruswords))
        add_it.place(x=500,y=50)
        saveme.place(x=200,y=160)

    def myhelp():
        showinfo(title='qwertyнекуцй',
                 message='''Кнопка "Повторить" позволяет ПОВТОРНО упражняться  с одним и тем же словарём.\n
Открыв новый словарь, используйте кнопку "Go!"\n
Указав кол-во секунд, вы ограничите допустимое время тренировки кол-вом секунд, умноженным на кол-во слов в вашем словаре\n
Создавая словарь, вводите слова без кавычек, разделяя русские эквиваленты английского слова запятыми.\n
Добавляйте каждую новую позицию в словарь, испольуя кнопку "Добавить", после чего сохраните файл.''')
d = Dict()
#
mywin = Tk()
mywin.resizable(0,0)
mywin.geometry('900x450')
mywin.title('en-ru trainer')
mtime = IntVar()
chtime = [2,4,6,8,10]
choosetime = OptionMenu(mywin, mtime, *chtime)
result = Label(mywin,text='',font = 16)
showrighta = Label(mywin, text='',font=14, fg='orange')
showrightb = Label(mywin, text='',font=16, fg='green')

timetext = Label(text='Тренировка на время выключена\n(включить, указав кол-во секунд)')
enword = Entry(mywin,width=40)
ruword = Entry(mywin,width=40)
bstudy = Button(mywin,text='Go!',command = d.start,height=5,width=12,bg='#ED760E',fg='white',font=18)
bopenfile = Button(text='Открыть словарь...', command= d.open_dict,height=4,width=16,bg='#9ACEEB')
bcreatenewdict = Button(text='Создать новый словарь...',command= d.create_new,bg='#9ACEEB')
restart = Button(text='Повторить', command=d.restart,height=4,width=16,bg='#9ACEEB')
ruword.bind('<Return>',d.get_answer)
finaltext = Label(text='',font = 14)
enblahblah = Label(text='Английское слово: ',font=14)
rublahblah = Label(text='Перевод: ',font=14)
mymenu = Menu(mywin)
mywin.config(menu=mymenu)
mmain = Menu(mymenu)
mymenu.add_cascade(label='Справка',menu=mmain)
mmain.add_command(label='Help', command=Dict.myhelp)
enblahblah.place(x=12,y=100)
rublahblah.place(x=12,y=150)
enword.place(x=200,y=100)
ruword.place(x=200,y=150)
bstudy.place(x=365,y=200)
bopenfile.place(x=700,y=50)
restart.place(x=700,y=160)
timetext.place(x=680,y=270)
choosetime.place(x=755,y=310)
result.place(x=300,y=35)
showrighta.place(x=80,y=70)
showrightb.place(x= 250,y=70)
finaltext.place(x=110, y=330)
bcreatenewdict.place(x=30,y=388)
#
mywin = mainloop()
