import tkinter as tk
from tkinter import ttk, messagebox
import random
import time
import json
import os

# 成绩数据持久化文件
SCORE_FILE = "math_score.json"

class MathTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("限时口算训练器")
        self.root.geometry("600x480")
        self.root.resizable(False, False)

        # 训练核心参数
        self.difficulty = 1  # 1-简单 2-中等 3-困难
        self.limit_time = 60  # 默认限时60秒
        self.start_time = 0
        self.is_running = False

        # 答题数据
        self.question_num = 0  # 总答题数
        self.right_num = 0     # 正确数
        self.wrong_num = 0     # 错误数
        self.current_answer = 0
        self.remain_time = self.limit_time

        # 加载历史成绩
        self.history_score = self.load_score()

        # 构建UI界面
        self.build_ui()

    # 加载历史成绩
    def load_score(self):
        if os.path.exists(SCORE_FILE):
            with open(SCORE_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        return {"best_score": 0, "total_train": 0}

    # 保存成绩
    def save_score(self, score):
        self.history_score["total_train"] += 1
        if score > self.history_score["best_score"]:
            self.history_score["best_score"] = score
        with open(SCORE_FILE, "w", encoding="utf-8") as f:
            json.dump(self.history_score, f, ensure_ascii=False, indent=4)

    # 搭建界面
    def build_ui(self):
        # 顶部信息栏
        info_frame = tk.Frame(self.root)
        info_frame.pack(pady=10, fill="x", padx=20)

        # 难度选择
        tk.Label(info_frame, text="难度：", font=("微软雅黑", 11)).grid(row=0, column=0, padx=5)
        self.diff_var = tk.StringVar(value="简单")
        diff_combo = ttk.Combobox(info_frame, textvariable=self.diff_var, width=8, font=("微软雅黑", 10))
        diff_combo["values"] = ["简单", "中等", "困难"]
        diff_combo.grid(row=0, column=1, padx=5)
        diff_combo.bind("<<ComboboxSelected>>", self.change_diff)

        # 限时设置
        tk.Label(info_frame, text="限时(秒)：", font=("微软雅黑", 11)).grid(row=0, column=2, padx=5)
        self.time_var = tk.StringVar(value="60")
        time_entry = tk.Entry(info_frame, textvariable=self.time_var, width=8, font=("微软雅黑", 10))
        time_entry.grid(row=0, column=3, padx=5)

        # 历史最佳
        tk.Label(info_frame, text=f"最佳成绩：{self.history_score['best_score']}题", font=("微软雅黑", 11, "bold"), fg="#2E8B57").grid(row=0, column=4, padx=10)

        # 倒计时显示
        self.time_label = tk.Label(self.root, text="剩余时间：60秒", font=("微软雅黑", 14, "bold"), fg="#FF4500")
        self.time_label.pack(pady=5)

        # 题目显示区域
        self.q_label = tk.Label(self.root, text="点击开始训练", font=("微软雅黑", 30, "bold"))
        self.q_label.pack(pady=30)

        # 答案输入框
        tk.Label(self.root, text="请输入答案：", font=("微软雅黑", 12)).pack()
        self.ans_entry = tk.Entry(self.root, font=("微软雅黑", 20), width=15, justify="center")
        self.ans_entry.pack(pady=10)
        self.ans_entry.bind("<Return>", self.check_answer)

        # 答题统计
        self.stat_label = tk.Label(self.root, text="答题数：0 | 正确：0 | 错误：0", font=("微软雅黑", 12))
        self.stat_label.pack(pady=15)

        # 功能按钮
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=20)
        ttk.Button(btn_frame, text="开始训练", command=self.start_train, width=12).grid(row=0, column=0, padx=15)
        ttk.Button(btn_frame, text="提交答案", command=self.check_answer, width=12).grid(row=0, column=1, padx=15)
        ttk.Button(btn_frame, text="重置训练", command=self.reset_train, width=12).grid(row=0, column=2, padx=15)

    # 切换难度
    def change_diff(self, event):
        diff = self.diff_var.get()
        if diff == "简单":
            self.difficulty = 1
        elif diff == "中等":
            self.difficulty = 2
        else:
            self.difficulty = 3

    # 生成随机题目
    def create_question(self):
        if self.difficulty == 1:
            # 简单：100以内加减
            a = random.randint(1, 100)
            b = random.randint(1, 100)
            op = random.choice(["+", "-"])
            if op == "-" and a < b:
                a, b = b, a
        elif self.difficulty == 2:
            # 中等：200以内加减、简单乘法
            op = random.choice(["+", "-", "*"])
            if op in ["+", "-"]:
                a = random.randint(1, 200)
                b = random.randint(1, 200)
                if op == "-" and a < b:
                    a, b = b, a
            else:
                a = random.randint(2, 9)
                b = random.randint(2, 9)
        else:
            # 困难：加减乘混合、多位数乘法
            op = random.choice(["+", "-", "*"])
            if op == "+":
                a = random.randint(10, 500)
                b = random.randint(10, 500)
            elif op == "-":
                a = random.randint(10, 500)
                b = random.randint(10, a)
            else:
                a = random.randint(2, 20)
                b = random.randint(2, 20)

        # 计算正确答案
        if op == "+":
            self.current_answer = a + b
        elif op == "-":
            self.current_answer = a - b
        else:
            self.current_answer = a * b

        self.q_label.config(text=f"{a} {op} {b} = ?")

    # 开始训练
    def start_train(self):
        if self.is_running:
            messagebox.showwarning("提示", "训练正在进行中！")
            return
        # 初始化参数
        try:
            self.limit_time = int(self.time_var.get())
            if self.limit_time < 10:
                messagebox.showwarning("提示", "限时不能少于10秒！")
                return
        except:
            messagebox.showerror("错误", "请输入合法的限时数字！")
            return

        self.reset_train()
        self.is_running = True
        self.start_time = time.time()
        self.create_question()
        self.ans_entry.focus()
        self.countdown()

    # 倒计时函数
    def countdown(self):
        if not self.is_running:
            return
        # 计算剩余时间
        used = int(time.time() - self.start_time)
        self.remain_time = self.limit_time - used

        if self.remain_time <= 0:
            self.remain_time = 0
            self.is_running = False
            self.time_label.config(text="时间结束！")
            self.end_train()
            return

        self.time_label.config(text=f"剩余时间：{self.remain_time}秒")
        self.root.after(1000, self.countdown)

    # 校验答案
    def check_answer(self, event=None):
        if not self.is_running:
            messagebox.showwarning("提示", "请先点击开始训练！")
            return

        ans = self.ans_entry.get().strip()
        if not ans.isdigit():
            messagebox.showwarning("提示", "请输入纯数字答案！")
            self.ans_entry.delete(0, tk.END)
            return

        self.question_num += 1
        if int(ans) == self.current_answer:
            self.right_num += 1
        else:
            self.wrong_num += 1

        # 更新统计
        self.update_stat()
        # 清空输入框，生成新题目
        self.ans_entry.delete(0, tk.END)
        self.create_question()

    # 更新统计数据
    def update_stat(self):
        self.stat_label.config(text=f"答题数：{self.question_num} | 正确：{self.right_num} | 错误：{self.wrong_num}")

    # 结束训练，展示成绩
    def end_train(self):
        accuracy = (self.right_num / self.question_num * 100) if self.question_num > 0 else 0
        # 保存最佳成绩（答对题目数）
        self.save_score(self.right_num)
        msg = f"训练结束！\n总答题数：{self.question_num}\n答对：{self.right_num}题\n答错：{self.wrong_num}题\n正确率：{accuracy:.2f}%"
        messagebox.showinfo("训练成绩", msg)
        # 刷新最佳成绩显示
        self.history_score = self.load_score()

    # 重置训练
    def reset_train(self):
        self.is_running = False
        self.question_num = 0
        self.right_num = 0
        self.wrong_num = 0
        self.remain_time = self.limit_time
        self.q_label.config(text="点击开始训练")
        self.time_label.config(text=f"剩余时间：{self.limit_time}秒")
        self.ans_entry.delete(0, tk.END)
        self.update_stat()

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