import tkinter as tk
from tkinter import messagebox, ttk
import winsound
import time
import random


class CoolTimer(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("特色大屏计时器（多铃声版）")
        self.geometry("800x500")
        self.resizable(0, 0)
        self.configure(bg="#1e1e2f")

        # 状态变量
        self.running = False
        self.paused = False
        self.elapsed = 0  # 已流逝的秒数（替代原来的total）

        # 铃声配置（多种预设铃声）
        self.ringtone_types = {
            "经典蜂鸣音": {"start": 1000, "pause": 600, "reset": 400, "countdown": 1500, "end": [2000, 1500, 2000]},
            "轻快提示音": {"start": 1200, "pause": 800, "reset": 500, "countdown": 1800, "end": [1800, 1400, 1800]},
            "沉稳低音音": {"start": 800, "pause": 500, "reset": 300, "countdown": 1200, "end": [1500, 1000, 1500]},
            "随机趣味音": {"start": None, "pause": None, "reset": None, "countdown": None, "end": None},
            "静音模式": {"start": 0, "pause": 0, "reset": 0, "countdown": 0, "end": [0, 0, 0]}
        }
        self.current_ringtone = tk.StringVar(value="经典蜂鸣音")

        # ========== 大屏时间显示 ==========
        self.lbl_time = tk.Label(
            self,
            text="00:00:00",
            font=("Impact", 80),
            bg="#1e1e2f",
            fg="#00ffcc"
        )
        self.lbl_time.pack(pady=20)

        # ========== 铃声选择区 ==========
        ring_frame = tk.Frame(self, bg="#1e1e2f")
        ring_frame.pack(pady=10)

        tk.Label(
            ring_frame,
            text="选择铃声：",
            font=("Microsoft YaHei", 14),
            bg="#1e1e2f",
            fg="white"
        ).grid(row=0, column=0, padx=10)

        # 下拉选择框
        self.ring_combobox = ttk.Combobox(
            ring_frame,
            textvariable=self.current_ringtone,
            values=list(self.ringtone_types.keys()),
            font=("Microsoft YaHei", 12),
            state="readonly",
            width=15
        )
        self.ring_combobox.grid(row=0, column=1, padx=10)

        # 试听按钮
        self.test_btn = tk.Button(
            ring_frame,
            text="试听结束铃声",
            font=("Microsoft YaHei", 12),
            bg="#3a3f5c",
            fg="white",
            relief="flat",
            command=self.test_ringtone
        )
        self.test_btn.grid(row=0, column=2, padx=10)

        # ========== 功能按钮区 ==========
        btn_frame = tk.Frame(self, bg="#1e1e2f")
        btn_frame.pack(pady=50)  # 增加间距，去掉时分秒选择器后调整布局

        # 按钮样式
        btn_style = {
            "font": ("Microsoft YaHei", 16, "bold"),
            "width": 8,
            "relief": "flat",
            "fg": "white"
        }

        # 开始按钮
        self.btn_start = tk.Button(
            btn_frame,
            text="开始",
            bg="#00c853",
            **btn_style,
            command=self.start
        )
        self.btn_start.grid(row=0, column=0, padx=12)

        # 暂停按钮
        self.btn_pause = tk.Button(
            btn_frame,
            text="暂停",
            bg="#ffab00",
            **btn_style,
            command=self.pause
        )
        self.btn_pause.grid(row=0, column=1, padx=12)

        # 重置按钮
        self.btn_reset = tk.Button(
            btn_frame,
            text="重置",
            bg="#d50000",
            **btn_style,
            command=self.reset
        )
        self.btn_reset.grid(row=0, column=2, padx=12)

    def get_ringtone_freq(self, sound_type):
        """获取当前选择铃声的频率"""
        ringtone = self.ringtone_types[self.current_ringtone.get()]
        freq = ringtone[sound_type]

        # 随机趣味音处理
        if freq is None:
            if sound_type == "end":
                return [random.randint(1000, 2000) for _ in range(3)]
            else:
                return random.randint(500, 2000)

        return freq

    def play_sound(self, freq, duration=200):
        """播放音效（频率为0时静音）"""
        if freq == 0:
            return
        try:
            winsound.Beep(freq, duration)
        except Exception:
            pass

    def test_ringtone(self):
        """试听当前选择的结束铃声"""
        end_freqs = self.get_ringtone_freq("end")
        for freq in end_freqs:
            self.play_sound(freq, 250)
            time.sleep(0.1)

    def show_time(self, sec):
        """格式化显示时间"""
        h = sec // 3600
        m = (sec % 3600) // 60
        s = sec % 60
        self.lbl_time.config(text=f"{h:02d}:{m:02d}:{s:02d}")

    def start(self):
        """开始/继续计时"""
        if self.paused:
            # 继续计时
            freq = self.get_ringtone_freq("start")
            self.play_sound(freq, 200)
            self.paused = False
            self.running = True
            self.count()
            return

        # 首次开始计时
        self.running = True

        # 播放开始铃声
        freq = self.get_ringtone_freq("start")
        self.play_sound(freq, 200)

        self.count()

    def pause(self):
        """暂停计时"""
        if self.running:
            # 播放暂停铃声
            freq = self.get_ringtone_freq("pause")
            self.play_sound(freq, 200)

            self.running = False
            self.paused = True

    def reset(self):
        """重置计时"""
        # 播放重置铃声
        freq = self.get_ringtone_freq("reset")
        self.play_sound(freq, 200)

        self.running = False
        self.paused = False
        self.elapsed = 0
        self.lbl_time.config(text="00:00:00", fg="#00ffcc")

    def count(self):
        """计时核心逻辑（正向递增）"""
        if not self.running:
            return

        # 显示当前已流逝的时间
        self.show_time(self.elapsed)
        self.elapsed += 1

        # 每60秒（1分钟）播放一次提醒音（替代原来的最后10秒提醒）
        if self.elapsed % 60 == 0:
            self.lbl_time.config(fg="#ff3d00")
            freq = self.get_ringtone_freq("countdown")
            self.play_sound(freq, 100)
        else:
            self.lbl_time.config(fg="#00ffcc")

        # 1秒后继续计时
        self.after(1000, self.count)


if __name__ == "__main__":
    app = CoolTimer()
    app.mainloop()
