import tkinter as tk
from tkinter import filedialog, messagebox
import random
import time
import threading

class NamePicker:
    def __init__(self, root):
        self.root = root
        self.root.title("031. 抽签 / 随机点名器")
        self.root.geometry("580x520")
        self.root.resizable(False, False)

        # 数据
        self.names = []
        self.remaining = []
        self.history = []
        self.running = False

        self.build_ui()

    # ========== UI ==========
    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="🎰 随机点名器",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # ===== 上半：点名区 =====
        top = tk.Frame(self.root)
        top.pack(pady=5, padx=20, fill=tk.X)

        # 名字显示区（大框）
        self.name_frame = tk.LabelFrame(top, text="被点到的名字", font=("微软雅黑", 10))
        self.name_frame.pack(fill=tk.X, pady=5)

        self.name_label = tk.Label(
            self.name_frame, text="等待点名...",
            font=("微软雅黑", 36, "bold"), fg="#1565C0"
        )
        self.name_label.pack(pady=15)

        # 统计
        self.stat_label = tk.Label(
            self.name_frame, text="共 0 人 | 已点 0 人 | 剩余 0 人",
            font=("微软雅黑", 9), fg="#666"
        )
        self.stat_label.pack(pady=2)

        # 按钮区
        btn_frame = tk.Frame(top)
        btn_frame.pack(pady=8)

        self.start_btn = tk.Button(
            btn_frame, text="🎲 开始点名",
            width=14, height=2,
            font=("微软雅黑", 11, "bold"),
            bg="#4CAF50", fg="white",
            command=self.start_pick
        )
        self.start_btn.pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="📋 重置名单",
            width=14, height=2,
            font=("微软雅黑", 11),
            bg="#FF9800", fg="white",
            command=self.reset_list
        ).pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="🗑️ 清空历史",
            width=14, height=2,
            font=("微软雅黑", 11),
            bg="#f44336", fg="white",
            command=self.clear_history
        ).pack(side=tk.LEFT, padx=8)

        # ===== 下半：名单管理 =====
        bottom = tk.Frame(self.root)
        bottom.pack(pady=5, padx=20, fill=tk.BOTH, expand=True)

        # 左侧：名单
        left = tk.LabelFrame(bottom, text="名单列表", font=("微软雅黑", 10))
        left.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 5))

        self.listbox = tk.Listbox(left, font=("Consolas", 10), height=12)
        self.listbox.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        # 名单操作按钮
        list_btn = tk.Frame(left)
        list_btn.pack(pady=3)

        tk.Button(list_btn, text="添加", width=8, command=self.add_name).pack(side=tk.LEFT, padx=2)
        tk.Button(list_btn, text="删除选中", width=8, command=self.remove_name).pack(side=tk.LEFT, padx=2)
        tk.Button(list_btn, text="导入TXT", width=8, command=self.import_file).pack(side=tk.LEFT, padx=2)

        # 右侧：历史
        right = tk.LabelFrame(bottom, text="点名历史", font=("微软雅黑", 10))
        right.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(5, 0))

        self.history_list = tk.Listbox(right, font=("Consolas", 10), height=12)
        self.history_list.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        # 底部：快速添加
        add_frame = tk.Frame(self.root)
        add_frame.pack(pady=5, padx=20, fill=tk.X)

        tk.Label(add_frame, text="快速添加（逗号分隔）：").pack(side=tk.LEFT)
        self.add_entry = tk.Entry(add_frame, font=("微软雅黑", 10))
        self.add_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
        self.add_entry.bind("<Return>", lambda e: self.add_name())

        tk.Button(
            add_frame, text="添加",
            command=self.add_name
        ).pack(side=tk.LEFT)

        # 菜单
        menubar = tk.Menu(self.root)
        self.root.config(menu=menubar)
        file_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="文件", menu=file_menu)
        file_menu.add_command(label="导入名单", command=self.import_file)
        file_menu.add_command(label="导出名单", command=self.export_file)
        file_menu.add_separator()
        file_menu.add_command(label="退出", command=self.root.quit)

        # 预填示例
        self.add_entry.insert(0, "张三,李四,王五,赵六,钱七,孙八,周九,吴十")

    # ========== 核心逻辑 ==========
    def start_pick(self):
        if self.running:
            return
        if not self.names:
            messagebox.showwarning("提示", "名单为空，请先添加名字！")
            return

        if not self.remaining:
            if messagebox.askyesno("提示", "所有人都已被点过，是否重新开始一轮？"):
                self.remaining = list(self.names)
                self.history.clear()
                self.history_list.delete(0, tk.END)
            else:
                return

        self.running = True
        self.start_btn.config(state="disabled")
        threading.Thread(target=self.animate_pick, daemon=True).start()

    def animate_pick(self):
        """滚动动画：快 → 慢 → 停"""
        picked = random.choice(self.remaining)

        # 快速滚动阶段
        for _ in range(15):
            for _ in range(3):
                name = random.choice(self.remaining)
                self.root.after(0, lambda n=name: self.name_label.config(text=n, fg="#FF5722"))
                time.sleep(0.03)

        # 减速阶段
        for _ in range(8):
            for _ in range(2):
                name = random.choice(self.remaining)
                self.root.after(0, lambda n=name: self.name_label.config(text=n, fg="#FF9800"))
                time.sleep(0.06)

        # 再减速
        for _ in range(6):
            name = random.choice(self.remaining)
            self.root.after(0, lambda n=name: self.name_label.config(text=n, fg="#FFC107"))
            time.sleep(0.12)

        # 最终停在结果
        self.remaining.remove(picked)
        self.history.append(picked)
        self.root.after(0, lambda: self.name_label.config(text=picked, fg="#4CAF50"))
        self.root.after(0, lambda: self.finish_pick(picked))

    def finish_pick(self, name):
        self.running = False
        self.start_btn.config(state="normal")
        self.history_list.insert(tk.END, f"{len(self.history)}. {name}")
        self.history_list.see(tk.END)
        self.update_stat()

    def update_stat(self):
        total = len(self.names)
        done = len(self.history)
        left = len(self.remaining)
        self.stat_label.config(text=f"共 {total} 人 | 已点 {done} 人 | 剩余 {left} 人")

    # ========== 名单管理 ==========
    def add_name(self):
        text = self.add_entry.get().strip()
        if not text:
            return

        names = [n.strip() for n in text.split(",") if n.strip()]
        for name in names:
            if name not in self.names:
                self.names.append(name)
                self.listbox.insert(tk.END, name)

        self.remaining = list(self.names)
        self.add_entry.delete(0, tk.END)
        self.update_stat()

    def remove_name(self):
        sel = self.listbox.curselection()
        if not sel:
            return
        idx = sel[0]
        name = self.names.pop(idx)
        self.listbox.delete(idx)
        if name in self.remaining:
            self.remaining.remove(name)
        self.update_stat()

    def reset_list(self):
        if not self.names:
            return
        if messagebox.askyesno("确认", "重置后将从头开始新一轮点名？"):
            self.remaining = list(self.names)
            self.history.clear()
            self.history_list.delete(0, tk.END)
            self.name_label.config(text="等待点名...", fg="#1565C0")
            self.update_stat()

    def clear_history(self):
        self.history.clear()
        self.history_list.delete(0, tk.END)
        self.remaining = list(self.names)
        self.name_label.config(text="等待点名...", fg="#1565C0")
        self.update_stat()

    def import_file(self):
        path = filedialog.askopenfilename(
            title="选择名单文件",
            filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
        )
        if not path:
            return
        try:
            with open(path, "r", encoding="utf-8") as f:
                for line in f:
                    names = [n.strip() for n in line.strip().split(",")]
                    for name in names:
                        if name and name not in self.names:
                            self.names.append(name)
                            self.listbox.insert(tk.END, name)
            self.remaining = list(self.names)
            self.update_stat()
            messagebox.showinfo("成功", f"已导入名单！共 {len(self.names)} 人")
        except Exception as e:
            messagebox.showerror("错误", f"导入失败：{e}")

    def export_file(self):
        if not self.names:
            messagebox.showwarning("提示", "名单为空！")
            return
        path = filedialog.asksaveasfilename(
            title="保存名单",
            defaultextension=".txt",
            filetypes=[("文本文件", "*.txt")]
        )
        if not path:
            return
        with open(path, "w", encoding="utf-8") as f:
            f.write("\n".join(self.names))
        messagebox.showinfo("成功", "名单已保存！")


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