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

# 单词文件保存路径
WORD_FILE = "words.json"

# 默认词库
default_words = [
    {"word": "apple", "mean": "苹果", "known": False},
    {"word": "banana", "mean": "香蕉", "known": False},
    {"word": "computer", "mean": "电脑", "known": False},
    {"word": "happy", "mean": "开心的", "known": False},
    {"word": "sunshine", "mean": "阳光", "known": False},
    {"word": "dream", "mean": "梦想", "known": False},
]


class WordStudyApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英语单词背诵工具")
        self.root.geometry("520x380")
        self.root.resizable(False, False)

        # 加载单词
        self.load_words()
        self.index = 0
        self.show_meaning = tk.BooleanVar(value=False)

        self.build_ui()
        self.refresh_view()

    def load_words(self):
        if os.path.exists(WORD_FILE):
            with open(WORD_FILE, "r", encoding="utf-8") as f:
                self.word_list = json.load(f)
        else:
            self.word_list = default_words
            self.save_words()

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

    def build_ui(self):
        # 顶部进度文字
        self.label_info = ttk.Label(self.root, text="", font=("微软雅黑",11))
        self.label_info.pack(pady=8)

        # 单词标签
        self.label_word = ttk.Label(self.root, text="", font=("微软雅黑",26,"bold"))
        self.label_word.pack(pady=15)

        # 释义标签
        self.label_mean = ttk.Label(self.root, text="", font=("微软雅黑",16), foreground="#2266cc")
        self.label_mean.pack(pady=8)

        # 按钮区域1
        frame1 = ttk.Frame(self.root)
        frame1.pack(pady=10)

        ttk.Button(frame1, text="上一个", command=self.prev_word).grid(row=0,column=0,padx=6)
        ttk.Button(frame1, text="下一个", command=self.next_word).grid(row=0,column=1,padx=6)
        ttk.Button(frame1, text="显示/隐藏释义", command=self.toggle_mean).grid(row=0,column=2,padx=6)
        ttk.Button(frame1, text="已经记住", command=self.mark_known).grid(row=0,column=3,padx=6)

        # 按钮区域2 添加单词、重置
        frame2 = ttk.Frame(self.root)
        frame2.pack(pady=5)
        ttk.Button(frame2, text="新增单词", command=self.add_word_win).grid(row=0,column=0,padx=6)
        ttk.Button(frame2, text="重置全部记忆标记", command=self.reset_mark).grid(row=0,column=1,padx=6)

    def refresh_view(self):
        total = len(self.word_list)
        known_count = sum(w["known"] for w in self.word_list)
        self.label_info.config(text=f"进度：{self.index+1}/{total}  已熟记:{known_count}个")
        current = self.word_list[self.index]
        self.label_word.config(text=current["word"])
        if self.show_meaning.get():
            self.label_mean.config(text=current["mean"])
        else:
            self.label_mean.config(text="??? 点击按钮查看释义")

    def next_word(self):
        if self.index < len(self.word_list)-1:
            self.index +=1
            self.refresh_view()

    def prev_word(self):
        if self.index > 0:
            self.index -=1
            self.refresh_view()

    def toggle_mean(self):
        self.show_meaning.set(not self.show_meaning.get())
        self.refresh_view()

    def mark_known(self):
        self.word_list[self.index]["known"] = True
        self.save_words()
        self.refresh_view()
        messagebox.showinfo("提示", f"「{self.word_list[self.index]['word']}」标记为已记住！")

    def reset_mark(self):
        for w in self.word_list:
            w["known"] = False
        self.save_words()
        self.refresh_view()
        messagebox.showinfo("提示", "所有熟记标记已经清空，可以重新背诵")

    def add_word_win(self):
        win = tk.Toplevel(self.root)
        win.title("添加新单词")
        win.geometry("320x160")
        win.resizable(False,False)

        ttk.Label(win,text="英文单词：").pack(pady=4)
        entry_w = ttk.Entry(win,width=30)
        entry_w.pack()

        ttk.Label(win,text="中文释义：").pack(pady=4)
        entry_m = ttk.Entry(win,width=30)
        entry_m.pack()

        def confirm():
            wd = entry_w.get().strip()
            mn = entry_m.get().strip()
            if wd and mn:
                self.word_list.append({"word":wd,"mean":mn,"known":False})
                self.save_words()
                messagebox.showinfo("成功",f"添加单词:{wd}")
                win.destroy()
                self.refresh_view()
            else:
                messagebox.showerror("错误","单词和释义不能为空")

        ttk.Button(win,text="确认添加",command=confirm).pack(pady=12)


if __name__ == "__main__":
    main_window = tk.Tk()
    app = WordStudyApp(main_window)
    main_window.mainloop()
