import tkinter as tk
from tkinter import messagebox
import json
import random

# 默认单词库（可替换或扩展）
DEFAULT_WORDS = [
    {"en": "apple", "zh": "苹果"},
    {"en": "book", "zh": "书"},
    {"en": "cat", "zh": "猫"},
    {"en": "dog", "zh": "狗"},
    {"en": "elephant", "zh": "大象"},
    {"en": "flower", "zh": "花"},
    {"en": "garden", "zh": "花园"},
    {"en": "house", "zh": "房子"},
    {"en": "ice", "zh": "冰"},
    {"en": "juice", "zh": "果汁"},
    {"en": "king", "zh": "国王"},
    {"en": "lion", "zh": "狮子"},
    {"en": "moon", "zh": "月亮"},
    {"en": "night", "zh": "夜晚"},
    {"en": "ocean", "zh": "海洋"},
    {"en": "pencil", "zh": "铅笔"},
    {"en": "queen", "zh": "女王"},
    {"en": "river", "zh": "河流"},
    {"en": "sun", "zh": "太阳"},
    {"en": "tree", "zh": "树"}
]

class WordApp:
    def __init__(self, master):
        self.master = master
        master.title("英语单词背诵小程序")
        master.geometry("500x400")
        master.resizable(False, False)

        # 数据
        self.all_words = DEFAULT_WORDS[:]        # 全部单词
        self.learned = []                        # 已学单词（索引）
        self.unknown = []                        # 不认识的单词（索引）
        self.current_idx = 0                     # 当前单词索引（顺序学习）
        self.total = len(self.all_words)
        self.correct_count = 0                   # 认识数
        self.learn_count = 0                     # 已学总数（包括认识+不认识）

        # 复习模式标记
        self.review_mode = False
        self.review_list = []                    # 复习单词索引列表
        self.review_idx = 0

        # 界面组件
        self.create_widgets()

        # 加载第一个单词
        self.show_word()

    def create_widgets(self):
        # 顶部：标题 + 进度
        self.title_label = tk.Label(self.master, text="📚 单词背诵", font=("Arial", 18, "bold"))
        self.title_label.pack(pady=10)

        self.progress_label = tk.Label(self.master, text="", font=("Arial", 12))
        self.progress_label.pack()

        # 单词显示区域
        self.word_frame = tk.Frame(self.master, bg="#f0f0f0", relief="groove", bd=2)
        self.word_frame.pack(pady=20, padx=40, fill="both", expand=True)

        self.en_label = tk.Label(self.word_frame, text="", font=("Arial", 28, "bold"), bg="#f0f0f0")
        self.en_label.pack(pady=30)

        self.zh_label = tk.Label(self.word_frame, text="", font=("Arial", 20), fg="gray", bg="#f0f0f0")
        self.zh_label.pack(pady=10)

        # 按钮区域
        self.btn_frame = tk.Frame(self.master)
        self.btn_frame.pack(pady=20)

        self.known_btn = tk.Button(self.btn_frame, text="✅ 认识", command=self.mark_known,
                                   width=10, bg="lightgreen", font=("Arial", 12))
        self.known_btn.grid(row=0, column=0, padx=10)

        self.unknown_btn = tk.Button(self.btn_frame, text="❌ 不认识", command=self.mark_unknown,
                                     width=10, bg="lightcoral", font=("Arial", 12))
        self.unknown_btn.grid(row=0, column=1, padx=10)

        # 底部：控制按钮
        self.control_frame = tk.Frame(self.master)
        self.control_frame.pack(pady=10)

        self.review_btn = tk.Button(self.control_frame, text="🔁 复习错误单词", command=self.start_review,
                                    font=("Arial", 10))
        self.review_btn.grid(row=0, column=0, padx=5)

        self.reset_btn = tk.Button(self.control_frame, text="🔄 重置", command=self.reset,
                                   font=("Arial", 10))
        self.reset_btn.grid(row=0, column=1, padx=5)

        self.stat_label = tk.Label(self.master, text="统计：已学 0 个，正确率 0%", font=("Arial", 10))
        self.stat_label.pack(pady=5)

        # 提示状态
        self.mode_label = tk.Label(self.master, text="", font=("Arial", 10), fg="blue")
        self.mode_label.pack()

    def show_word(self):
        """显示当前单词（根据模式）"""
        if self.review_mode:
            if self.review_idx < len(self.review_list):
                idx = self.review_list[self.review_idx]
                word = self.all_words[idx]
                self.en_label.config(text=word["en"])
                self.zh_label.config(text="")   # 先不显示中文，点击认识/不认识后再显示
                self.progress_label.config(text=f"复习进度：{self.review_idx+1} / {len(self.review_list)}")
                self.mode_label.config(text="🔁 复习模式")
            else:
                # 复习完毕
                self.review_mode = False
                self.mode_label.config(text="")
                messagebox.showinfo("复习完成", "所有错误单词已复习完毕！")
                self.reset()
        else:
            if self.current_idx < self.total:
                word = self.all_words[self.current_idx]
                self.en_label.config(text=word["en"])
                self.zh_label.config(text="")   # 初始隐藏释义
                self.progress_label.config(text=f"进度：{self.current_idx+1} / {self.total}")
                self.mode_label.config(text="📖 学习模式")
            else:
                # 所有单词学完
                self.en_label.config(text="🎉 全部完成！")
                self.zh_label.config(text="点击「复习错误单词」或「重置」")
                self.progress_label.config(text="")
                self.mode_label.config(text="")

    def mark_known(self):
        """标记为认识"""
        if self.review_mode:
            # 复习模式中，认识则从复习列表移除
            self.review_list.pop(self.review_idx)
            # 不增加学习统计，只更新显示
            if self.review_list:
                self.show_word()
            else:
                messagebox.showinfo("复习完成", "所有错误单词已复习完毕！")
                self.review_mode = False
                self.mode_label.config(text="")
                self.reset()
            self.update_stat()
            return

        if self.current_idx >= self.total:
            return

        idx = self.current_idx
        word = self.all_words[idx]
        self.zh_label.config(text=word["zh"])   # 显示释义

        if idx not in self.learned:
            self.learned.append(idx)
            self.learn_count += 1
            self.correct_count += 1
            # 如果之前在unknown中，移除（因为现在认识了）
            if idx in self.unknown:
                self.unknown.remove(idx)

        self.update_stat()
        self.current_idx += 1
        self.master.after(600, self.show_word)  # 延迟0.6秒自动跳转

    def mark_unknown(self):
        """标记为不认识"""
        if self.review_mode:
            # 复习模式中，不认识则移到末尾继续复习
            idx = self.review_list.pop(self.review_idx)
            self.review_list.append(idx)  # 移到末尾
            self.show_word()
            self.update_stat()
            return

        if self.current_idx >= self.total:
            return

        idx = self.current_idx
        word = self.all_words[idx]
        self.zh_label.config(text=word["zh"])

        if idx not in self.learned:
            self.learned.append(idx)
            self.learn_count += 1
            if idx not in self.unknown:
                self.unknown.append(idx)

        self.update_stat()
        self.current_idx += 1
        self.master.after(600, self.show_word)

    def start_review(self):
        """进入复习模式"""
        if not self.unknown:
            messagebox.showinfo("提示", "没有需要复习的单词！")
            return
        self.review_mode = True
        self.review_list = self.unknown[:]   # 复制
        random.shuffle(self.review_list)      # 打乱顺序
        self.review_idx = 0
        self.show_word()
        self.update_stat()

    def reset(self):
        """重置所有进度"""
        self.review_mode = False
        self.current_idx = 0
        self.learned = []
        self.unknown = []
        self.correct_count = 0
        self.learn_count = 0
        self.review_list = []
        self.review_idx = 0
        self.update_stat()
        self.show_word()
        self.mode_label.config(text="")

    def update_stat(self):
        """更新统计信息"""
        if self.learn_count > 0:
            rate = (self.correct_count / self.learn_count) * 100
            stat_text = f"统计：已学 {self.learn_count} 个，正确率 {rate:.1f}%"
        else:
            stat_text = "统计：已学 0 个，正确率 0%"
        self.stat_label.config(text=stat_text)

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