import tkinter as tk
from tkinter import messagebox
import random

class MultiplicationTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("Тренажёр умножения")
        self.root.geometry("600x500")
        self.root.resizable(False, False)

        self.total_examples = 10
        self.processed = 0
        self.correct = 0
        self.wrong = 0
        self.skipped = 0
        self.current_a = 0
        self.current_b = 0
        self.after_id = None
        self.series_active = False

        self.number_vars = {}
        for n in range(2, 10):
            self.number_vars[n] = tk.BooleanVar(value=True)

        self.label_counter = tk.Label(root, text=f"Решено: {self.processed} из {self.total_examples}", font=("Arial", 14))
        self.label_counter.pack(pady=10)

        frame_checks = tk.Frame(root)
        frame_checks.pack(pady=5)
        self.checkbuttons = []
        for n in range(2, 10):
            cb = tk.Checkbutton(frame_checks, text=str(n), variable=self.number_vars[n],
                                command=lambda num=n: self.on_toggle_number(num))
            cb.pack(side=tk.LEFT, padx=5)
            self.checkbuttons.append(cb)

        self.label_example = tk.Label(root, text="", font=("Arial", 32, "bold"))
        self.label_example.pack(pady=20)

        self.entry_answer = tk.Entry(root, font=("Arial", 20), width=10, justify='center')
        self.entry_answer.pack(pady=10)
        self.entry_answer.bind("<Return>", self.check_answer)

        button_frame = tk.Frame(root)
        button_frame.pack(pady=10)
        self.btn_check = tk.Button(button_frame, text="Проверить", command=self.check_answer, width=12, font=("Arial", 12))
        self.btn_check.pack(side=tk.LEFT, padx=5)
        self.btn_skip = tk.Button(button_frame, text="Пропустить", command=self.skip_question, width=12, font=("Arial", 12))
        self.btn_skip.pack(side=tk.LEFT, padx=5)
        self.btn_finish = tk.Button(button_frame, text="Закончить", command=self.finish_series, width=12, font=("Arial", 12))
        self.btn_finish.pack(side=tk.LEFT, padx=5)
        self.btn_restart = tk.Button(button_frame, text="Заново", command=self.start_new_series, width=12, font=("Arial", 12))
        self.btn_restart.pack(side=tk.LEFT, padx=5)

        self.label_status = tk.Label(root, text="", font=("Arial", 14))
        self.label_status.pack(pady=10)

        self.label_result = tk.Label(root, text="", font=("Arial", 14))
        self.label_result.pack(pady=10)

        self.start_new_series()

    def on_toggle_number(self, num):
        if not any(var.get() for var in self.number_vars.values()):
            self.number_vars[num].set(True)
            messagebox.showwarning("Предупреждение", "Выберите хотя бы одно число")
            return
        if self.series_active and (self.current_a not in [n for n, v in self.number_vars.items() if v.get()]
                                   or self.current_b not in [n for n, v in self.number_vars.items() if v.get()]):
            self.generate_example()

    def generate_example(self):
        selected = [n for n, var in self.number_vars.items() if var.get()]
        self.current_a = random.choice(selected)
        self.current_b = random.choice(selected)
        self.label_example.config(text=f"{self.current_a} × {self.current_b} = ?")
        self.entry_answer.delete(0, tk.END)
        self.label_status.config(text="", fg="black")
        self.entry_answer.focus_set()

    def check_answer(self, event=None):
        if not self.series_active:
            return
        user_input = self.entry_answer.get().strip()
        if user_input == "":
            self.label_status.config(text="Введите число", fg="red")
            self.entry_answer.focus_set()
            return
        try:
            user_number = int(user_input)
        except ValueError:
            self.label_status.config(text="Введите число", fg="red")
            self.entry_answer.focus_set()
            return

        correct_answer = self.current_a * self.current_b
        if user_number == correct_answer:
            self.correct += 1
            self.processed += 1
            self.update_counter()
            self.label_status.config(text="Правильно!", fg="green")
            self.entry_answer.delete(0, tk.END)
            if self.processed >= self.total_examples:
                self.show_result()
            else:
                self.generate_example()
        else:
            self.wrong += 1
            self.processed += 1
            self.update_counter()
            self.label_status.config(text=f"Неверно, правильно: {correct_answer}", fg="red")
            self.entry_answer.delete(0, tk.END)
            self.disable_input(True)
            self.after_id = self.root.after(2000, self.after_wrong_delay)

    def skip_question(self):
        if not self.series_active:
            return
        self.skipped += 1
        self.processed += 1
        self.update_counter()
        correct_answer = self.current_a * self.current_b
        self.label_status.config(text=f"Пропущено. Правильно: {correct_answer}", fg="red")
        self.entry_answer.delete(0, tk.END)
        self.disable_input(True)
        self.after_id = self.root.after(2000, self.after_wrong_delay)

    def finish_series(self):
        if not self.series_active:
            return
        if self.after_id is not None:
            self.root.after_cancel(self.after_id)
            self.after_id = None
        self.show_result()

    def after_wrong_delay(self):
        self.after_id = None
        if self.processed >= self.total_examples:
            self.show_result()
        else:
            self.generate_example()
            self.disable_input(False)

    def show_result(self):
        self.series_active = False
        self.disable_input(True)
        unanswered = self.total_examples - self.processed
        result_text = (f"Верных: {self.correct}\n"
                       f"Неверных: {self.wrong}\n"
                       f"Пропущенных: {self.skipped}\n"
                       f"Не решённых: {unanswered} из {self.total_examples}")
        self.label_result.config(text=result_text)
        self.label_status.config(text="Все примеры решены", fg="blue")
        self.btn_restart.config(state=tk.NORMAL)
        self.entry_answer.config(state=tk.DISABLED)

    def start_new_series(self):
        if self.after_id is not None:
            self.root.after_cancel(self.after_id)
            self.after_id = None
        self.processed = 0
        self.correct = 0
        self.wrong = 0
        self.skipped = 0
        self.series_active = True
        self.update_counter()
        self.label_result.config(text="")
        self.disable_input(False)
        self.entry_answer.config(state=tk.NORMAL)
        self.generate_example()

    def update_counter(self):
        self.label_counter.config(text=f"Решено: {self.processed} из {self.total_examples}")

    def disable_input(self, disabled):
        state = tk.DISABLED if disabled else tk.NORMAL
        self.btn_check.config(state=state)
        self.btn_skip.config(state=state)
        self.btn_finish.config(state=state)
        self.entry_answer.config(state=state)
        for cb in self.checkbuttons:
            cb.config(state=state)
        if not disabled:
            self.btn_restart.config(state=tk.NORMAL)
        else:
            self.btn_restart.config(state=tk.NORMAL)

if __name__ == "__main__":
    root = tk.Tk()
    app = MultiplicationTrainer(root)
    root.mainloop()