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

# 单词数据文件路径
WORD_DATA_FILE = "word_data.json"
# 初始单词库（可自行扩展）
INIT_WORDS = [
    {"word": "abandon", "phonetic": "/əˈbændən/", "meaning": "v. 放弃，抛弃；n. 放任，放纵"},
    {"word": "ability", "phonetic": "/əˈbɪləti/", "meaning": "n. 能力，才能；能耐，本领"},
    {"word": "achieve", "phonetic": "/əˈtʃiːv/", "meaning": "v. （凭长期努力）达到（某目标、地位、标准）；完成；成功"},
    {"word": "adapt", "phonetic": "/əˈdæpt/", "meaning": "v. 适应（新环境等）；改编，改写；调整，改变"},
    {"word": "adequate", "phonetic": "/ˈædɪkwət/", "meaning": "adj. 足够的，充足的；合格的，合乎需要的"},
    {"word": "advantage", "phonetic": "/ədˈvɑːntɪdʒ/", "meaning": "n. 有利条件，优势；好处，益处；vt. 有利于，使处于优势"},
    {"word": "affect", "phonetic": "/əˈfekt/", "meaning": "v. 影响；使改变；（感情上）深深打动；使悲伤（或怜悯等）"},
    {"word": "aggressive", "phonetic": "/əˈɡresɪv/", "meaning": "adj. 好斗的，挑衅的；有进取心的；咄咄逼人的"},
    {"word": "allocate", "phonetic": "/ˈæləkeɪt/", "meaning": "v. 分配，分派；划拨（资金等）"},
    {"word": "analyze", "phonetic": "/ˈænəlaɪz/", "meaning": "v. 分析；分解；解析；研究"}
]

class WordReciteApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英语单词背诵助手")
        self.root.geometry("800x600")
        self.root.resizable(False, False)
        
        # 初始化数据
        self.words = []  # 所有单词
        self.unknown_words = []  # 未掌握单词
        self.current_word = None  # 当前显示的单词
        self.card_flipped = False  # 卡片是否翻面
        
        # 加载单词数据
        self.load_word_data()
        
        # 设置字体
        self.font_large = ("微软雅黑", 24, "bold")
        self.font_medium = ("微软雅黑", 16)
        self.font_small = ("微软雅黑", 12)
        
        # 初始化界面
        self.setup_ui()
        
        # 显示第一个单词
        self.show_random_word()

    def load_word_data(self):
        """加载单词数据（优先从文件读取，无则使用初始数据）"""
        if os.path.exists(WORD_DATA_FILE):
            try:
                with open(WORD_DATA_FILE, "r", encoding="utf-8") as f:
                    data = json.load(f)
                    self.words = data["words"]
            except:
                self.words = INIT_WORDS.copy()
        else:
            self.words = INIT_WORDS.copy()
            # 保存初始数据
            self.save_word_data()
        
        # 筛选未掌握单词
        self.unknown_words = [w for w in self.words if not w.get("mastered", False)]

    def save_word_data(self):
        """保存单词数据到文件"""
        data = {"words": self.words}
        with open(WORD_DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=4)

    def setup_ui(self):
        """搭建界面"""
        # 1. 统计信息区域
        stat_frame = ttk.Frame(self.root, padding="10")
        stat_frame.pack(fill=tk.X, padx=10, pady=10)
        
        self.total_label = ttk.Label(stat_frame, text=f"总单词数：{len(self.words)}", font=self.font_medium)
        self.total_label.grid(row=0, column=0, padx=20)
        
        self.mastered_label = ttk.Label(stat_frame, text=f"已掌握：{len(self.words)-len(self.unknown_words)}", font=self.font_medium)
        self.mastered_label.grid(row=0, column=1, padx=20)
        
        self.unknown_label = ttk.Label(stat_frame, text=f"待复习：{len(self.unknown_words)}", font=self.font_medium)
        self.unknown_label.grid(row=0, column=2, padx=20)
        
        # 重置按钮
        reset_btn = ttk.Button(stat_frame, text="重置所有进度", command=self.reset_progress)
        reset_btn.grid(row=0, column=3, padx=20)
        
        # 2. 单词卡片区域（核心）
        card_frame = ttk.Frame(self.root, padding="20", relief=tk.RAISED, borderwidth=2)
        card_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 卡片内容显示区
        self.card_text = tk.Label(
            card_frame, 
            text="点击卡片开始背诵", 
            font=self.font_large,
            wraplength=600,
            justify=tk.CENTER,
            bg="white",
            relief=tk.SOLID,
            borderwidth=1
        )
        self.card_text.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        
        # 绑定卡片点击翻牌事件
        self.card_text.bind("<Button-1>", self.flip_card)
        
        # 3. 操作按钮区域
        btn_frame = ttk.Frame(self.root, padding="10")
        btn_frame.pack(fill=tk.X, padx=20, pady=10)
        
        # 不认识按钮
        unknown_btn = ttk.Button(
            btn_frame, 
            text="不认识", 
            command=lambda: self.mark_word(False),
            width=15
        )
        unknown_btn.pack(side=tk.LEFT, padx=10)
        
        # 认识按钮
        known_btn = ttk.Button(
            btn_frame, 
            text="认识", 
            command=lambda: self.mark_word(True),
            width=15
        )
        known_btn.pack(side=tk.LEFT, padx=10)
        
        # 下一个按钮
        next_btn = ttk.Button(
            btn_frame, 
            text="下一个", 
            command=self.show_random_word,
            width=15
        )
        next_btn.pack(side=tk.LEFT, padx=10)

    def show_random_word(self):
        """显示随机单词（优先未掌握的）"""
        if not self.unknown_words:
            messagebox.showinfo("恭喜", "所有单词都已掌握！🎉")
            # 重置未掌握列表（重新复习）
            self.unknown_words = self.words.copy()
            for w in self.words:
                w["mastered"] = False
            self.save_word_data()
        
        # 随机选择一个未掌握单词
        self.current_word = random.choice(self.unknown_words)
        self.card_flipped = False
        
        # 显示单词正面
        self.card_text.config(
            text=f"{self.current_word['word']}\n{self.current_word['phonetic']}",
            bg="white"
        )
        
        # 更新统计信息
        self.update_stat_labels()

    def flip_card(self, event=None):
        """翻转卡片（显示/隐藏释义）"""
        if not self.current_word:
            return
        
        if self.card_flipped:
            # 翻回正面（单词+音标）
            self.card_text.config(
                text=f"{self.current_word['word']}\n{self.current_word['phonetic']}",
                bg="white"
            )
        else:
            # 翻到背面（释义）
            self.card_text.config(
                text=self.current_word["meaning"],
                bg="#f0f8ff"
            )
        
        self.card_flipped = not self.card_flipped

    def mark_word(self, mastered):
        """标记单词是否掌握"""
        if not self.current_word:
            return
        
        # 更新单词掌握状态
        word_index = next(i for i, w in enumerate(self.words) if w["word"] == self.current_word["word"])
        self.words[word_index]["mastered"] = mastered
        
        # 保存数据
        self.save_word_data()
        
        # 更新未掌握列表
        self.unknown_words = [w for w in self.words if not w.get("mastered", False)]
        
        # 显示下一个单词
        self.show_random_word()

    def update_stat_labels(self):
        """更新统计标签"""
        total = len(self.words)
        mastered = total - len(self.unknown_words)
        unknown = len(self.unknown_words)
        
        self.total_label.config(text=f"总单词数：{total}")
        self.mastered_label.config(text=f"已掌握：{mastered}")
        self.unknown_label.config(text=f"待复习：{unknown}")

    def reset_progress(self):
        """重置所有单词的掌握进度"""
        if messagebox.askyesno("确认", "确定要重置所有单词的背诵进度吗？"):
            for w in self.words:
                w["mastered"] = False
            self.save_word_data()
            self.unknown_words = self.words.copy()
            self.update_stat_labels()
            self.show_random_word()
            messagebox.showinfo("提示", "进度已重置，可重新开始背诵！")

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