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

DATA_FILE = "word_progress.json"

class VocabularyApp:
    def __init__(self, root):
        self.root = root
        self.root.title("023. 英语单词背诵小程序")
        self.root.geometry("520x360")
        self.root.resizable(False, False)

        # ===== 单词库（可随意扩充）=====
        self.word_dict = {
            "abandon": "放弃；抛弃",
            "ability": "能力；才能",
            "absorb": "吸收；吸引",
            "abstract": "抽象的；摘要",
            "abundant": "大量的；丰富的",
            "accelerate": "加速；促进",
            "accomplish": "完成；实现",
            "accurate": "准确的；精确的",
            "achieve": "达到；实现",
            "acknowledge": "承认；答谢",
            "acquire": "获得；学到",
            "adapt": "适应；改编",
            "adequate": "足够的；适当的",
            "adjacent": "邻近的；毗连的",
            "adjust": "调整；适应",
            "administrate": "管理；执行",
            "advocate": "提倡；拥护者",
            "alert": "警惕的；警报",
            "allocate": "分配；拨给",
            "alter": "改变；修改",
            "alternative": "替代的；选择",
            "ambiguous": "含糊的；不明确的",
            "amplify": "放大；增强",
            "analogy": "类比；相似",
            "analyze": "分析",
            "ancient": "古代的；古老的",
            "annoy": "烦扰；使生气",
            "anticipate": "预期；期望",
            "apparent": "明显的；表面上的",
            "appeal": "呼吁；上诉；吸引力",
            "apply": "申请；应用",
            "appoint": "任命；约定",
            "appreciate": "欣赏；感激",
            "approach": "接近；方法",
            "appropriate": "适当的；占用",
            "approve": "批准；赞成",
            "approximate": "近似的；大约",
            "arbitrary": "武断的；任意的",
            "argue": "争论；主张",
            "arise": "出现；升起",
            "arouse": "唤醒；引起",
            "ascend": "上升；攀登",
            "assess": "评估；估价",
            "assign": "分配；指派",
            "assist": "帮助；协助",
            "assume": "假定；承担",
            "assure": "向…保证；使确信",
            "attach": "贴上；附加",
            "attain": "达到；获得",
            "attribute": "属性；归因于",
            "authorize": "授权；批准",
            "automatic": "自动的",
            "available": "可用的；有空的",
        }

        self.mastered = set()
        self.session_stats = {"right": 0, "wrong": 0}
        self.current_word = None
        self.load_progress()

        self.build_ui()
        self.next_word()

    # ========== 数据持久化 ==========
    def load_progress(self):
        if os.path.exists(DATA_FILE):
            try:
                with open(DATA_FILE, "r", encoding="utf-8") as f:
                    data = json.load(f)
                    self.mastered = set(data.get("mastered", []))
            except:
                self.mastered = set()

    def save_progress(self):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(
                {"mastered": list(self.mastered)},
                f,
                ensure_ascii=False,
                indent=2
            )

    # ========== UI ==========
    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="📘 英语单词背诵",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # 进度
        self.progress_label = tk.Label(
            self.root, text="", font=("微软雅黑", 10), fg="#666"
        )
        self.progress_label.pack()

        # 单词
        self.word_label = tk.Label(
            self.root, text="",
            font=("Consolas", 28, "bold"), fg="#1a237e"
        )
        self.word_label.pack(pady=15)

        # 释义（先隐藏）
        self.mean_label = tk.Label(
            self.root, text="",
            font=("微软雅黑", 14), fg="#d32f2f", wraplength=400
        )
        self.mean_label.pack(pady=5)

        # 按钮区
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=15)

        tk.Button(
            btn_frame, text="显示释义",
            width=12, bg="#2196F3", fg="white",
            font=("微软雅黑", 10),
            command=self.show_meaning
        ).pack(side=tk.LEFT, padx=5)

        tk.Button(
            btn_frame, text="认识 ✓",
            width=10, bg="#4CAF50", fg="white",
            font=("微软雅黑", 10, "bold"),
            command=lambda: self.judge(True)
        ).pack(side=tk.LEFT, padx=5)

        tk.Button(
            btn_frame, text="不认识 ✗",
            width=10, bg="#f44336", fg="white",
            font=("微软雅黑", 10, "bold"),
            command=lambda: self.judge(False)
        ).pack(side=tk.LEFT, padx=5)

        # 底部统计
        self.stats_label = tk.Label(
            self.root, text="", font=("Consolas", 10), fg="#555"
        )
        self.stats_label.pack(pady=10)

        # 菜单
        menubar = tk.Menu(self.root)
        self.root.config(menu=menubar)
        tool_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="工具", menu=tool_menu)
        tool_menu.add_command(label="重置进度", command=self.reset_progress)
        tool_menu.add_command(label="导出单词表", command=self.export_words)

    # ========== 核心逻辑 ==========
    def next_word(self):
        self.mean_label.config(text="")
        remaining = set(self.word_dict.keys()) - self.mastered

        if not remaining:
            self.word_label.config(text="🎉 全部掌握！")
            self.stats_label.config(text="太棒了，你已经掌握所有单词！")
            return

        # 80% 概率从不认识的词中选
        if random.random() < 0.8 and len(remaining) > 1:
            self.current_word = random.choice(list(remaining))
        else:
            self.current_word = random.choice(list(self.word_dict.keys()))

        self.word_label.config(text=self.current_word)
        self.update_ui()

    def show_meaning(self):
        if self.current_word:
            meaning = self.word_dict.get(self.current_word, "")
            self.mean_label.config(text=meaning)

    def judge(self, known):
        if not self.current_word:
            return

        if known:
            self.mastered.add(self.current_word)
            self.session_stats["right"] += 1
        else:
            self.session_stats["wrong"] += 1

        self.save_progress()
        self.next_word()

    def update_ui(self):
        total = len(self.word_dict)
        done = len(self.mastered)
        rate = done / total * 100 if total else 0

        self.progress_label.config(
            text=f"总单词：{total}   已掌握：{done}   进度：{rate:.1f}%"
        )

        self.stats_label.config(
            text=f"本次：✓ {self.session_stats['right']}    "
                 f"✗ {self.session_stats['wrong']}"
        )

    def reset_progress(self):
        if messagebox.askyesno("确认", "确定要清空所有学习进度吗？"):
            self.mastered.clear()
            self.session_stats = {"right": 0, "wrong": 0}
            self.save_progress()
            self.next_word()

    def export_words(self):
        with open("word_list.txt", "w", encoding="utf-8") as f:
            for w, m in self.word_dict.items():
                f.write(f"{w}  ——  {m}\n")
        messagebox.showinfo("导出成功", "单词表已导出为 word_list.txt")

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