import tkinter as tk
import math
import random
import time


class WheelOfFortune:
    def __init__(self, root):
        self.root = root
        self.root.title("🎡 转盘抽奖")
        self.root.configure(bg="#1e2b3a")
        self.root.resizable(False, False)

        # ----- 奖品配置 -----
        self.segments = [
            {"label": "100元", "color": "#e74c3c"},
            {"label": "谢谢参与", "color": "#3498db"},
            {"label": "手机", "color": "#2ecc71"},
            {"label": "奶茶", "color": "#f1c40f"},
            {"label": "电影票", "color": "#9b59b6"},
            {"label": "玩偶", "color": "#e67e22"},
            {"label": "书籍", "color": "#1abc9c"},
            {"label": "咖啡", "color": "#e84393"},
        ]
        self.seg_count = len(self.segments)
        self.angle_per_seg = 360 / self.seg_count

        # ----- 状态 -----
        self.current_angle = 0          # 当前旋转角度(度)
        self.is_spinning = False
        self.animation_id = None

        # ----- 界面 -----
        self.build_ui()
        self.draw_wheel()

    def build_ui(self):
        # 标题
        title = tk.Label(
            self.root, text="🎲 转盘抽奖",
            font=("Microsoft YaHei", 22, "bold"),
            fg="#f9d56e", bg="#1e2b3a"
        )
        title.pack(pady=(15, 5))

        # 转盘画布
        self.canvas_size = 520
        self.canvas = tk.Canvas(
            self.root, width=self.canvas_size, height=self.canvas_size,
            bg="#0f1a26", highlightthickness=0
        )
        self.canvas.pack(padx=20, pady=10)

        # 底部控制区
        frame = tk.Frame(self.root, bg="#1e2b3a")
        frame.pack(pady=(0, 20))

        # 结果框
        self.result_var = tk.StringVar(value="点击抽奖开始")
        self.result_label = tk.Label(
            frame, textvariable=self.result_var,
            font=("Microsoft YaHei", 14, "bold"),
            fg="#ffdf8c", bg="#0b141e",
            width=18, height=2, relief="flat",
            bd=0, highlightbackground="#ffd966",
            highlightthickness=2
        )
        self.result_label.pack(side=tk.LEFT, padx=(0, 15))

        # 抽奖按钮
        self.spin_btn = tk.Button(
            frame, text="GO 抽奖", command=self.spin,
            font=("Microsoft YaHei", 14, "bold"),
            bg="#c99b1e", fg="#2c1e0a",
            activebackground="#f9d56e",
            relief="raised", bd=4,
            width=10, cursor="hand2"
        )
        self.spin_btn.pack(side=tk.LEFT, padx=5)

        # 重置按钮
        reset_btn = tk.Button(
            frame, text="↺ 重置", command=self.reset,
            font=("Microsoft YaHei", 12, "bold"),
            bg="#2a3b4c", fg="#d9e2ef",
            activebackground="#31516b",
            relief="raised", bd=4,
            width=8, cursor="hand2"
        )
        reset_btn.pack(side=tk.LEFT, padx=5)

    # ----- 绘制转盘 -----
    def draw_wheel(self):
        self.canvas.delete("all")
        cx = cy = self.canvas_size / 2
        radius = 220
        angle_rad = math.radians(self.current_angle)

        for i, seg in enumerate(self.segments):
            start = i * self.angle_per_seg + self.current_angle
            extent = self.angle_per_seg

            # 画扇形
            self.canvas.create_arc(
                cx - radius, cy - radius, cx + radius, cy + radius,
                start=start, extent=extent,
                fill=seg["color"], outline="#ffffff",
                width=2
            )

            # 画文字
            mid_angle = math.radians(start + extent / 2)
            text_r = radius * 0.68
            tx = cx + text_r * math.cos(mid_angle)
            ty = cy - text_r * math.sin(mid_angle)  # 屏幕Y向下，取反

            self.canvas.create_text(
                tx, ty, text=seg["label"],
                fill="#fff9e6",
                font=("Microsoft YaHei", 13, "bold")
            )

        # 中心圆
        self.canvas.create_oval(
            cx - 45, cy - 45, cx + 45, cy + 45,
            fill="#1a2632", outline="#f9d56e", width=5
        )

        # 指针 (正上方，三角形指向圆心)
        pointer_x = cx
        pointer_y = cy - radius - 10
        self.canvas.create_polygon(
            pointer_x - 18, pointer_y - 25,
            pointer_x + 18, pointer_y - 25,
            pointer_x, pointer_y + 20,
            fill="#f9d56e", outline="#c99b1e", width=2
        )

        # 中心圆上画 "GO"
        self.canvas.create_text(
            cx, cy, text="GO",
            fill="#f9d56e", font=("Microsoft YaHei", 18, "bold")
        )

    # ----- 开始旋转 -----
    def spin(self):
        if self.is_spinning:
            return
        self.is_spinning = True
        self.spin_btn.config(state="disabled", bg="#888888")
        self.result_var.set("🎲 抽奖中...")
        self.result_label.config(fg="#ffdf8c", bg="#0b141e")

        # 随机终点角度: 至少转 5 圈 + 随机偏移
        base_turns = random.randint(5, 8)
        extra = random.uniform(0, 360)
        start_angle = self.current_angle % 360
        total_rotation = base_turns * 360 + extra
        end_angle = start_angle + total_rotation

        duration_ms = random.randint(3000, 3800)
        start_time = time.time()

        def animate():
            elapsed_ms = (time.time() - start_time) * 1000
            progress = min(elapsed_ms / duration_ms, 1.0)

            # easeOutCubic 缓动
            eased = 1 - (1 - progress) ** 3
            current = start_angle + total_rotation * eased
            self.current_angle = current % 360
            self.draw_wheel()

            if progress < 1.0:
                self.animation_id = self.root.after(16, animate)
            else:
                # 动画结束
                self.current_angle = end_angle % 360
                self.draw_wheel()
                self.is_spinning = False
                self.spin_btn.config(state="normal", bg="#c99b1e")
                self.animation_id = None
                self.show_result()

        animate()

    # ----- 根据指针方向计算奖品 -----
    def get_prize(self):
        # 指针在正上方 (90度方向 in 屏幕坐标，但按数学极角算)
        # 转盘上每个扇区起始角 = i * angle_per_seg + current_angle
        # 指针方向 (极角) = 90 度 (正上方, 数学角度)
        # 需要找出哪个扇区覆盖了 90 度
        pointer_angle = 90  # 数学角度，从正右逆时针
        # 计算相对于转盘起点的角度差
        relative = (pointer_angle - self.current_angle) % 360
        # 扇区索引 (注意扇区按极角逆时针排列，但绘制时arc的start从3点钟逆时针)
        # tkinter的arc: 0度在3点钟，逆时针增加
        # 我们的扇区i 起始角 = i*angle_per_seg + current_angle, 占用 angle_per_seg 度
        index = int(relative // self.angle_per_seg) % self.seg_count
        return self.segments[index]

    def show_result(self):
        prize = self.get_prize()
        self.result_var.set(f"🎉 {prize['label']}")
        if "谢谢" in prize["label"]:
            self.result_label.config(fg="#ffdf8c", bg="#0b141e")
        else:
            self.result_label.config(fg="#fcee8f", bg="#1e331f")

    # ----- 重置 -----
    def reset(self):
        if self.animation_id is not None:
            self.root.after_cancel(self.animation_id)
            self.animation_id = None
        self.is_spinning = False
        self.current_angle = 0
        self.draw_wheel()
        self.result_var.set("点击抽奖开始")
        self.result_label.config(fg="#ffdf8c", bg="#0b141e")
        self.spin_btn.config(state="normal", bg="#c99b1e")


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