import tkinter as tk
from tkinter import ttk
import threading
import time
import winsound  # Windows 提示音（跨平台可替换）

class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("013. 定时器")
        self.root.geometry("360x320")
        self.root.resizable(False, False)

        self.running = False
        self.paused = False
        self.seconds = 0
        self.mode = "countdown"  # countdown / stopwatch / pomodoro

        self.build_ui()

    def build_ui(self):
        title = tk.Label(
            self.root, text="⏱️ 多功能定时器",
            font=("微软雅黑", 16, "bold"), pady=10
        )
        title.pack()

        # ===== 时间显示 =====
        self.time_label = tk.Label(
            self.root, text="00:00",
            font=("Consolas", 36, "bold"), fg="#1565C1"
        )
        self.time_label.pack(pady=10)

        # ===== 倒计时设置 =====
        frame_set = tk.Frame(self.root)
        frame_set.pack(pady=5)

        tk.Label(frame_set, text="分钟").pack(side=tk.LEFT, padx=2)
        self.min_spin = tk.Spinbox(frame_set, from_=0, to=59, width=4)
        self.min_spin.pack(side=tk.LEFT, padx=2)

        tk.Label(frame_set, text="秒钟").pack(side=tk.LEFT, padx=2)
        self.sec_spin = tk.Spinbox(frame_set, from_=0, to=59, width=4)
        self.sec_spin.pack(side=tk.LEFT, padx=2)

        # ===== 模式选择 =====
        mode_frame = tk.Frame(self.root)
        mode_frame.pack(pady=10)

        self.mode_var = tk.StringVar(value="countdown")
        modes = [
            ("倒计时", "countdown"),
            ("秒表", "stopwatch"),
            ("番茄钟", "pomodoro")
        ]

        for text, val in modes:
            tk.Radiobutton(
                mode_frame, text=text,
                variable=self.mode_var, value=val,
                command=self.change_mode
            ).pack(side=tk.LEFT, padx=8)

        # ===== 控制按钮 =====
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=15)

        self.start_btn = tk.Button(
            btn_frame, text="开始", width=10,
            bg="#4CAF50", fg="white",
            command=self.start
        )
        self.start_btn.pack(side=tk.LEFT, padx=5)

        self.pause_btn = tk.Button(
            btn_frame, text="暂停", width=10,
            bg="#FF9800", fg="white",
            command=self.toggle_pause
        )
        self.pause_btn.pack(side=tk.LEFT, padx=5)

        self.reset_btn = tk.Button(
            btn_frame, text="重置", width=10,
            bg="#f44336", fg="white",
            command=self.reset
        )
        self.reset_btn.pack(side=tk.LEFT, padx=5)

        self.change_mode()

    def change_mode(self):
        self.mode = self.mode_var.get()
        self.reset()
        if self.mode == "pomodoro":
            self.min_spin.set(25)
            self.sec_spin.set(0)
            self.min_spin.config(state="disabled")
            self.sec_spin.config(state="disabled")
        else:
            self.min_spin.config(state="normal")
            self.sec_spin.config(state="normal")

    def start(self):
        if self.running:
            return
        self.running = True
        self.paused = False
        self.pause_btn.config(text="暂停")

        if self.mode == "countdown":
            m = int(self.min_spin.get())
            s = int(self.sec_spin.get())
            self.seconds = m * 60 + s
        elif self.mode == "stopwatch":
            self.seconds = 0
        elif self.mode == "pomodoro":
            self.seconds = 25 * 60

        threading.Thread(target=self.run_timer, daemon=True).start()

    def run_timer(self):
        while self.running:
            if not self.paused:
                if self.mode in ["countdown", "pomodoro"]:
                    if self.seconds <= 0:
                        self.finish()
                        break
                    self.seconds -= 1
                else:  # stopwatch
                    self.seconds += 1

                self.update_display()
            time.sleep(1)
        self.running = False

    def update_display(self):
        m, s = divmod(self.seconds, 60)
        self.time_label.config(text=f"{m:02d}:{s:02d}")

    def finish(self):
        self.running = False
        self.time_label.config(text="时间到！")
        winsound.MessageBeep(winsound.MB_ICONEXCLAMATION)
        tk.messagebox.showinfo("提示", "⏰ 时间到！")

    def toggle_pause(self):
        if not self.running:
            return
        self.paused = not self.paused
        self.pause_btn.config(text="继续" if self.paused else "暂停")

    def reset(self):
        self.running = False
        self.paused = False
        self.seconds = 0
        self.update_display()
        self.pause_btn.config(text="暂停")


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