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

WORD_FILE = "words.json"

# 初始化单词文件
def init_words():
    default = {
        "apple": "苹果",
        "banana": "香蕉",
        "cat": "猫",
        "dog": "狗",
        "book": "书",
        "computer": "电脑",
        "student": "学生",
        "teacher": "老师",
        "family": "家庭",
        "friend": "朋友"
    }
    if not os.path.exists(WORD_FILE):
        with open(WORD_FILE, "w", encoding="utf-8") as f:
            json.dump(default, f, ensure_ascii=False, indent=2)

def load_words():
    with open(WORD_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

def save_words(word_dict):
    with open(WORD_FILE, "w", encoding="utf-8") as f:
        json.dump(word_dict, f, ensure_ascii=False, indent=2)


class WordReciteGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("英语单词背诵工具")
        self.root.geometry("600x450")
        self.words = load_words()
        self.word_list = list(self.words.items())
        self.wrong_list = []
        self.test_data = []
        self.test_index = 0
        self.score = 0

        # 顶部菜单区
        frame_top = tk.Frame(root)
        frame_top.pack(pady=10)
        ttk.Button(frame_top, text="浏览单词", command=self.show_all_words).grid(row=0, column=0, padx=5)
        ttk.Button(frame_top, text="英译汉测试", command=self.start_en_cn).grid(row=0, column=1, padx=5)
        ttk.Button(frame_top, text="汉译英测试", command=self.start_cn_en).grid(row=0, column=2, padx=5)
        ttk.Button(frame_top, text="添加新词", command=self.add_word_win).grid(row=0, column=3, padx=5)
        ttk.Button(frame_top, text="查看错题", command=self.show_wrong).grid(row=0, column=4, padx=5)

        # 主显示区域
        self.main_frame = tk.Frame(root, relief=tk.GROOVE, bd=2, width=550, height=300)
        self.main_frame.pack(pady=10, fill=tk.BOTH, expand=True)

        # 底部得分提示
        self.label_tip = tk.Label(root, text="欢迎使用单词背诵程序，请点击上方功能按钮", font=("SimHei", 11))
        self.label_tip.pack(pady=5)

    # 清空主界面
    def clear_main(self):
        for widget in self.main_frame.winfo_children():
            widget.destroy()

    # 1. 浏览所有单词
    def show_all_words(self):
        self.clear_main()
        self.label_tip.config(text=f"全部单词，共 {len(self.word_list)} 个")
        tk.Label(self.main_frame, text="单词库列表", font=("SimHei",14,"bold")).pack(pady=5)
        text_box = tk.Text(self.main_frame, width=60, height=12, font=("SimHei",10))
        text_box.pack(padx=10, pady=5)
        text_box.insert(tk.END, f"{'英文':<12}{'中文释义'}\n" + "-"*30 + "\n")
        for en, cn in self.word_list:
            text_box.insert(tk.END, f"{en:<12}{cn}\n")
        text_box.config(state=tk.DISABLED)

    # 2. 添加单词弹窗
    def add_word_win(self):
        win = tk.Toplevel(self.root)
        win.title("添加新单词")
        win.geometry("320x160")
        tk.Label(win, text="英文单词：").place(x=20, y=20)
        en_entry = tk.Entry(win, width=22)
        en_entry.place(x=90, y=20)
        tk.Label(win, text="中文释义：").place(x=20, y=60)
        cn_entry = tk.Entry(win, width=22)
        cn_entry.place(x=90, y=60)

        def submit():
            en = en_entry.get().strip()
            cn = cn_entry.get().strip()
            if not en or not cn:
                messagebox.showwarning("提示", "单词和释义不能为空！")
                return
            if en in self.words:
                messagebox.showerror("错误", f"单词{en}已存在，释义：{self.words[en]}")
                return
            self.words[en] = cn
            save_words(self.words)
            self.word_list = list(self.words.items())
            messagebox.showinfo("成功", f"添加：{en} - {cn}")
            win.destroy()
        ttk.Button(win, text="确认添加", command=submit).place(x=110, y=100)

    # 3. 英译汉测试初始化
    def start_en_cn(self):
        self.clear_main()
        self.test_data = self.word_list.copy()
        random.shuffle(self.test_data)
        self.test_index = 0
        self.score = 0
        self.wrong_list = []
        self.label_tip.config(text=f"英译汉测试，共{len(self.test_data)}题")
        self.build_en_cn_panel()

    def build_en_cn_panel(self):
        if self.test_index >= len(self.test_data):
            self.show_test_result()
            return
        en, real_cn = self.test_data[self.test_index]
        tk.Label(self.main_frame, text=f"单词：{en}", font=("SimHei",16,"bold")).pack(pady=20)
        tk.Label(self.main_frame, text="请输入中文释义：").pack()
        ans_entry = tk.Entry(self.main_frame, width=30, font=("SimHei",12))
        ans_entry.pack(pady=5)
        ans_entry.focus()

        def check():
            user_ans = ans_entry.get().strip()
            if user_ans == real_cn:
                self.score += 1
                messagebox.showinfo("正确", "回答正确！")
            else:
                self.wrong_list.append((en, real_cn))
                messagebox.showerror("错误", f"正确释义：{real_cn}")
            self.test_index += 1
            self.build_en_cn_panel()
        ttk.Button(self.main_frame, text="提交答案", command=check).pack(pady=10)

    # 4. 汉译英测试初始化
    def start_cn_en(self):
        self.clear_main()
        self.test_data = self.word_list.copy()
        random.shuffle(self.test_data)
        self.test_index = 0
        self.score = 0
        self.wrong_list = []
        self.label_tip.config(text=f"汉译英测试，共{len(self.test_data)}题")
        self.build_cn_en_panel()

    def build_cn_en_panel(self):
        if self.test_index >= len(self.test_data):
            self.show_test_result()
            return
        en, real_cn = self.test_data[self.test_index]
        tk.Label(self.main_frame, text=f"中文：{real_cn}", font=("SimHei",16,"bold")).pack(pady=20)
        tk.Label(self.main_frame, text="请输入英文单词：").pack()
        ans_entry = tk.Entry(self.main_frame, width=30, font=("SimHei",12))
        ans_entry.pack(pady=5)
        ans_entry.focus()

        def check():
            user_ans = ans_entry.get().strip().lower()
            if user_ans == en.lower():
                self.score += 1
                messagebox.showinfo("正确", "回答正确！")
            else:
                self.wrong_list.append((en, real_cn))
                messagebox.showerror("错误", f"正确单词：{en}")
            self.test_index += 1
            self.build_cn_en_panel()
        ttk.Button(self.main_frame, text="提交答案", command=check).pack(pady=10)

    # 测试结束展示成绩
    def show_test_result(self):
        self.clear_main()
        total = len(self.test_data)
        correct = self.score
        wrong_num = len(self.wrong_list)
        rate = correct / total * 100
        tk.Label(self.main_frame, text="测试完成！", font=("SimHei",15,"bold")).pack(pady=15)
        tk.Label(self.main_frame, text=f"总题数：{total}").pack()
        tk.Label(self.main_frame, text=f"答对：{correct}").pack()
        tk.Label(self.main_frame, text=f"错题：{wrong_num}").pack()
        tk.Label(self.main_frame, text=f"正确率：{rate:.1f}%", font=("SimHei",12,"bold")).pack(pady=10)
        self.label_tip.config(text=f"本次测试得分 {correct}/{total}")

    # 查看错题
    def show_wrong(self):
        self.clear_main()
        if not self.wrong_list:
            tk.Label(self.main_frame, text="暂无错题！").pack(pady=30)
            self.label_tip.config(text="当前没有错题记录")
            return
        self.label_tip.config(text=f"本次错题共 {len(self.wrong_list)} 个")
        tk.Label(self.main_frame, text="错题列表", font=("SimHei",14,"bold")).pack(pady=5)
        text_box = tk.Text(self.main_frame, width=60, height=12, font=("SimHei",10))
        text_box.pack(padx=10, pady=5)
        text_box.insert(tk.END, f"{'英文':<12}{'中文释义'}\n" + "-"*30 + "\n")
        for en, cn in self.wrong_list:
            text_box.insert(tk.END, f"{en:<12}{cn}\n")
        text_box.config(state=tk.DISABLED)


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