import tkinter as tk
import math
import random

WIDTH, HEIGHT = 500, 550
CX, CY = WIDTH // 2, HEIGHT // 2 - 20
RADIUS = 180

class WheelApp:
    def __init__(self, root):
        self.root = root
        self.root.title("030. 转盘抽奖")
        self.root.geometry(f"{WIDTH}x{HEIGHT}")
        self.root.resizable(False, False)

        # ===== 奖品配置（名称 + 颜色 + 概率权重）=====
        self.prizes = [
            ("一等奖", "#FF4444", 1),
            ("二等奖", "#FF8800", 2),
            ("三等奖", "#FFD700", 3),
            ("四等奖", "#4CAF50", 4),
            ("五等奖", "#2196F3", 5),
            ("谢谢参与", "#9E9E9E", 10),
            ("幸运奖", "#9C27B0", 3),
            ("阳光普照", "#00BCD4", 5),
        ]

        self.total_weight = sum(p[2] for p in self.prizes)
        self.angle_per_item = 360 / len(self.prizes)

        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="#f5f5f5")
        self.canvas.pack()

        self.wheel_angle = 0
        self.running = False
        self.speed = 0

        self.draw_wheel()
        self.draw_pointer()
        self.draw_controls()
        self.draw_info()

    # ========== 绘制转盘 ==========
    def draw_wheel(self):
        self.canvas.delete("wheel")

        for i, (name, color, _) in enumerate(self.prizes):
            start_angle = self.wheel_angle + i * self.angle_per_item
            extent = self.angle_per_item

            # 扇形
            self.canvas.create_arc(
                CX - RADIUS, CY - RADIUS,
                CX + RADIUS, CY + RADIUS,
                start=start_angle, extent=extent,
                fill=color, outline="white", width=2, tags="wheel"
            )

            # 文字
            text_angle = math.radians(start_angle + extent / 2)
            tx = CX + (RADIUS - 50) * math.cos(text_angle)
            ty = CY + (RADIUS - 50) * math.sin(text_angle)

            self.canvas.create_text(
                tx, ty, text=name,
                fill="white", font=("微软雅黑", 10, "bold"),
                tags="wheel"
            )

        # 中心圆
        self.canvas.create_oval(
            CX - 20, CY - 20, CX + 20, CY + 20,
            fill="#333", outline="white", width=3, tags="wheel"
        )

    # ========== 绘制指针 ==========
    def draw_pointer(self):
        self.canvas.delete("pointer")
        points = [
            CX, CY - RADIUS - 10,
            CX - 10, CY - RADIUS + 20,
            CX + 10, CY - RADIUS + 20
        ]
        self.canvas.create_polygon(
            points, fill="#FF5722", outline="white", width=2, tags="pointer"
        )

    # ========== 控制按钮 ==========
    def draw_controls(self):
        self.start_btn = tk.Button(
            self.root, text="🎯 开始抽奖",
            width=15, height=2,
            font=("微软雅黑", 12, "bold"),
            bg="#4CAF50", fg="white",
            command=self.start_spin
        )
        self.start_btn.place(x=CX - 70, y=CY + RADIUS + 20)

        tk.Button(
            self.root, text="重置",
            width=8, bg="#FF9800", fg="white",
            command=self.reset
        ).place(x=CX + 80, y=CY + RADIUS + 30)

    # ========== 信息显示 ==========
    def draw_info(self):
        self.result_label = tk.Label(
            self.root, text="点击“开始抽奖”试试手气！",
            font=("微软雅黑", 11), fg="#333", bg="#f5f5f5"
        )
        self.result_label.place(x=CX - 100, y=CY + RADIUS + 80)

    # ========== 抽奖逻辑 ==========
    def pick_prize(self):
        """根据权重随机选择奖品"""
        r = random.uniform(0, self.total_weight)
        cum = 0
        for i, (_, _, weight) in enumerate(self.prizes):
            cum += weight
            if r <= cum:
                return i
        return 0

    def start_spin(self):
        if self.running:
            return

        self.running = True
        self.start_btn.config(state="disabled")
        self.result_label.config(text="转盘旋转中...")

        self.target_index = self.pick_prize()
        target_angle = 360 - self.target_index * self.angle_per_item - self.angle_per_item / 2
        target_angle += 360 * 5  # 至少转5圈

        self.speed = 20
        self.decay = self.speed / 200
        self.final_angle = target_angle
        self.spinning()

    def spinning(self):
        if self.speed > 0.1:
            self.wheel_angle += self.speed
            self.wheel_angle %= 360
            self.speed -= self.decay
            self.draw_wheel()
            self.root.after(20, self.spinning)
        else:
            self.running = False
            self.start_btn.config(state="normal")
            name, color, _ = self.prizes[self.target_index]
            self.result_label.config(
                text=f"🎉 恭喜抽中：【{name}】",
                fg=color
            )
            self.show_popup(name, color)

    def show_popup(self, name, color):
        popup = tk.Toplevel(self.root)
        popup.title("中奖结果")
        popup.geometry("300x150")
        popup.resizable(False, False)
        popup.configure(bg="#f5f5f5")

        tk.Label(
            popup, text="🎊 中奖啦！🎊",
            font=("微软雅黑", 14, "bold"),
            bg="#f5f5f5", fg="#333"
        ).pack(pady=15)

        tk.Label(
            popup, text=f"【{name}】",
            font=("微软雅黑", 18, "bold"),
            bg="#f5f5f5", fg=color
        ).pack(pady=10)

        tk.Button(
            popup, text="确定", width=10,
            command=popup.destroy
        ).pack(pady=10)

    def reset(self):
        self.wheel_angle = 0
        self.running = False
        self.start_btn.config(state="normal")
        self.result_label.config(text="点击“开始抽奖”试试手气！")
        self.draw_wheel()


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