# -*- coding: utf-8 -*-
"""
带界面的抽签/随机点名器
运行环境: Python 3.x (Tkinter 内置)
"""

import tkinter as tk
from tkinter import messagebox, font
import random


class RandomPickerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("🎲 抽签 · 随机点名器")
        self.root.geometry("720x620")
        self.root.minsize(600, 560)
        self.root.configure(bg="#1e2b3c")

        # ---------- 默认名单 ----------
        self.default_names = ["陈小明", "李丽", "王浩", "张雅",
                              "赵岩", "刘婷婷", "周泽", "吴悦"]
        self.members = list(self.default_names)
        self.selected_index = None       # 当前高亮索引
        self.rolling = False             # 是否正在滚动
        self.roll_after_id = None        # 滚动动画 after 的 id

        # ---------- 字体 ----------
        self.title_font = font.Font(family="Microsoft YaHei", size=20, weight="bold")
        self.name_font = font.Font(family="Microsoft YaHei", size=42, weight="bold")
        self.normal_font = font.Font(family="Microsoft YaHei", size=11)
        self.tag_font = font.Font(family="Microsoft YaHei", size=11)
        self.btn_font = font.Font(family="Microsoft YaHei", size=12, weight="bold")

        # ---------- 构建界面 ----------
        self._build_ui()
        self.refresh_name_list()

    # ---------------- UI 构建 ----------------
    def _build_ui(self):
        # 标题
        title_frame = tk.Frame(self.root, bg="#1e2b3c")
        title_frame.pack(pady=(16, 6))
        tk.Label(title_frame, text="🎲 抽签 · 随机点名器 🎯",
                 font=self.title_font, fg="#f0eae2", bg="#1e2b3c").pack()

        # 显示区域（大名字）
        display_frame = tk.Frame(self.root, bg="#0b1219",
                                 highlightbackground="#ffd966",
                                 highlightthickness=2, bd=0)
        display_frame.pack(fill="x", padx=30, pady=(8, 16))

        self.name_label = tk.Label(display_frame, text="✨ 准备 ✨",
                                   font=self.name_font, fg="#ffecbb", bg="#0b1219",
                                   height=2, anchor="center")
        self.name_label.pack(fill="both", expand=True, padx=10, pady=10)

        # 操作按钮区
        btn_frame = tk.Frame(self.root, bg="#1e2b3c")
        btn_frame.pack(pady=(0, 12))

        self.draw_btn = tk.Button(btn_frame, text="🎲 抽一个", font=self.btn_font,
                                  bg="#ffb347", fg="#1e1a14", activebackground="#ffc670",
                                  relief="flat", padx=28, pady=10, cursor="hand2",
                                  command=self.start_draw)
        self.draw_btn.pack(side="left", padx=8)

        self.reset_btn = tk.Button(btn_frame, text="🔄 重置名单", font=self.btn_font,
                                   bg="#2e4055", fg="#cdddee", activebackground="#3e566b",
                                   activeforeground="white", relief="flat",
                                   padx=28, pady=10, cursor="hand2",
                                   command=self.reset_names)
        self.reset_btn.pack(side="left", padx=8)

        # 成员列表面板
        member_frame = tk.LabelFrame(self.root, text=" 📋 参与名单 ",
                                     font=self.normal_font,
                                     fg="#b9c9dd", bg="#1e2b3c",
                                     labelanchor="nw", bd=1, relief="solid")
        member_frame.pack(fill="both", expand=True, padx=30, pady=(0, 10))

        # 人数显示
        self.count_label = tk.Label(member_frame, text="共 0 人",
                                    font=self.normal_font, fg="#9ab3cc", bg="#1e2b3c",
                                    anchor="e")
        self.count_label.pack(fill="x", padx=8, pady=(4, 0))

        # 可滚动的名单画布（名单可能较长）
        canvas_frame = tk.Frame(member_frame, bg="#111e28")
        canvas_frame.pack(fill="both", expand=True, padx=8, pady=6)

        self.canvas = tk.Canvas(canvas_frame, bg="#111e28", highlightthickness=0, height=140)
        self.canvas.pack(side="left", fill="both", expand=True)

        scrollbar = tk.Scrollbar(canvas_frame, orient="vertical", command=self.canvas.yview)
        scrollbar.pack(side="right", fill="y")
        self.canvas.configure(yscrollcommand=scrollbar.set)

        self.tags_frame = tk.Frame(self.canvas, bg="#111e28")
        self.canvas_window = self.canvas.create_window((0, 0), window=self.tags_frame,
                                                        anchor="nw")

        self.tags_frame.bind("<Configure>",
                             lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
        self.canvas.bind("<Configure>", self._on_canvas_resize)

        # 添加成员输入区
        add_frame = tk.Frame(member_frame, bg="#1e2b3c")
        add_frame.pack(fill="x", padx=8, pady=(4, 8))

        self.name_entry = tk.Entry(add_frame, font=self.normal_font,
                                    bg="#0d1a24", fg="#e9f1fc",
                                    insertbackground="white", relief="flat", bd=4)
        self.name_entry.pack(side="left", fill="x", expand=True, padx=(0, 8))
        self.name_entry.bind("<Return>", lambda e: self.add_member())

        add_btn = tk.Button(add_frame, text="➕ 添加", font=self.normal_font,
                            bg="#3e566b", fg="#e9f1fc", activebackground="#4e7da0",
                            activeforeground="white", relief="flat", padx=16, pady=4,
                            cursor="hand2", command=self.add_member)
        add_btn.pack(side="right")

        # 底部提示
        tk.Label(self.root, text="⚡ 点击「抽一个」随机选中一人 · 重置名单恢复为默认",
                 font=self.normal_font, fg="#5a738a", bg="#1e2b3c").pack(pady=(0, 10))

    def _on_canvas_resize(self, event):
        """让 tags_frame 宽度随画布宽度变化"""
        self.canvas.itemconfig(self.canvas_window, width=event.width)

    # ---------------- 名单渲染 ----------------
    def refresh_name_list(self):
        """根据 self.members 重新渲染名单标签"""
        # 清空旧的
        for w in self.tags_frame.winfo_children():
            w.destroy()

        if not self.members:
            tk.Label(self.tags_frame, text="📭 名单为空，请添加成员",
                     font=self.normal_font, fg="#6f8aa3", bg="#111e28").pack(pady=20)
        else:
            # 使用 grid 布局，每行 4 个
            row = 0
            col = 0
            max_cols = 4
            self.tag_widgets = []
            for idx, name in enumerate(self.members):
                lbl = tk.Label(self.tags_frame, text=name, font=self.tag_font,
                               bg="#1b2b39", fg="#d4e3f5",
                               padx=14, pady=6, relief="flat", bd=0)
                lbl.grid(row=row, column=col, padx=5, pady=5, sticky="ew")
                self.tag_widgets.append(lbl)
                col += 1
                if col >= max_cols:
                    col = 0
                    row += 1
            # 让列均匀分配
            for c in range(max_cols):
                self.tags_frame.grid_columnconfigure(c, weight=1)

        self.count_label.config(text=f"共 {len(self.members)} 人")
        self.selected_index = None

    def highlight_tag(self, idx):
        """高亮指定索引的标签"""
        # 清除所有高亮
        for lbl in self.tag_widgets:
            lbl.config(bg="#1b2b39", fg="#d4e3f5")
        if idx is not None and 0 <= idx < len(self.tag_widgets):
            self.tag_widgets[idx].config(bg="#ffb347", fg="#131313")

    # ---------------- 抽签逻辑 ----------------
    def start_draw(self):
        if not self.members:
            messagebox.showinfo("提示", "名单为空，请先添加成员！")
            return
        if self.rolling:
            # 如果正在滚动，先停止重新开始
            self._stop_rolling()

        self.rolling = True
        self.selected_index = None
        # 清除所有高亮
        for lbl in self.tag_widgets:
            lbl.config(bg="#1b2b39", fg="#d4e3f5")
        # 禁用按钮，避免重复点击造成混乱（可选，也可以不禁用）
        self.draw_btn.config(state="disabled", bg="#8a7a5a")

        self.roll_count = 0
        self.max_rolls = 22
        self._roll_step()

    def _roll_step(self):
        if not self.rolling:
            return
        # 随机显示一个名字
        rand_idx = random.randint(0, len(self.members) - 1)
        self.name_label.config(text=self.members[rand_idx], fg="#fff9e6")
        self.roll_count += 1

        if self.roll_count >= self.max_rolls:
            # 结束滚动，确定最终结果
            self._finish_draw()
        else:
            self.roll_after_id = self.root.after(70, self._roll_step)

    def _finish_draw(self):
        self._stop_rolling()
        # 最终抽选
        final_idx = random.randint(0, len(self.members) - 1)
        final_name = self.members[final_idx]
        self.name_label.config(text=final_name, fg="#ffecbb")
        self.highlight_tag(final_idx)
        self.selected_index = final_idx

        self.draw_btn.config(state="normal", bg="#ffb347")

    def _stop_rolling(self):
        self.rolling = False
        if self.roll_after_id is not None:
            try:
                self.root.after_cancel(self.roll_after_id)
            except Exception:
                pass
            self.roll_after_id = None
        self.draw_btn.config(state="normal", bg="#ffb347")

    # ---------------- 名单操作 ----------------
    def reset_names(self):
        """重置为默认名单"""
        if self.rolling:
            self._stop_rolling()
        self.members = list(self.default_names)
        self.refresh_name_list()
        self.name_label.config(text="✨ 准备 ✨", fg="#ffecbb")
        self.name_entry.delete(0, tk.END)

    def add_member(self):
        """添加新成员"""
        name = self.name_entry.get().strip()
        if not name:
            self.name_entry.config(bg="#4a2020")
            self.root.after(250, lambda: self.name_entry.config(bg="#0d1a24"))
            return
        self.members.append(name)
        self.refresh_name_list()
        self.name_entry.delete(0, tk.END)
        self.name_entry.focus_set()

        # 添加后清除显示区，回到准备状态
        if not self.rolling:
            self.name_label.config(text="✨ 准备 ✨", fg="#ffecbb")


def main():
    root = tk.Tk()
    app = RandomPickerApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()