import tkinter as tk
from tkinter import ttk
import time
import random

# --- 1. 练习文本库 ---
SAMPLE_TEXTS = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is a high-level, interpreted, general-purpose programming language.",
    "Practice makes perfect when it comes to coding and typing.",
    "Success is not final, failure is not fatal: it is the courage to continue that counts.",
    "Stay hungry, stay foolish, and keep moving forward every single day.",
    "To be or not to be, that is the question.",
    "Artificial intelligence is the future of modern technology development."
]

class TypingTutor:
    def __init__(self, root):
        self.root = root
        self.root.title("打字速度测试软件")
        self.root.geometry("800x550")
        self.root.configure(bg="#f0f2f5")

        # 游戏状态变量
        self.target_text = ""
        self.start_time = None
        self.running = False

        # --- 2. 界面布局 ---
        # 标题
        title_label = tk.Label(root, text="打字练习与速度测试", font=("微软雅黑", 24, "bold"), bg="#f0f2f5", fg="#1a73e8")
        title_label.pack(pady=20)

        # 统计栏 (速度、准确率、时间)
        stats_frame = tk.Frame(root, bg="#f0f2f5")
        stats_frame.pack(pady=10)

        self.wpm_label = tk.Label(stats_frame, text="速度: 0 WPM", font=("微软雅黑", 12), bg="#f0f2f5")
        self.wpm_label.grid(row=0, column=0, padx=20)

        self.acc_label = tk.Label(stats_frame, text="准确率: 100%", font=("微软雅黑", 12), bg="#f0f2f5")
        self.acc_label.grid(row=0, column=1, padx=20)

        self.time_label = tk.Label(stats_frame, text="用时: 0s", font=("微软雅黑", 12), bg="#f0f2f5")
        self.time_label.grid(row=0, column=2, padx=20)

        # 目标文本显示区 (使用 Text 控件以便实现高亮)
        self.text_display = tk.Text(root, font=("Consolas", 18), height=4, width=50, padx=20, pady=20, wrap="word")
        self.text_display.pack(pady=20)
        self.text_display.config(state="disabled") # 禁止手动编辑

        # 输入框
        self.entry = tk.Entry(root, font=("Consolas", 18), width=50, bd=2, relief="flat")
        self.entry.pack(pady=10, ipady=10)
        self.entry.bind("<KeyRelease>", self.check_typing) # 绑定按键释放事件

        # 按钮控制
        btn_frame = tk.Frame(root, bg="#f0f2f5")
        btn_frame.pack(pady=20)

        self.start_btn = ttk.Button(btn_frame, text="开始/重置", command=self.reset_game)
        self.start_btn.pack()

        # 初始化显示
        self.reset_game()

    # --- 3. 核心逻辑 ---

    def reset_game(self):
        """重置游戏状态"""
        self.target_text = random.choice(SAMPLE_TEXTS)
        self.running = False
        self.start_time = None
        
        # 重置界面
        self.entry.delete(0, tk.END)
        self.entry.config(state="normal")
        self.entry.focus()
        
        self.wpm_label.config(text="速度: 0 WPM")
        self.acc_label.config(text="准确率: 100%")
        self.time_label.config(text="用时: 0s")
        
        self.update_display("")

    def update_display(self, current_input):
        """更新文本显示区，实现高亮效果"""
        self.text_display.config(state="normal")
        self.text_display.delete("1.0", tk.END)
        self.text_display.insert("1.0", self.target_text)
        
        # 默认标签配置
        self.text_display.tag_config("correct", foreground="green")
        self.text_display.tag_config("wrong", foreground="red", background="#ffcccc")

        for i in range(len(current_input)):
            if i >= len(self.target_text):
                break
            
            tag = "correct" if current_input[i] == self.target_text[i] else "wrong"
            # 计算字符在 Text 控件中的位置 (行.列)
            pos = f"1.{i}"
            next_pos = f"1.{i+1}"
            self.text_display.tag_add(tag, pos, next_pos)
            
        self.text_display.config(state="disabled")

    def check_typing(self, event):
        """每输入一个字符时触发的逻辑"""
        if not self.running and self.entry.get() != "":
            self.start_time = time.time()
            self.running = True

        current_input = self.entry.get()
        self.update_display(current_input)

        # 计算实时数据
        if self.running:
            elapsed_time = max(time.time() - self.start_time, 1)
            self.time_label.config(text=f"用时: {int(elapsed_time)}s")
            
            # 计算准确率
            correct_chars = 0
            for i in range(min(len(current_input), len(self.target_text))):
                if current_input[i] == self.target_text[i]:
                    correct_chars += 1
            
            acc = (correct_chars / len(current_input) * 100) if len(current_input) > 0 else 100
            self.acc_label.config(text=f"准确率: {int(acc)}%")

            # 计算 WPM (单词数 = 字符数 / 5)
            wpm = (len(current_input) / 5) / (elapsed_time / 60)
            self.wpm_label.config(text=f"速度: {int(wpm)} WPM")

        # 检查是否完成
        if current_input == self.target_text:
            self.running = False
            self.entry.config(state="disabled")
            final_time = int(time.time() - self.start_time)
            tk.messagebox.showinfo("练习完成", f"恭喜！\n最终速度: {self.wpm_label.cget('text')}\n总用时: {final_time}秒")

# --- 4. 启动程序 ---
if __name__ == "__main__":
    root = tk.Tk()
    app = TypingTutor(root)
    root.mainloop()